- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Telethon. Как сравнить полученное сообщение?
Всем привет! Пишу telegram бота на Telethon. Перерыл весь интернет, но так и не нашел способа как сравнить полученное от пользователя сообщение. Подробнее: я пишу систему промокодов, то есть человек нажимает кнопку "Ввести промокод", соответственно это ловит событие NewMessage(pattern="Ввести промокод"), бот ждет пока человек напишет следующие сообщение, дальше идет сравнение,но бот не ждет следущего сообщения а выполняет функцию, сравнивая текст кнопки "Ввести промокод" и ничего конечно не работает. Вопрос: как сделать так, чтобы после нажатия кнопки "Ввести промокод" бот ждал сообщения с этим самым промокодом, а затем его сравнивал? Свой вариант прилагаю:
Свой вариант прилагаю:
@bot.on(events.NewMessage(incoming=True, pattern='Ввести промокод'))
async def answer2(event):
await event.respond("Ваш код:")
if event.text=="BIJO":
await event.respond("Правильно!")
else:
await event.respond("Неправильно!")
Ответы (2 шт):
В aiogram если не ошибаюсь для этих целей есть машина состояний, по этой библиотеке я не могу точно вам сказать, но поищите информацию по этой теме. Лично я при создании ботов работал чисто на библиотеке requests и эти ситуации решал путём создания временного состояния для пользователя с этим ID. То есть в данных пользователя создавать переменную status и в ней прописывал кратко что я ожидаю, а в коде уже обрабатывал это как: Если status None, то работает как и работали, если пришло сообщение "Промокод", то присваиваем status ожидание промокода, если status = ожидание промокода, то сравниваем текст полученного сообщения и сбрасываем status в None. Всё это загонял в конструкцию if, elif, else. Всё работало быстро и без каких либо проблем
Я нашел решение моей задачи. Чтобы сравнить сообщение, его нужно ожидать, а затем получить. Оказывается, в Telethon есть класс TelegramClient, у которого существует вспомогательный Conversation(), для ожидания какого либо события (в нашем случае сообщения), нужен его метод wait_event(). Ниже приведен пример кода:
@bot.on(events.NewMessage())
async def surveillance_and_answ(event):
print(event.text)
if event.text=="Ввести промокод":
await event.respond("Ваш код: ")
try:
async with bot.conversation(event.chat_id,timeout=60) as wait:
wait_message = wait.wait_event(events.NewMessage())
msg = await wait_message
print(msg.message.message)
if msg.message.message=='PROMOCODE':
await event.respond("Поздравляю, вы получили подписку на **12 месяцев!**")
else:
await event.respond("Увы, такого промокода **не существует!**")
except TimeoutError:
await event.respond("Время для ввода промокода истекло, попробуйте снова")