Доброго времени суток,
В прошлом уроке мы с вами разобрали как работают обработчики сообщений, ну а в этом чтобы немного расслабиться и написать что-то большее чем было до этого, предлагаю написать квест-бот'а который вы сможете настроить под своих друзей, вторую половинку и т.д.
Если в уроке встретится что-то новое, я обязательно объясню как и зачем.
Напомню, что бота под телеграм я пишу на языке программирования Python, с устройством установки и запуска кода, вы можете более познакомиться в ранних статьях(Урок 1 и Урок 2).
Использую одного бота, просто каждый раз очищаю код,
Для тех кто, возможно, ещё не знает.
План
Очень жаль, что я не могу посоветоваться с вами насчёт того, сколько будет вопросов/этапов в нашем квесте, в дальнейшем может обратная связь будет мною продумана).
Сделаем к примеру 4 вопроса(потому что в ходе я не придумал пятый, не получалось сделать решение возможным) различного типа и сложности.
Напишем общий тест для, абсолютно, любого человека.
Сделаем 4 уровня сложности, как и вопросов.
Считаю, что лучше делать вопросы на которые будущий пользователь сможет ответить без использования интернета, попытаемся заставить пользователя самостоятельно напрячь мозги.
1 вопрос
Сделаем его максимально простым, так скажем первым уровнем сложности.
Я придумал вопрос.
<<Сколько месяцев в году имеют 28 дней?>>
Ну вы, наверное, уже знаете ответ.
2 вопрос
Второй уровень сложности.
Возможно, уже пользователь воспользуется интернетом.
<<Сколько лет длилась 100-летняя война?>>
-Конечно же не 100 лет))
3 вопрос
За идею, конечно же, хотелось бы сделать что-нибудь с использованием аудио. К примеру, пусть пользователь угадает название песни или автора песни. Отправим ему отрывок.
Также можем вместо отрывка отправить ему часть текста песни переведённый на английский и обратно на русский, ну может ещё пару раз прогнанный через другие языки.
Возьму наверное мелодию вступления песни <<Тима Белорусских - Мокрые кроссы>>, в мелодии нет слов и будет, достаточно, сложно узнать, но всё-равно это возможно.
Здесь мы можем столкнуться с проблемами, решим их по ходу написания кода.
4 вопрос
Пусть в данном вопросе пользователь решит задачу:
Ответ 43,
Чтобы не было лишних вопросов:
2 кроссовка = 10;
парень = (20 - 10)/2=5;
2 кулька = (13-5)/2=4;
1 кроссовок + мальчик с 2 кульками в кроссовках * 1 кулёк = 5+(5+4+10)*2=5+19*2=5+38=43;
В этом вопросе мы можем встреться с тем, что если наш телеграм бот будет отправлять картинку как это делаем мы,
1) Это займёт определённое время.
2) Каждая отправленная картинка каждому нашему пользователю займёт место на серверах телеграма.
А если пользователей много, то и места займётся тоже много.
Конечно, очень вряд ли мы займём всё место на серверах, но всё же,
Почему бы сразу не научиться его экономить для дальнейших целей и это будет значительно ускорять отправку картинки.
В кратце о способе: Каждая картинка, которая уже есть на серверах телеграма, которую мы туда отправим, имеет индивидуальный код,
именно по нему мы и будем отправлять картинки в дальнейшем.
Итак, наш план готов, приступим к коду.
Получение индивидуального кода(file_id) с картинки
В прошлой статье я оппубликовал хэндлеры для получения индивидуального кода с различного типа файлов.
Т.к. телеграм хранит на сервере 3 индивидуальных кода к фото, маленького размера, среднего и высокого, то думаю конечно всех устроит высокий размер. Поэтому наш хэндлер к фото возвращает только file_id высокого разрешения.
Запускаем бота с кодом с прошлой статьи и отправляем необходимые файлы.
Теперь мы имеем индивидуальные кода файлов,
Можно приступать к написанию кода.
Главное не забыть какой код к какому типу файлов принадлежит, ведь отправляются они по разному.
Написание кода
Сразу предупреждаю, что код выглядит совсем сыро,
Можно подключить дополнительные библиотеки и сделать всё на отлично,
Но вряд ли кто-то делает таких ботов для общественности,
И цель урока, показать как отправить различные файлы через file_id.
"А вдруг человек напишет в первом вопросе не "все месяцы", а "12" or "12 месяцев" or "все", постараемся самые популярные ответы на эти вопросы учесть, но чтобы много раз в условие не делать "или", есть специальные библиотеки, также можно попробовать что-нибудь с простой функцией ".find()".
Представим, что те кто будет проходить этот квест грамотные люди и ошибок в словах они не допустят.
import telebot
import config
bot = telebot.TeleBot(config.TOKEN)
@bot.message_handler(commands=["start"])
def welcome(message):
#Приветствуем и отправляем первый вопрос.
bot.send_message(message.chat.id, "Доброго времени суток, {0.first_name}! 😊 \nРад видеть тебя в моём, совсем небольшом, квесте.\nИтак, не будем же ждать, к первому вопросу.".format(message.from_user, bot.get_me()))
bot.send_message(message.chat.id, "Вопрос №1:\nСколько дней в году имеют 28 дней?")
#Отправляем 2-ой вопрос.
@bot.message_handler(content_types=["text"])
def kvest(message):
if message.text.lower()=="все" or message.text.lower()=="12" or message.text.lower()=="12 месяцев" or message.text.lower()=="все месяцы":
bot.send_message(message.from_user.id, "Это правильные ответ.\nЯ в тебе не сомневался")
bot.send_message(message.from_user.id,"Вопрос №2:\nСколько лет длилась 100-летняя война?")
#Отправляем 3-ий вопрос.
elif message.text.lower()=="116" or message.text.lower()=="116 лет" or message.text.lower()=="сто шестнадцать":
bot.send_message(message.from_user.id, "Я верю что ты умн(ый/ая), а не отвечал(а) подбором 😊")
bot.send_message(message.from_user.id,"Вопрос №3:\nУгадай название композиции?")
bot.send_audio(message.from_user.id, "CQACAgIAAxkBAAICLGJJrmpqT3qeOFRhnvDf2EYGOv7ZAALaFwACn69RSrFlND-I2HN1IwQ")
#Отправляем 4-ый вопрос.
elif message.text.lower()=="тима белорусских - мокрые кроссы" or message.text.lower()=="мокрые кроссы":
bot.send_message(message.from_user.id, "Правильный ответ.")
bot.send_message(message.from_user.id,"Вопрос №4:\nРеши загадку:")
bot.send_photo(message.from_user.id, "AgACAgIAAxkBAAICLWJJroPm-a6uAAFqh_vdEMDI-bnxCgAC5rwxG5-vUUpYR5mNtF-v3AEAAwIAA3kAAyME")
elif message.text.lower()=="43" or message.text.lower()=="сорок три":
bot.send_message(message.from_user.id, "И перед нами победииииитееееель!!!")
else:
bot.send_message(message.from_user.id, "К сожалению, ответ не правильный.\nПопробуйте ещё раз!")
bot.polling(non_stop=True, interval=0)
Честно, даже объяснять нечего,
использовал в условиях ".lower()" чтобы привести текст пользователя к нижнему регистру и проверить его ответ с правильным, который уже в нижнем регистре.
Сравнение в условиях это двойное равно "==".
И зачем эта статься? Ну ладно уж, пусть будет.
__________________________________________________________________________________________
-Спасибо, что дочитали данную статью до конца, Надеюсь, она была вам полезна. Также если что-то осталось не разобранным и непонятным - пишите в комментарии. Подписывайтесь, дальше будет ещё интереснее.
(Ну точно не квесты)...
Можно сделать сделать в стиле "Кто хочет стать миллионером?",
используя кнопки... несгораемая сумма... помощь зала...
Та нее...