Files
Zilant2025/TELEGRAM_MESSAGING.md
T

6.6 KiB

Отправка сообщений через Telegram бота

Описание

В проект добавлена возможность отправки сообщений пользователям Telegram через бота по их ID. Функциональность включает:

  1. API endpoint для отправки сообщений из других скриптов
  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 и событиями" добавлены два поля:

  • ID пользователя - числовой ID пользователя в Telegram
  • Сообщение - текст сообщения для отправки
  • Кнопка "Отправить" - отправляет сообщение через бота

Особенности интерфейса:

  • Поля проверяются на заполненность перед отправкой
  • ID пользователя проверяется на корректность (должен быть числом)
  • Поддержка отправки по клавише Enter
  • Индикатор загрузки во время отправки
  • Автоматическая очистка полей после успешной отправки

Использование через API

Endpoint

POST /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 = "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, headers=headers)
    result = response.json()
    
    if result["success"]:
        print("Сообщение отправлено успешно!")
    else:
        print(f"Ошибка: {result['error']}")

Пример использования из командной строки

# Используя 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 "Привет! Это тестовое сообщение."

Обработка ошибок

Система обрабатывает следующие типы ошибок:

  1. 401 Unauthorized - Неверный или отсутствующий API токен
  2. 403 Forbidden - Пользователь заблокировал бота или не начал с ним диалог
  3. 400 Bad Request - Неверный ID пользователя или отсутствующие данные
  4. 429 Too Many Requests - Превышен лимит отправки сообщений
  5. Пустое сообщение - Не указан текст сообщения
  6. Неверный формат ID - user_id не является числом

Все ошибки логируются в файл логов с указанием типа ошибки и ID пользователя.

Логирование

Все операции отправки сообщений записываются в лог с указанием:

  • Времени операции
  • ID пользователя
  • Статуса отправки (успех/ошибка)
  • Краткого описания ошибки (при наличии)

Пример записи в логе:

[2024-01-15 10:30:45] [TG_bot] ИНФО: Сообщение отправлено: Привет! Это тестовое сообщение... (Пользователь user_123456789)

Требования

  • Telegram бот должен быть запущен и подключен через webhook
  • Пользователь должен начать диалог с ботом (отправить команду /start)
  • Пользователь не должен заблокировать бота

Безопасность

  • API endpoint доступен только для POST запросов
  • Проверка корректности входных данных
  • Логирование всех попыток отправки для аудита
  • Обработка ошибок без раскрытия внутренней информации системы