Я хочу отправить сообщение боту телеграммы с помощью Telethon
и обработать его ответ с помощью функции обработчика событий. Есть ли способ установить тайм-аут для входящего события? Например, если я отправляю сообщение «Привет» боту, и он не отвечает мне через 5 секунд, Telethon снова отправляет сообщение «Привет».
Тайм-аут телемарафона для повторной отправки сообщения
Ответы (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
Спасибо за Ваш ответ. Это единственный способ? Есть ли способ, которым Телемарафон сделает это за нас автоматически?
- person Sara Fahim; 16.08.2018
@SaraFahim Я так не думаю. Хотя это довольно легко реализовать.
- person Juggernaut; 16.08.2018
Да, я знаю. Это самый простой способ. Спасибо еще раз.
- person Sara Fahim; 16.08.2018
Вы тестировали свой код? Это бесконечный цикл даже при использовании time.sleep().
- person Sara Fahim; 18.08.2018
@SaraFahim это не должен быть полный фрагмент. Я просто хотел, чтобы ты понял суть.
- person Juggernaut; 18.08.2018
Извините, я вас не понимаю :(
- person Juggernaut; 18.08.2018