Как стать автором
Поиск
Написать публикацию
Обновить

Отправка поста в канал и написание комментария через Telebot python

Уровень сложностиСредний
Обсуждение Телеграм
Обсуждение Телеграм

Цель: автоматизировать процесс публикации поста в Telegram-канале и ответа на его пересланную копию в отдельном чате(обсуждении канала). Это может пригодиться для модерации, обсуждения контента или организации обратной связи. Искал информацию в интернете как сделать чтобы бот(Telebot) писал комментарии под постом, но не нашел.

Для корректной работы бота необходимо:

  • Получить ID основной группы

  • Получить ID обсуждения канала

⚠️ Обсуждение должно быть привязано к группе, иначе бот не сможет реагировать на пересланные сообщения. Чтобы убедиться, что обсуждение подключено, откройте меню канала (три точки) и проверьте наличие опции «Просмотреть обсуждение».

Для чего это нужно?

  • Чтобы сразу отправлять правила чата в обсуждение поста

  • Добавлять дополнительную информацию

  • Возможность персонализированных комментариев и многое другое

Обсуждение группы
Обсуждение группы

Вот пример кода который я сделал:

import telebot
import time

TOKEN = 'TOKEN'
GROUP_ID = -11111111
CHAT_ID = -1111111111

bot = telebot.TeleBot(TOKEN, parse_mode="HTML")

# Хранилище ID сообщения из канала
forwarded_message_id = None


def send_post_with_photo(bot, caption, photo_paths, comment):
    global forwarded_message_id

    # Первый пост в канал
    with open(photo_paths[0], 'rb') as first_photo:
        msg = bot.send_photo(GROUP_ID, first_photo, caption=caption)
        original_msg_id = msg.message_id

    print(f"Отправлено в канал. Ждём пересланное сообщение с ID {original_msg_id}...")

    # Ожидаем появления пересланного сообщения в чате
    for _ in range(30):  # 30 секунд таймаут
        updates = bot.get_updates(offset=-1)
        for update in updates:
            if update.message:
                msg = update.message
                if msg.chat.id == CHAT_ID and msg.forward_from_chat and msg.forward_from_message_id == original_msg_id:
                    forwarded_message_id = msg.message_id
                    print(f"Пересланное сообщение найдено: {forwarded_message_id}")
                    break
        if forwarded_message_id:
            break
        time.sleep(1)

    if not forwarded_message_id:
        print("Пересланное сообщение не найдено.")
        return

    # 📎 Ответ медиагруппой
    media_group = []
    for index, photo in enumerate(photo_paths[1:5], start=1):
        if index == 1:
            media_group.append(telebot.types.InputMediaPhoto(open(photo, 'rb'), caption=comment))
        else:
            media_group.append(telebot.types.InputMediaPhoto(open(photo, 'rb')))

    bot.send_media_group(chat_id=CHAT_ID, reply_to_message_id=forwarded_message_id, media=media_group)


# Запуск
photo_paths = ["photo1.jpg", "photo2.jpg", "photo3.jpg", "photo4.jpg", "photo5.jpg"]
caption = "Новый пост в канале"
comment = "Comment"

send_post_with_photo(bot, caption, photo_paths, comment)

Как работает бот:

  • Открывается первый файл из photo_paths

  • Отправляется фото с заголовком в канал по GROUP_ID

  • Сохраняется message_id этого сообщения — он нужен позже для поиска пересланного варианта

for _ in range(30):
    updates = bot.get_updates(offset=-1)
    ...
  • Бот в течение 30 секунд запрашивает новые обновления

  • Ищет сообщение в CHAT_ID, которое было переслано из канала и имеет forward_from_message_id, совпадающий с оригинальным

  • Если находит — сохраняет message_id пересланного сообщения

bot.send_media_group(chat_id=CHAT_ID, reply_to_message_id=forwarded_message_id, media=media_group)
  • Формируется медиагруппа из оставшихся фото

  • Первое фото в группе получает ответ commentкак caption, остальные — просто изображения

  • Медиагруппа отправляется в чат, в ответ на пересланное сообщение, как полноценный комментарий

Итог

Ты получаешь:

  • Оригинальный пост в канале

  • Автоматический ответ бота в чате, привязанный к пересланному сообщению

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.