From af755115c8caea64603dcccda355290fe1efe04d Mon Sep 17 00:00:00 2001 From: gitadmin Date: Mon, 29 Sep 2025 22:43:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TELEGRAM_MESSAGING.md | 132 +++++++++++++++++++++++++++++++++++++++ send_telegram_example.py | 70 +++++++++++++++++++++ templates/index.html | 83 ++++++++++++++++++++++++ tg_mainbot.py | 81 ++++++++++++++++++++++++ 4 files changed, 366 insertions(+) create mode 100644 TELEGRAM_MESSAGING.md create mode 100644 send_telegram_example.py diff --git a/TELEGRAM_MESSAGING.md b/TELEGRAM_MESSAGING.md new file mode 100644 index 0000000..0c8df15 --- /dev/null +++ b/TELEGRAM_MESSAGING.md @@ -0,0 +1,132 @@ +# Отправка сообщений через Telegram бота + +## Описание + +В проект добавлена возможность отправки сообщений пользователям Telegram через бота по их ID. Функциональность включает: + +1. **API endpoint** для отправки сообщений из других скриптов +2. **Интерфейс в веб-приложении** для отправки сообщений через браузер +3. **Обработку ошибок** и логирование всех операций + +## Использование через веб-интерфейс + +В заголовке страницы "Управление постами VK и событиями" добавлены два поля: + +- **ID пользователя** - числовой ID пользователя в Telegram +- **Сообщение** - текст сообщения для отправки +- **Кнопка "Отправить"** - отправляет сообщение через бота + +### Особенности интерфейса: + +- Поля проверяются на заполненность перед отправкой +- ID пользователя проверяется на корректность (должен быть числом) +- Поддержка отправки по клавише Enter +- Индикатор загрузки во время отправки +- Автоматическая очистка полей после успешной отправки + +## Использование через API + +### Endpoint + +``` +POST /send_message +``` + +### Параметры запроса + +```json +{ + "user_id": 123456789, + "message": "Текст сообщения" +} +``` + +### Ответы + +**Успешная отправка (200):** +```json +{ + "success": true, + "message": "Сообщение отправлено успешно" +} +``` + +**Ошибка (400):** +```json +{ + "success": false, + "error": "Описание ошибки" +} +``` + +### Пример использования из Python + +```python +import requests + +def send_telegram_message(user_id, message): + url = "http://localhost:8443/send_message" + data = { + "user_id": user_id, + "message": message + } + + response = requests.post(url, json=data) + result = response.json() + + if result["success"]: + print("Сообщение отправлено успешно!") + else: + print(f"Ошибка: {result['error']}") +``` + +### Пример использования из командной строки + +```bash +# Используя curl +curl -X POST http://localhost:8443/send_message \ + -H "Content-Type: application/json" \ + -d '{"user_id": 123456789, "message": "Привет!"}' + +# Используя примерный скрипт +python send_telegram_example.py 123456789 "Привет! Это тестовое сообщение." +``` + +## Обработка ошибок + +Система обрабатывает следующие типы ошибок: + +1. **403 Forbidden** - Пользователь заблокировал бота или не начал с ним диалог +2. **400 Bad Request** - Неверный ID пользователя +3. **429 Too Many Requests** - Превышен лимит отправки сообщений +4. **Пустое сообщение** - Не указан текст сообщения +5. **Неверный формат ID** - user_id не является числом + +Все ошибки логируются в файл логов с указанием типа ошибки и ID пользователя. + +## Логирование + +Все операции отправки сообщений записываются в лог с указанием: + +- Времени операции +- ID пользователя +- Статуса отправки (успех/ошибка) +- Краткого описания ошибки (при наличии) + +Пример записи в логе: +``` +[2024-01-15 10:30:45] [TG_bot] ИНФО: Сообщение отправлено: Привет! Это тестовое сообщение... (Пользователь user_123456789) +``` + +## Требования + +- Telegram бот должен быть запущен и подключен через webhook +- Пользователь должен начать диалог с ботом (отправить команду /start) +- Пользователь не должен заблокировать бота + +## Безопасность + +- API endpoint доступен только для POST запросов +- Проверка корректности входных данных +- Логирование всех попыток отправки для аудита +- Обработка ошибок без раскрытия внутренней информации системы diff --git a/send_telegram_example.py b/send_telegram_example.py new file mode 100644 index 0000000..f4567c2 --- /dev/null +++ b/send_telegram_example.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +""" +Пример скрипта для отправки сообщений через Telegram бота +Использование: python send_telegram_example.py +""" + +import sys +import requests +import json + +def send_message(user_id, message_text, bot_url="http://localhost:8443"): + """ + Отправляет сообщение пользователю через Telegram бота + + Args: + user_id (int): ID пользователя в Telegram + message_text (str): Текст сообщения + bot_url (str): URL бота (по умолчанию localhost:8443) + + Returns: + tuple: (success: bool, message: str) + """ + try: + url = f"{bot_url}/send_message" + data = { + "user_id": user_id, + "message": message_text + } + + response = requests.post(url, json=data, timeout=10) + result = response.json() + + if response.status_code == 200 and result.get("success"): + return True, result.get("message", "Сообщение отправлено успешно") + else: + return False, result.get("error", "Неизвестная ошибка") + + except requests.exceptions.RequestException as e: + return False, f"Ошибка сети: {e}" + except json.JSONDecodeError as e: + return False, f"Ошибка парсинга ответа: {e}" + except Exception as e: + return False, f"Неожиданная ошибка: {e}" + +def main(): + if len(sys.argv) != 3: + print("Использование: python send_telegram_example.py ") + print("Пример: python send_telegram_example.py 123456789 'Привет! Это тестовое сообщение.'") + sys.exit(1) + + try: + user_id = int(sys.argv[1]) + except ValueError: + print("Ошибка: user_id должен быть числом") + sys.exit(1) + + message_text = sys.argv[2] + + print(f"Отправка сообщения пользователю {user_id}: {message_text}") + + success, result_message = send_message(user_id, message_text) + + if success: + print(f"✅ {result_message}") + else: + print(f"❌ {result_message}") + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/templates/index.html b/templates/index.html index e7f9948..3efa2e9 100644 --- a/templates/index.html +++ b/templates/index.html @@ -388,6 +388,18 @@