Разработка бота для Telegram

В этих заданиях необходимо разработать бота для Telegram с использованием модуля telebot.

Вам необходимо:

  1. Зарегистрировать своего бота в @BotFather, получить ключ для доступа к API.
  2. Написать программу, которая будет реализовывать ваш бот.
  3. В начале программы напишите в комментарии имя пользователя для вашего бота (которое было указано при получении ключа), например # @my_super_bot
  4. Отладьте вашу программу, убедитесь, что она работает.
  5. Сдайте на проверку текст программы, не нужно делать хостинг вашего бота.

A: Бот, отвечающий односложно

Напишите бота, который на все предложения отвечает односложно. Например, пишет в ответ “Привет!”

B: Приветствие по имени

Напишите бота, который в ответ на сообщение приветствует пользователя по имени. Например, “Привет, Андрей!”. Для этого изучите объект message, который передаётся в обработчик сообщений. Этот объект содержит в себе много информации. Чтобы разобраться, что есть в этом объекте, можно воспользоваться пошаговым отладчиком с просмотром переменных или отладочным выводом.

C: Бот-калькулятор

Напишите бота, который вычисляет значение выражения, которое ему прислали. Например, если написать боту 2 + 2, он должен ответить 4.

Для этого нужно использовать функцию eval, вычиcляющую переданное ей выражение в виде строки. Например, eval('2 + 2') вернёт число 4.

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

try:
    # вызов функции eval
    # и какие-то другие действия
except:
    # что будет происходить, если возникло исключение

Подробней про обработку исключений в Python можно прочитать, например, здесь.

На самом деле ни в коем случае нельзя использовать функцию eval для вычисления выражений, полученных ненадёжным способом. Например, злоумышленник может отправить вашему боту зловредный код и сделать что-то нехорошее. Например, можете посмотреть эту статью.

D: Бот-цитатник

Пора научить бота делать что-то интересное. У нас есть интернет с огромным объёмом информации. Ну и помимо сложного способа (самим добывать информацию, парсить её и т.д.), есть некоторые ресурсы, обладающие удобным API. Зачастую это API построено точно так же: отправляете GET-запрос через http, в ответ получаете JSON с нужной информацией.

Например, есть сайт favqs.com, выдающий цитаты. У этого сайта есть API, описанное на странице https://favqs.com/api/. Для большинства функций этого API требуется авторизация при помощи токена, но мы воспользуемся простым запросом Quote of the Day, не требующим токена. Для этого нужно просто сделать запрос по адресу https://favqs.com/api/qotd, и вы получите JSON с цитатой.

Осталось только научиться загружать JSON с удалённого сайта. Для этого есть несколько способов, самый простой — библиотека requests. Смотрите документацию на библиотеку, простой пример использования, а также можно сразу же распарсить полученный JSON.

Задание. Напишите бота, который на любое сообщение отвечает случайно цитатой. Не забудьте также указать автора цитаты!

E: Конвертер валют

У Центрального банка РФ есть API, выдающее официальные курсы валют: https://www.cbr-xml-daily.ru/daily_json.js

Напишите бота, который мог бы переводить любую сумму любой поддерживаемой валюты в любую другую поддерживаемую валюту. Не забудьте про российский рубль, его курс в этом документе не указан!

Бот должен уметь распознавать запросы в каком-либо формате, например, "100 USD в EUR". Если бот не смог распознать запрос, то должно выводиться сообщение об ошибке, которое бывает двух видов: сообщение о том, как использовать бота и сообщение о том, что указанная валюта ботом не поддерживается (в этом случае бот должен вывести список всех поддерживаемых валют).

F: Цитаты на заданную тему

Вернёмся к API цитатника https://favqs.com/api/.

Необходимо написать бота, который выдаёт случайную цитату на заданную тему. Например, если боту отправить какое-либо довольное распространённое слово, например, “school”, “weather”, “love” и т.д., то API вернёт список цитат на эту тему.

Техническое задание: напишите бота, который по заданному слову выдаёт случайную цитату на данную тему. Необходимо вывести одну (случайную) цитату из всех цитат в базе, у которых проставлен тэг, соответствующий этому слову. Если такие цитаты не найдены, бот должен сообщить об этом. Для выбора случайной цитаты лучше всего подойдёт функция random.choice

Для этого у API есть метод quotes (List Quotes), который выдаёт список всех цитат. Этому методу можно передать параметр filter, со значением — слово, по которому осуществляется поиск, и параметр type=tag, чтобы осуществлять поиск по тегам, а не по всем текстам цитат.

Обратите внимание, что если цитат, удовлетворяющих условию, много, то API выдаёт только 25 из них. Чтобы получить больше цитат (они выдаются страницами по 25 штук), нужно задать параметр page, равный номеру страницы.

Всё, что здесь описано, передаётся при помощи параметров GET запроса. Примеры запросов можете посмотреть в документации на API.

Но использовать функцию quotes вы можете только при наличии токена. Для этого нужно зарегистрироваться на сайте и получить бесплатно токен (они называются API keys). Токен — это строка из 32 hex-символов. Токен нужно передавать (см. раздел Authorization в API) при помощи дополнительного параметра “Authorization” в параметрах GET-запроса. Это можно сделать при помощи той же библиотеки requests, посмотрите на пример Custom Headers в документации.

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

Рекомендуемый план работы над заданием такой. Переходите к следующему этапу, реализовав предыдущий этап.

  1. Получить API key.
  2. Научиться делать запросы с использованием API key (любые, лишь бы работала авторизация).
  3. Научиться делать запросы с поиском по тэгу.
  4. Реализовать загрузку всех цитат с учётом пагинации. До сих пор вам на самом деле не нужен никакой бот, удобней написать простое приложение, которое будет делать необходимые запросы и выдавать результат на стандартный вывод.
  5. Теперь облачаем это в форму бота, кэшируя полученные цитаты в словаре.

G: Расписание уроков

Напишите бота, который выдаёт расписание уроков на сегодняшний день (после запуска, ответ на любое сообщение), а также на любой другой день недели.

Выбор дня недели реализуйте при помощи клавиатуры.

Вот ваше расписание

[
["Геометрия", "Геометрия", "Английский", "Астрономия", "Алгебра", "Проекты", "Танцы"],
["Физика", "Физика", "Матан", "Матан", "Информатика", "Информатика ", "История", "История"],
["", "ОБЖ", "Русский", "Русский", "Алгебра", "Алгебра", "Геометрия"],
["Матан", "Матан", "Физика", "Физика", "География", "География", "Литература", "Вруся"],
["Биология", "Биология", "Литература", "Литература ", "Английский ", "Английский"],
["", "", "Физ-ра", "Физ-ра", "Классный час", "Химия"]
]

H: Текущая погода

Зачастую хорошие данные бесплатно не раздают... Но на сайте openweathermap.org есть бесплатное API, предоставляющее погодные данные. Вернее, там есть бесплатные запросы “Current Weather Data”, “One Call API”, “5 Day / 3 Hour Forecast”.

Зарегистрируйтесь на сайте и получите ключ для доступа к API (в меню найдите “My API keys”). Сделайте это заранее, т.к. активация ключа произойдёт через некоторое время. Если при доступе к API вы получаете сообщение о том, что ключ некорректный (а он точно корректный), то это означает, что ключ ещё не был активирован и нужно ещё подождать.

Напишите бота, который выдаёт текущую погоду для одного из городов. Приложение должно предлагать выбор города при помощи кнопки (должно быть минимум 4 города, минимум из трёх разных часовых поясов, обязательно включая Москву). Также должна быть возможность ввести название города вручную (при этом не гарантируется, что погоду для этого города удастся определить).

Необходимо вывести текущую погоду для выбранного города. Минимальный набор данных, который нужно вывести:

I: Конвертер валют-2

Бота, конвертирующего валюты, реализуйте при помощи кнопок. Например, должны быть кнопки “Введите сумму”, “Выберите исходную валюту” “, “Выберите валюту, в которую нужно перевести”. Для выбора валюты отображается меню из кнопок, соответствующих валютам. При вводе суммы нужно обрабатывать любые неправильные введённые данные.

J: Бот, который считает

Напишите бота с двумя кнопками: «+1» и «Сброс». По нажатию на первую кнопку выводится последнее выведенное число, увеличенное на 1, а по нажатию на «Сброс» выводится 0.

Для каждого пользователя ряд чисел должен быть собственным.

K: Камень, ножницы, бумага

Напишите бота, который реализует игру «Камень, ножницы, бумага» для двух игроков (двух пользователей). Пользователю отображаются три кнопки. Бот получает результат нажатия кнопок. Когда два пользователя нажали кнопки, бот сообщает каждому из них имя его противника, что выбрал противник и результат игры (выиграл, проиграл, ничья). То есть при получении ответа от одного пользователя бот запоминает его ход, после получения ответа от второго пользователя, бот сообщает обоим пользователям результат игры и всё начинается заново.

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

L: Игра ним

В игре ним на столе лежит несколько кучек камней (например, содержащих 3, 4 и 5 камней). Двое игроков по очереди берут по одному или несколько камней из одной кучки. Выигрывает тот, кто взял последний камень.

Стратегия при игре в ним: рассмотрим побитовый XOR количества камней в кучках (например, 3 ^ 4 ^ 5 = 2). Если эта величина ненулевая, то позиция выигрышная для ходящего игрока. Если же эта величина нулевая, то позиция проигрышная. Выигрышный ход должен быть таким, чтобы XOR размеров кучек стал нулевым.

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