8.3 KiB
Отправка сообщений через Telegram бота
Описание
В проект добавлена возможность отправки сообщений пользователям Telegram через бота по их ID. Функциональность включает:
- API endpoint для отправки сообщений из других скриптов
- Интерфейс в веб-приложении для отправки сообщений через браузер
- Обработку ошибок и логирование всех операций
Архитектура системы
Система состоит из двух основных компонентов:
- Веб-интерфейс (
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 и событиями" добавлены два поля:
- ID пользователя - числовой ID пользователя в Telegram
- Сообщение - текст сообщения для отправки
- Кнопка "Отправить" - отправляет сообщение через бота
Особенности интерфейса:
- Поля проверяются на заполненность перед отправкой
- ID пользователя проверяется на корректность (должен быть числом)
- Поддержка отправки по клавише Enter
- Индикатор загрузки во время отправки
- Автоматическая очистка полей после успешной отправки
Использование через API
Endpoint
POST /send_message
POST {WEBHOOK_PATH}/send_message
Где WEBHOOK_PATH - путь из переменной окружения WEBHOOK_URL (например, /testbot).
Примеры URL:
- Локально:
http://localhost:5005/send_message - Через reverse proxy:
https://bot.aabpro.ru/testbot/send_message
Заголовки запроса
Content-Type: application/json
X-API-Secret-Token: <секретный_токен>
Параметры запроса
{
"user_id": 123456789,
"message": "Текст сообщения"
}
Аутентификация
API защищен секретным токеном, который передается в заголовке X-API-Secret-Token. Токен берется из переменной окружения WEBHOOK_SECRET.
Ответы
Успешная отправка (200):
{
"success": true,
"message": "Сообщение отправлено успешно"
}
Ошибка (400):
{
"success": false,
"error": "Описание ошибки"
}
Пример использования из Python
import requests
def send_telegram_message(user_id, message):
# Используем внешний URL через reverse proxy
url = "https://bot.aabpro.ru/testbot/send_message"
data = {
"user_id": user_id,
"message": message
}
headers = {
'Content-Type': 'application/json',
'X-API-Secret-Token': 'ваш_секретный_токен'
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
if result["success"]:
print("Сообщение отправлено успешно!")
else:
print(f"Ошибка: {result['error']}")
Пример использования из командной строки
# Используя curl (через reverse proxy)
curl -X POST https://bot.aabpro.ru/testbot/send_message \
-H "Content-Type: application/json" \
-H "X-API-Secret-Token: ваш_секретный_токен" \
-d '{"user_id": 123456789, "message": "Привет!"}'
# Используя curl (локально)
curl -X POST http://localhost:5005/send_message \
-H "Content-Type: application/json" \
-H "X-API-Secret-Token: ваш_секретный_токен" \
-d '{"user_id": 123456789, "message": "Привет!"}'
# Используя примерный скрипт
python send_telegram_example.py 123456789 "Привет! Это тестовое сообщение."
Обработка ошибок
Система обрабатывает следующие типы ошибок:
HTTP ошибки:
- 401 Unauthorized - Неверный или отсутствующий API токен
- 400 Bad Request - Неверный ID пользователя или отсутствующие данные
- 500 Internal Server Error - Внутренняя ошибка сервера
Коды ошибок API:
INVALID_TOKEN- Неверный токен аутентификацииNO_DATA- Отсутствуют данные в запросеNO_USER_ID- Не указан ID пользователяNO_MESSAGE- Не указан текст сообщенияINVALID_USER_ID- user_id не является числомTELEGRAM_ERROR- Ошибка Telegram APIINTERNAL_ERROR- Внутренняя ошибка сервера
Ошибки Telegram API:
- 403 Forbidden - Пользователь заблокировал бота или не начал с ним диалог
- 400 Bad Request - Неверный ID пользователя
- 429 Too Many Requests - Превышен лимит отправки сообщений
- 404 Not Found - Пользователь не найден
Диагностика в веб-интерфейсе
Веб-интерфейс предоставляет подробную диагностику ошибок:
- Время ответа сервера
- HTTP статус код
- Код ошибки API
- Конкретные предложения по решению проблемы
- Автоматическое скрытие уведомлений
Все ошибки логируются в файл логов с указанием типа ошибки и ID пользователя.
Логирование
Все операции отправки сообщений записываются в лог с указанием:
- Времени операции
- ID пользователя
- Статуса отправки (успех/ошибка)
- Краткого описания ошибки (при наличии)
Пример записи в логе:
[2024-01-15 10:30:45] [TG_bot] ИНФО: Сообщение отправлено: Привет! Это тестовое сообщение... (Пользователь user_123456789)
Требования
- Telegram бот должен быть запущен и подключен через webhook
- Пользователь должен начать диалог с ботом (отправить команду /start)
- Пользователь не должен заблокировать бота
Безопасность
- API endpoint доступен только для POST запросов
- Проверка корректности входных данных
- Логирование всех попыток отправки для аудита
- Обработка ошибок без раскрытия внутренней информации системы