diff --git a/TELEGRAM_MESSAGING.md b/TELEGRAM_MESSAGING.md index 0c8df15..cedcc58 100644 --- a/TELEGRAM_MESSAGING.md +++ b/TELEGRAM_MESSAGING.md @@ -8,6 +8,23 @@ 2. **Интерфейс в веб-приложении** для отправки сообщений через браузер 3. **Обработку ошибок** и логирование всех операций +## Архитектура системы + +Система состоит из двух основных компонентов: + +- **Веб-интерфейс** (`db_edit.py`) - работает на порту **5006** (WEBCTRL_PORT) +- **Telegram бот** (`tg_mainbot.py`) - работает на порту **5005** (WEBHOOK_PORT) + +API endpoint `/send_message` находится в Telegram боте, поэтому все запросы должны отправляться на порт **5005**. + +### Конфигурация портов + +Порты настраиваются в файле `.env`: +- `WEBHOOK_PORT` - порт для Telegram бота (по умолчанию 5005) +- `WEBCTRL_PORT` - порт для веб-интерфейса (по умолчанию 5006) + +Веб-интерфейс автоматически читает порт бота из переменных окружения и использует его для отправки запросов. + ## Использование через веб-интерфейс В заголовке страницы "Управление постами VK и событиями" добавлены два поля: @@ -32,6 +49,13 @@ POST /send_message ``` +### Заголовки запроса + +``` +Content-Type: application/json +X-API-Secret-Token: <секретный_токен> +``` + ### Параметры запроса ```json @@ -41,6 +65,10 @@ POST /send_message } ``` +### Аутентификация + +API защищен секретным токеном, который передается в заголовке `X-API-Secret-Token`. Токен берется из переменной окружения `WEBHOOK_SECRET`. + ### Ответы **Успешная отправка (200):** @@ -65,13 +93,17 @@ POST /send_message import requests def send_telegram_message(user_id, message): - url = "http://localhost:8443/send_message" + url = "http://localhost:5005/send_message" data = { "user_id": user_id, "message": message } + headers = { + 'Content-Type': 'application/json', + 'X-API-Secret-Token': 'ваш_секретный_токен' + } - response = requests.post(url, json=data) + response = requests.post(url, json=data, headers=headers) result = response.json() if result["success"]: @@ -84,8 +116,9 @@ def send_telegram_message(user_id, message): ```bash # Используя curl -curl -X POST http://localhost:8443/send_message \ +curl -X POST http://localhost:5005/send_message \ -H "Content-Type: application/json" \ + -H "X-API-Secret-Token: ваш_секретный_токен" \ -d '{"user_id": 123456789, "message": "Привет!"}' # Используя примерный скрипт @@ -96,11 +129,12 @@ python send_telegram_example.py 123456789 "Привет! Это тестовое Система обрабатывает следующие типы ошибок: -1. **403 Forbidden** - Пользователь заблокировал бота или не начал с ним диалог -2. **400 Bad Request** - Неверный ID пользователя -3. **429 Too Many Requests** - Превышен лимит отправки сообщений -4. **Пустое сообщение** - Не указан текст сообщения -5. **Неверный формат ID** - user_id не является числом +1. **401 Unauthorized** - Неверный или отсутствующий API токен +2. **403 Forbidden** - Пользователь заблокировал бота или не начал с ним диалог +3. **400 Bad Request** - Неверный ID пользователя или отсутствующие данные +4. **429 Too Many Requests** - Превышен лимит отправки сообщений +5. **Пустое сообщение** - Не указан текст сообщения +6. **Неверный формат ID** - user_id не является числом Все ошибки логируются в файл логов с указанием типа ошибки и ID пользователя. diff --git a/db_edit.py b/db_edit.py index d28878d..0ee7b66 100644 --- a/db_edit.py +++ b/db_edit.py @@ -509,6 +509,8 @@ def load_user(user_id): @bp.before_request def before_request(): g.prefix = app.config['PREFIX'] + g.bot_port = os.getenv('WEBHOOK_PORT', '5005') + g.webhook_secret = os.getenv('WEBHOOK_SECRET') # Маршруты Blueprint @bp.route('/') diff --git a/send_telegram_example.py b/send_telegram_example.py index f4567c2..0d54131 100644 --- a/send_telegram_example.py +++ b/send_telegram_example.py @@ -7,27 +7,49 @@ import sys import requests import json +import os -def send_message(user_id, message_text, bot_url="http://localhost:8443"): +def send_message(user_id, message_text, bot_url=None, api_token=None): """ Отправляет сообщение пользователю через Telegram бота Args: user_id (int): ID пользователя в Telegram message_text (str): Текст сообщения - bot_url (str): URL бота (по умолчанию localhost:8443) + bot_url (str): URL бота (если не указан, берется из переменных окружения) + api_token (str): API токен для аутентификации (если не указан, берется из переменных окружения) Returns: tuple: (success: bool, message: str) """ + if bot_url is None: + # Пытаемся получить URL из переменных окружения + webhook_url = os.getenv('WEBHOOK_URL') + webhook_port = os.getenv('WEBHOOK_PORT', '5005') + + if webhook_url: + # Извлекаем хост из WEBHOOK_URL + from urllib.parse import urlparse + parsed = urlparse(webhook_url) + bot_url = f"http://{parsed.hostname}:{webhook_port}" + else: + bot_url = f"http://localhost:{webhook_port}" + + if api_token is None: + api_token = os.getenv('WEBHOOK_SECRET') + try: url = f"{bot_url}/send_message" data = { "user_id": user_id, "message": message_text } + headers = { + 'Content-Type': 'application/json', + 'X-API-Secret-Token': api_token + } - response = requests.post(url, json=data, timeout=10) + response = requests.post(url, json=data, headers=headers, timeout=10) result = response.json() if response.status_code == 200 and result.get("success"): diff --git a/templates/index.html b/templates/index.html index 3efa2e9..44beb49 100644 --- a/templates/index.html +++ b/templates/index.html @@ -790,7 +790,9 @@