Найти тему

Telegram-bot с нуля, делаем очень простой квест-бот. Урок 6

Оглавление

Доброго времени суток,

В прошлом уроке мы с вами разобрали как работают обработчики сообщений, ну а в этом чтобы немного расслабиться и написать что-то большее чем было до этого, предлагаю написать квест-бот'а который вы сможете настроить под своих друзей, вторую половинку и т.д.

Если в уроке встретится что-то новое, я обязательно объясню как и зачем.

Напомню, что бота под телеграм я пишу на языке программирования Python, с устройством установки и запуска кода, вы можете более познакомиться в ранних статьях(Урок 1 и Урок 2).

Использую одного бота, просто каждый раз очищаю код,

Для тех кто, возможно, ещё не знает.

План

Очень жаль, что я не могу посоветоваться с вами насчёт того, сколько будет вопросов/этапов в нашем квесте, в дальнейшем может обратная связь будет мною продумана).

Сделаем к примеру 4 вопроса(потому что в ходе я не придумал пятый, не получалось сделать решение возможным) различного типа и сложности.

Напишем общий тест для, абсолютно, любого человека.

Сделаем 4 уровня сложности, как и вопросов.

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

1 вопрос

Сделаем его максимально простым, так скажем первым уровнем сложности.

Я придумал вопрос.

<<Сколько месяцев в году имеют 28 дней?>>

Ну вы, наверное, уже знаете ответ.

2 вопрос

Второй уровень сложности.

Возможно, уже пользователь воспользуется интернетом.

<<Сколько лет длилась 100-летняя война?>>

-Конечно же не 100 лет))

3 вопрос

За идею, конечно же, хотелось бы сделать что-нибудь с использованием аудио. К примеру, пусть пользователь угадает название песни или автора песни. Отправим ему отрывок.

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

Возьму наверное мелодию вступления песни <<Тима Белорусских - Мокрые кроссы>>, в мелодии нет слов и будет, достаточно, сложно узнать, но всё-равно это возможно.

Здесь мы можем столкнуться с проблемами, решим их по ходу написания кода.

4 вопрос

Пусть в данном вопросе пользователь решит задачу:

-2

Ответ 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)
-4
-5

Честно, даже объяснять нечего,

использовал в условиях ".lower()" чтобы привести текст пользователя к нижнему регистру и проверить его ответ с правильным, который уже в нижнем регистре.

Сравнение в условиях это двойное равно "==".

И зачем эта статься? Ну ладно уж, пусть будет.

__________________________________________________________________________________________

-Спасибо, что дочитали данную статью до конца, Надеюсь, она была вам полезна. Также если что-то осталось не разобранным и непонятным - пишите в комментарии. Подписывайтесь, дальше будет ещё интереснее.

(Ну точно не квесты)...

Можно сделать сделать в стиле "Кто хочет стать миллионером?",

используя кнопки... несгораемая сумма... помощь зала...

Та нее...