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 @@