Тайм-аут телемарафона для повторной отправки сообщения

Я хочу отправить сообщение боту телеграммы с помощью Telethon и обработать его ответ с помощью функции обработчика событий. Есть ли способ установить тайм-аут для входящего события? Например, если я отправляю сообщение «Привет» боту, и он не отвечает мне через 5 секунд, Telethon снова отправляет сообщение «Привет».


person Sara Fahim    schedule 08.08.2018    source источник


Ответы (1)


Сначала нам нужно создать обработчик и выполнить привязку к событию NewMessage нашего клиента телемарафона.

from datetime import datetime
from telethon import TelegramClient, events
from telethon.tl.types import InputPeerUser

client = TelegramClient('session_name', app_id, 'app_token')
last_message_received_on = None


@client.on(events.NewMessage)
def on_message_received(event: events.NewMessage.Event):
    print(event.raw_text)

Теперь в наш обработчик on_message_received нам нужно добавить строку, определяющую, на что datetime нам ответил бот. Поэтому мы меняем обработчик на:

@client.on(events.NewMessage)
def on_message_received(event: events.NewMessage.Event):
    global last_message_received_on
    last_message_received_on = datetime.now()

Теперь запускаем клиент и запускаем цикл. Мы отправляем боту сообщение и проверяем, получили ли мы ответ менее чем за пять секунд. Мы продолжаем этот цикл, пока ответ не будет получен в течение 5 секунд. Думаю, теперь вы поняли суть.

with client.start():
    bot = client.get_entity('https://t.me/some_user_name')

    while True:
        send_message('hi')
        if not last_message_received_on or (last_message_received_on < datetime.now()).seconds > 5:
            send_message('hi')
        else:
            break

Также вам нужно time.sleep() между повторной отправкой сообщения выдерживать не менее 1 секунды, чтобы сделать вещи естественными и реалистичными. Потому что вы не ожидаете, что ответ не будет мгновенным!

person Juggernaut    schedule 08.08.2018
comment
Спасибо за Ваш ответ. Это единственный способ? Есть ли способ, которым Телемарафон сделает это за нас автоматически? - person Sara Fahim; 16.08.2018
comment
@SaraFahim Я так не думаю. Хотя это довольно легко реализовать. - person Juggernaut; 16.08.2018
comment
Да, я знаю. Это самый простой способ. Спасибо еще раз. - person Sara Fahim; 16.08.2018
comment
Вы тестировали свой код? Это бесконечный цикл даже при использовании time.sleep(). - person Sara Fahim; 18.08.2018
comment
@SaraFahim это не должен быть полный фрагмент. Я просто хотел, чтобы ты понял суть. - person Juggernaut; 18.08.2018
comment
Извините, я вас не понимаю :( - person Juggernaut; 18.08.2018