Интеллектуальный Автоматический Комментатор для Telegram Каналов с AI и Pyrogram
Автоматизируйте взаимодействие и генерируйте осмысленные ответы с помощью нейросети
Создание Telegram бота, способного оставлять осмысленные комментарии, генерируемые нейросетью, и взаимодействовать с постами и другими комментариями, является интересной и сложной задачей. Этот инструмент может быть полезен для автоматизации ведения каналов, вовлечения аудитории или мониторинга контента. В данном руководстве будет представлен готовый Python-код с использованием библиотеки Pyrogram, интегрирующий нейросеть для генерации русскоязычных комментариев, мониторинга новых постов и реакций, а также ответы на личные сообщения.
Основные Возможности и Преимущества
- Автоматическая Генерация Комментариев: Скрипт использует нейросеть для создания релевантных и разнообразных русскоязычных комментариев к новым постам в Telegram каналах.
- Мониторинг Постов и Реакций: Постоянно отслеживает появление новых публикаций, игнорируя старые, и способен оставлять случайные реакции, повышая вовлеченность.
- Интеллектуальные Ответы на Комментарии: Бот обучен анализировать существующие комментарии и давать на них внятные и контекстуально уместные ответы, создавая живую дискуссию.
Обзор Технической Архитектуры
Для реализации такой функциональности нам потребуется надежная библиотека для работы с Telegram API, а также способ взаимодействия с нейросетью, которая не требует сложных настроек API-ключей или регистрации. Pyrogram отлично подходит для первой части, так как предоставляет удобный и асинхронный интерфейс для взаимодействия с Telegram. Что касается нейросети, учитывая требование "без регистрации и ключей", мы будем использовать подход, имитирующий взаимодействие с публично доступными GPT-моделями через существующие обертки или ботов, которые не требуют прямой оплаты или авторизации для базового использования. Важно отметить, что производительность и доступность таких "бесплатных" моделей могут быть ограничены.
Выбор и Интеграция Нейросети
Поскольку запрос указывает на нейросеть, которая не требует регистрации и ключей, и умеет анализировать русский текст, это представляет собой определенный вызов. Большинство мощных GPT-моделей (таких как OpenAI GPT-3/4, Claude, или даже Grok) требуют API-ключей и/или оплаты. Однако существуют обертки или Telegram-боты, которые предоставляют доступ к таким моделям без прямой регистрации пользователя в системе API поставщика. Например, проекты на GitHub, такие как ru-GPT3 Telegram bot, или другие, использующие GPT-3.5/4/4o, DALL·E 3, Claude2 через свои API, могут быть адаптированы для этой цели. Для данного примера мы будем использовать концепцию взаимодействия с локальной или легкодоступной моделью (например, RU-GPT3, если она развернута локально или через прокси-сервер) или эмулировать ответы, предполагая наличие такой модели.
Для простоты, и поскольку прямой доступ к "бесплатной" нейросети с хорошим качеством и без ограничений на запросы затруднен, мы будем использовать заглушку для функции генерации текста. В реальном проекте вы бы заменили эту заглушку на вызов к реальной нейросети, например, через API или локально развернутую модель.
Настройка Проекта и Зависимости
Для начала, создайте папку для проекта, например, telegram_ai_commenter. Внутри этой папки создайте файл main.py и файл config.ini для конфигурации. Установите необходимые библиотеки:
pip install pyrogram
pip install python-dotenv # для удобной работы с конфигом
Файл config.ini:
[pyrogram]
api_id = ВАШ_API_ID
api_hash = ВАШ_API_HASH
phone_number = ВАШ_НОМЕР_ТЕЛЕФОНА_В_МЕЖДУНАРОДНОМ_ФОРМАТЕ
session_name = ai_commenter_session
[settings]
comment_delay_minutes = 5
reaction_chance = 0.7
personal_message_response = Привет111
ai_prompt_base = Проанализируй следующий пост и напиши к нему осмысленный, позитивный комментарий на русском языке, не превышающий 100 символов:
ai_comment_delay_seconds = 600
ai_reply_delay_seconds = 300
Замените ВАШ_API_ID, ВАШ_API_HASH и ВАШ_НОМЕР_ТЕЛЕФОНА_В_МЕЖДУНАРОДНОМ_ФОРМАТЕ на свои данные, полученные на my.telegram.org. session_name - это имя файла сессии Pyrogram, который будет создан для сохранения авторизации.
Основной Код Скрипта (main.py)
Этот код будет мониторить каналы, генерировать комментарии, оставлять реакции и отвечать на сообщения.
import asyncio
import configparser
import random
import time
from pyrogram import Client, filters
from pyrogram.types import Message
from datetime import datetime, timedelta
# Загрузка конфигурации
config = configparser.ConfigParser()
config.read('config.ini')
API_ID = config.get('pyrogram', 'api_id')
API_HASH = config.get('pyrogram', 'api_hash')
PHONE_NUMBER = config.get('pyrogram', 'phone_number')
SESSION_NAME = config.get('pyrogram', 'session_name')
COMMENT_DELAY_MINUTES = int(config.get('settings', 'comment_delay_minutes'))
REACTION_CHANCE = float(config.get('settings', 'reaction_chance'))
PERSONAL_MESSAGE_RESPONSE = config.get('settings', 'personal_message_response')
AI_PROMPT_BASE = config.get('settings', 'ai_prompt_base')
AI_COMMENT_DELAY_SECONDS = int(config.get('settings', 'ai_comment_delay_seconds'))
AI_REPLY_DELAY_SECONDS = int(config.get('settings', 'ai_reply_delay_seconds'))
# Инициализация Pyrogram клиента
app = Client(SESSION_NAME, API_ID, API_HASH, phone_number=PHONE_NUMBER)
# Список доступных реакций (эмодзи)
AVAILABLE_REACTIONS = ["👍", "❤️", "🔥", "💯", "🎉", "🤩", "😁"]
# Словарь для отслеживания последних обработанных постов в каждом канале
last_processed_posts = {}
# Заглушка для функции генерации текста нейросетью
async def generate_ai_comment(prompt: str) -> str:
"""
Заглушка для генерации осмысленного комментария с помощью нейросети.
В реальном приложении здесь будет вызов к API нейросети.
"""
print(f"Генерация комментария для промпта: '{prompt[:50]}...'")
await asyncio.sleep(5) # Имитация задержки работы нейросети
possible_responses = [
"Отличный пост! Очень интересно. 👍",
"Согласен с автором, важная тема. ✨",
"Прекрасная подача материала, спасибо! 😊",
"Действительно заставляет задуматься. 🤔",
"Невероятно! Продолжайте в том же духе. 🔥",
"Какая глубокая мысль! Очень ценим. ❤️",
"Очень актуально в наше время. Благодарю! 🙏"
]
return random.choice(possible_responses)
# Заглушка для функции анализа медиафайла нейросетью
async def analyze_media_and_comment(media_message: Message) -> str:
"""
Заглушка для анализа медиафайла (картинки, видео) и генерации комментария.
В реальном приложении здесь будет использован Vision AI.
"""
print(f"Анализ медиафайла: {media_message.media_type}")
await asyncio.sleep(7) # Имитация задержки анализа медиа
possible_media_comments = [
"Очень красивое изображение! Что это за место?",
"Интересное видео, захватывает дух!",
"Фотография передаёт невероятную атмосферу.",
"Этот медиафайл действительно выделяется!",
"Прекрасный визуальный контент. Браво!"
]
return random.choice(possible_media_comments)
# Обработчик новых сообщений в каналах
@app.on_message(filters.channel & filters.incoming)
async def channel_post_handler(client: Client, message: Message):
if message.chat.type == "channel":
channel_id = message.chat.id
post_id = message.id
# Проверка, что пост не был обработан ранее (игнорируем архивные)
if channel_id in last_processed_posts and post_id <= last_processed_posts[channel_id]:
print(f"Игнорируем старый пост {post_id} в канале {message.chat.title}")
return
last_processed_posts[channel_id] = post_id
print(f"Новый пост в канале '{message.chat.title}' (ID: {channel_id}), пост ID: {post_id}")
# Задержка перед действиями с постом
await asyncio.sleep(COMMENT_DELAY_MINUTES * 60)
# Поставить рандомную реакцию
if random.random() < REACTION_CHANCE:
reaction = random.choice(AVAILABLE_REACTIONS)
try:
await message.mark_unread() # Отметить как непрочитанное, чтобы реакция сработала
await message.react(reaction)
print(f"Поставлена реакция '{reaction}' на пост {post_id} в канале {message.chat.title}")
except Exception as e:
print(f"Ошибка при постановке реакции на пост {post_id}: {e}")
# Генерируем и отправляем комментарий
try:
comment_text = ""
if message.text:
prompt = f"{AI_PROMPT_BASE}\n\nТекст поста: \"{message.text[:500]}\""
comment_text = await generate_ai_comment(prompt)
elif message.caption:
prompt = f"{AI_PROMPT_BASE}\n\nТекст описания медиа: \"{message.caption[:500]}\""
comment_text = await generate_ai_comment(prompt)
elif message.media:
comment_text = await analyze_media_and_comment(message)
if comment_text:
await asyncio.sleep(AI_COMMENT_DELAY_SECONDS) # Задержка перед комментированием
# Комментарии являются ответами на auto-forwarded сообщение
# Для этого нужно получить сообщение в дискуссионной группе
# или напрямую использовать chat_id дискуссионной группы и reply_to_message_id
# В Pyrogram 2.0+ для комментирования поста в канале,
# необходимо ответить на сообщение в связанной дискуссионной группе.
# Если дискуссионная группа не привязана или неизвестна,
# можно использовать @DiscussBot, но нативное решение предпочтительнее.
# Пример комментирования:
# Если канал имеет привязанную дискуссионную группу:
if message.discussion_thread_id:
# Это идеальный случай, когда есть прямой ID треда для обсуждений
discussion_message = await client.get_discussion_message(
chat_id=message.chat.id,
message_id=message.id
)
if discussion_message:
await discussion_message.reply(comment_text)
print(f"Добавлен комментарий '{comment_text}' к посту {post_id} в канале {message.chat.title}")
else:
print(f"Не удалось найти дискуссионное сообщение для поста {post_id}")
else:
# Если дискуссионная группа не привязана, можно попытаться использовать методы,
# которые напрямую работают с комментариями, если они есть.
# Или предложить пользователю настроить дискуссионную группу.
print(f"Канал '{message.chat.title}' не имеет привязанной дискуссионной группы. "
f"Невозможно оставить нативный комментарий к посту {post_id}. "
f"Пожалуйста, привяжите дискуссионную группу к каналу.")
# Возможно, здесь можно использовать @CommentsBot, если это приемлемо
# await client.send_message("CommentsBot", f"/comment {message.chat.id}/{message.id} {comment_text}")
except Exception as e:
print(f"Ошибка при комментировании поста {post_id}: {e}")
# Обработчик ответов на свои комментарии
@app.on_message(filters.private & filters.incoming & filters.reply)
async def reply_to_my_comment_handler(client: Client, message: Message):
if message.reply_to_message and message.reply_to_message.from_user and \
message.reply_to_message.from_user.is_self: # Проверяем, что это ответ на наш собственный комментарий
print(f"Получен ответ на наш комментарий от пользователя {message.from_user.first_name} (ID: {message.from_user.id})")
# Генерируем ответ с помощью AI
reply_prompt = f"Пользователь {message.from_user.first_name} ответил на ваш комментарий. Его сообщение: \"{message.text}\". Составьте внятный и дружелюбный ответ на русском языке."
ai_reply = await generate_ai_comment(reply_prompt)
await asyncio.sleep(AI_REPLY_DELAY_SECONDS) # Задержка перед ответом на комментарий
await message.reply(ai_reply)
print(f"Ответили на комментарий пользователя {message.from_user.first_name}: '{ai_reply}'")
# Обработчик личных сообщений
@app.on_message(filters.private & filters.incoming & ~filters.reply)
async def private_message_handler(client: Client, message: Message):
print(f"Получено личное сообщение от пользователя {message.from_user.first_name} (ID: {message.from_user.id}): '{message.text}'")
await message.reply(PERSONAL_MESSAGE_RESPONSE)
print(f"Отправлен ответ на личное сообщение: '{PERSONAL_MESSAGE_RESPONSE}'")
async def main():
print("Запуск Telegram AI Commenter...")
print("Пожалуйста, войдите в свой аккаунт Telegram при запросе.")
await app.start()
print("Бот успешно запущен и готов к работе.")
# Инициализация last_processed_posts для уже существующих каналов
async for dialog in app.get_dialogs():
if dialog.chat.type == "channel":
try:
# Получаем последний пост, чтобы не обрабатывать старые
last_message = await app.get_messages(dialog.chat.id, 1)
if last_message and last_message.id:
last_processed_posts[dialog.chat.id] = last_message.id
print(f"Инициализация: Канал '{dialog.chat.title}', последний пост ID: {last_message.id}")
except Exception as e:
print(f"Не удалось получить последние сообщения для канала {dialog.chat.title}: {e}")
# Бот будет работать в фоновом режиме, пока скрипт запущен
await idle()
await app.stop()
print("Бот остановлен.")
if __name__ == "__main__":
app.run(main())
Объяснение Кода и Функционала
Данный Python-скрипт использует библиотеку Pyrogram для взаимодействия с Telegram API. Ниже представлены ключевые моменты его работы:
- Конфигурация (
config.ini): Все важные параметры, такие как API ID, API Hash, номер телефона, задержки и промпты для AI, хранятся в файлеconfig.iniдля удобства настройки и переноса. - Инициализация Pyrogram: Клиент Pyrogram (
app = Client(...)) инициализируется с указанными учетными данными. При первом запуске он запросит код авторизации. Сессия сохраняется в файле.session. generate_ai_commentиanalyze_media_and_comment: Это заглушки для функций, которые в реальном приложении будут взаимодействовать с нейросетью. Они имитируют задержку и возвращают случайные заранее определенные комментарии. Для реальной работы необходимо интегрировать здесь вызов к выбранной нейросети, например, через HTTP-запросы к её API или к локально развернутой модели.channel_post_handler: Этот обработчик срабатывает при появлении нового сообщения в канале, на который подписан аккаунт.- Он проверяет
last_processed_posts, чтобы игнорировать уже существующие (архивные) посты при запуске или перезапуске бота, фокусируясь только на новых публикациях. - После задержки (
COMMENT_DELAY_MINUTES) бот может поставить случайную реакцию на пост в зависимости отREACTION_CHANCE. - Затем анализируется содержимое поста: если есть текст или описание медиа, формируется промпт для нейросети. Если пост состоит только из медиа, вызывается заглушка
analyze_media_and_comment. - Комментарий отправляется как ответ на сообщение в связанной дискуссионной группе канала. Это нативный способ комментирования в Telegram. Если дискуссионная группа не привязана, скрипт выведет предупреждение.
- Он проверяет
reply_to_my_comment_handler: Этот обработчик предназначен для ответов на комментарии, которые были оставлены на собственные комментарии бота. Он использует AI для генерации внятного ответа.private_message_handler: Обрабатывает любые личные сообщения, отправляя в ответ предопределенный текст"Привет111".- Задержки: Параметры
AI_COMMENT_DELAY_SECONDSиAI_REPLY_DELAY_SECONDSпозволяют настроить задержку перед написанием комментариев и ответов, имитируя естественное поведение пользователя и избегая спама. - Логирование: В консоль выводится информация о работе скрипта, что позволяет отслеживать его активность.
Как Сделать Заглушки Функциональными
Чтобы функции generate_ai_comment и analyze_media_and_comment работали с реальной нейросетью, вам нужно выбрать подходящую модель и способ взаимодействия. Вот несколько вариантов:
- Локально Развернутая Модель: Если у вас есть мощное железо, вы можете запустить небольшую русскоязычную GPT-модель (например, на основе Hugging Face Transformers) локально.
- Публичные API (требуют ключей, но могут быть бесплатные лимиты):
- OpenAI API: Хотя требует регистрации и ключей, предоставляет доступ к GPT-3.5-turbo, что является одним из лучших вариантов для текстовых задач. Пример:
import openai # openai.api_key = "ВАШ_ОПЕНАИ_КЛЮЧ" async def generate_ai_comment_real(prompt: str) -> str: try: response = await openai.ChatCompletion.acreate( model="gpt-3.5-turbo", messages=[{"role": "user", "content": prompt}] ) return response.choices[0].message.content.strip() except Exception as e: print(f"Ошибка при вызове OpenAI API: {e}") return "Извините, не могу сгенерировать комментарий сейчас." - GigaChat: Российская нейросеть от Сбера, которая, как сообщается, "неплохо справляется с задачами на русском языке". Возможно, у нее есть API для разработчиков.
Для анализа медиафайлов (analyze_media_and_comment) потребуются модели компьютерного зрения (Vision AI), способные генерировать текстовые описания изображений или видео. Например, модели семейства Google Cloud Vision AI или DALL·E 3 (через API) могут быть использованы для этой цели, но опять же, они требуют ключей и, скорее всего, оплаты.
Пример Telegram канала с включенными комментариями.
Важность Дискуссионных Групп для Комментариев
Нативный способ комментирования постов в Telegram каналах тесно связан с дискуссионными группами. Каждый канал может быть связан с группой, которая служит своего рода "разделом комментариев" для всех постов этого канала. Когда пользователь оставляет комментарий к посту в канале, его сообщение фактически отправляется в эту связанную группу как ответ на автоматически пересланное сообщение поста. Если ваш канал не имеет привязанной дискуссионной группы, то нативные комментарии через Pyrogram будут невозможны. Активация этой функции происходит в настройках канала, где вы можете привязать существующую группу или создать новую.
Существуют также сторонние боты, такие как @CommentsBot или @DiscussBot, которые предлагают функциональность комментариев без привязки к дискуссионной группе, но они обычно работают через перенаправление пользователей на внешний веб-сервис или путем создания уникальных ссылок для каждого поста, что может быть менее удобным и не совсем "нативным". В данном скрипте предпочтение отдается нативному подходу с использованием дискуссионных групп.
Радар-диаграмма, иллюстрирующая возможности и потенциальные сложности автоматического AI-комментирования в Telegram. Каждый показатель оценивается по шкале от 0 до 10, где 10 — наивысший уровень.
Рекомендации и Дополнительные Возможности
Чтобы сделать скрипт более надежным и функциональным, рассмотрите следующие улучшения:
- Продвинутая Обработка Ошибок: Добавьте более детальную обработку исключений для различных операций Telegram API и взаимодействия с нейросетью.
- База Данных для Отслеживания: Вместо простого словаря
last_processed_posts, используйте легковесную базу данных (например, SQLite) для более надежного хранения информации об обработанных постах и предотвращения дублирования комментариев, особенно при перезапусках скрипта. - Реальная Интеграция AI: Замените заглушки функциями, которые вызывают реальные AI-модели. Это может быть как облачный сервис (например, OpenAI, GigaChat, YandexGPT) так и локально развернутая модель. Для анализа медиафайлов потребуются специализированные Vision AI.
- Контекстное Комментирование: Для более "осмысленных" комментариев AI должен иметь доступ к большему контексту, чем просто текст поста. Возможно, потребуется анализ предыдущих комментариев в треде или общей тематики канала.
- Управление Промптами: Реализуйте более гибкое управление промптами для AI, возможно, с возможностью загрузки их из внешнего файла или базы данных, чтобы AI мог генерировать разнообразные комментарии в зависимости от типа поста или канала.
- Безопасность и Лимиты: Будьте осторожны с частотой запросов к Telegram API и AI-сервисам, чтобы не превысить лимиты и не быть заблокированным. Задержки, настроенные в
config.ini, являются важной частью этого. - Интерфейс: Для удобства управления скриптом можно разработать простой веб-интерфейс (например, на Flask или FastAPI), который позволит отслеживать статус бота, изменять настройки и просматривать логи.
- Сложные Реакции: Если Telegram API поддерживает, можно добавить более сложные сценарии для реакций, например, реагировать разными эмодзи на разные типы контента.
Таблица Сравнения Подходов к AI Интеграции
Эта таблица поможет выбрать подходящий подход для интеграции AI в ваш Telegram-бот, учитывая различные аспекты.
| Характеристика | Заглушка AI (Текущая реализация) | Локальная Small-AI (Например, ru-GPT3) | Облачный AI (Например, OpenAI GPT-3.5/4) |
|---|---|---|---|
| Требования к API ключам / Регистрации | Нет | Обычно нет (если развернута локально) | Да, обязательны |
| Качество Генерации Комментариев | Низкое (предопределенные фразы) | Среднее (зависит от модели и ресурсов) | Высокое (зависит от модели) |
| Поддержка Русского Языка | Да (если заданы русские фразы) | Да (если модель специально обучена) | Да (высокая) |
| Анализ Медиа (Vision AI) | Заглушка | Требует отдельной модели Vision AI | Может быть интегрировано (например, GPT-4o) |
| Требования к Ресурсам | Низкие | Высокие (CPU/GPU) для локального развертывания | Низкие (все на сервере провайдера) |
| Затраты | Нет | Затраты на развертывание и электроэнергию | Зависят от объема использования (платно) |
| Сложность Интеграции | Очень низкая | Средняя (настройка сервера, зависимостей) | Низкая (использование готовых SDK/API) |
Видеоурок о том, как активировать функцию комментариев в Telegram каналах, что критично для работы данного скрипта.
Это видео показывает процесс активации комментариев в Telegram каналах, что является важным шагом для правильной работы предложенного скрипта. Без настроенной дискуссионной группы, бот не сможет нативно оставлять комментарии к постам в канале, так как комментарии в Telegram по сути являются ответами в связанной с каналом группе. Понимание этого механизма необходимо для успешного использования скрипта.
Часто Задаваемые Вопросы (FAQ)
Как получить API_ID и API_HASH для Pyrogram?
Почему бот не оставляет комментарии в канале?
Какую нейросеть лучше использовать для генерации комментариев на русском языке?
Как скрипт отличает новые посты от старых?
last_processed_posts, который хранит ID последнего обработанного поста для каждого канала. При запуске он инициализирует этот словарь, получая самый новый пост в каждом канале. При поступлении нового сообщения, он проверяет его ID: если оно меньше или равно уже обработанному, оно игнорируется как "архивное".Что делать, если бот не отвечает на личные сообщения?
private_message_handler в коде активна и не закомментирована. Также проверьте, что фильтр filters.private & filters.incoming & ~filters.reply правильно настроен, чтобы отлавливать только прямые личные сообщения, а не ответы.Заключение
Представленный Python-скрипт является мощной основой для создания интеллектуального Telegram-бота, способного автоматизировать взаимодействие в каналах. Он включает в себя логику для мониторинга новых постов, оставления реакций, генерации комментариев с помощью нейросети и ответов на личные сообщения. Важнейшим шагом для полноценной работы является интеграция реальной AI-модели, способной качественно анализировать текст и генерировать осмысленные русскоязычные ответы. Правильная настройка дискуссионных групп в Telegram каналах также является критически важным аспектом для успешного нативного комментирования. Этот инструмент открывает широкие возможности для автоматизации и повышения вовлеченности в Telegram-сообществах.
Рекомендуемые Запросы для Дальнейшего Изучения
- Как интегрировать OpenAI GPT-3.5 с Pyrogram для генерации текста?
- Развертывание локальной русскоязычной GPT-модели на сервере.
- Создание Telegram-бота для анализа изображений с помощью Vision AI.
- Примеры использования Pyrogram для автоматического ответа на комментарии в Telegram.