Как получить новое сообщение, полученное из канала телеграмм, с помощью телемарафона

Я использовал код, указанный здесь, чтобы получить новое сообщение от пользователя, но не работает, когда приходит новое сообщение в телеграмм канал.

@bot.on(events.NewMessage)
async def my_event_handler(event):
    print(event.stringify())

Настройка events.NewMessage(chat='chat') или events.NewMessage(chat='channel') не сработала.

Как бот телеграммы может получить новое событие сообщения из канала телеграммы?


person jonny789    schedule 12.04.2020    source источник
comment
chats используется для фильтрации по очень конкретному чату по некоторому идентификатору, такому как идентификатор или имя пользователя, а не по типу.   -  person Lonami    schedule 12.04.2020
comment
Если не использовать фильтр чата, то как получить новое сообщение с канала?   -  person jonny789    schedule 12.04.2020
comment
Насколько я помню, боты не будут получать сообщения канала. Это дизайн Telegram. Для этого вам нужно создать сеанс пользователя.   -  person ababak    schedule 12.04.2020
comment
Я видел много каналов телеграмм, в которых бот отвечает всякий раз, когда выдается / somecommand.   -  person jonny789    schedule 12.04.2020


Ответы (2)


Чтобы бот получал все сообщения, сначала необходимо настроить его в @BotFather, отключив приватность бота:

  1. /Начало
  2. /моиботы
  3. (выбрать бота)
  4. Настройки бота
  5. Групповая конфиденциальность
  6. Выключить

После этого добавьте бота в качестве администратора на ваш широковещательный канал (здесь они не могут быть обычными участниками). Ваш код должен выглядеть так:

CHANNEL = ...  # id, username or invite link of the channel

# the first parameter is the `chats=`, you can use a named argument if you want
@bot.on(events.NewMessage(CHANNEL))
async def my_event_handler(event):
    print(event.stringify())

Если вы хотите обрабатывать сообщения от всех широковещательных каналов, в которых состоит ваша группа, используйте более сложный фильтр:

# megagroups (supergroups) are channels too, so we need `not e.is_group`
# this lambda takes the event, which has these boolean properties
@bot.on(events.NewMessage(func=lambda e: e.is_channel and not e.is_group))
async def my_event_handler(event):
    print(event.stringify())
person Lonami    schedule 12.04.2020

Если вы хотите получить только текст сообщения вместо всего json, вы можете попробовать это

print(event.message.message)
person Ramesh2209    schedule 02.03.2021