Теория

Чат-боты в мессенджерах

Бот — сокращение от «робот». Чат-боты — это программы, взаимодействующие с пользователем через мессенджер, систему обмена сообщениями. Такой мессенджер может быть встроен на страницу сайта, но в последние годы всё более популярны чат-боты, работающие через интерфейс мессенджеров, например — через Телеграм.
Чат-боты широко применяются для коммерческих или бесплатных сервисов: компании предоставляют клиентам дополнительный канал доступа к информации и услугам. Боты могут, например, известить клиента о появлении в продаже какого-то товара или об изменении цены на него.
Для общедоступных сервисов чат-бот хорош тем, что взаимодействие с ним идёт через обычный интерфейс мессенджера, с которым знаком любой современный человек. Сегодня многим проще отправить сообщение в мессенджере, чем работать через браузер. И ещё одно огромное преимущество чат-ботов перед настольными системами в том, что бот всегда «сидит» в кармане у пользователя, и пользователь быстрее получает необходимую информацию.
А для настоящего программиста бот — отличный помощник, на которого можно переложить массу рутинных задач.
Например, можно десять раз в час заходить и узнавать, проверил ли ревьюер вашу домашку или нет, а можно сгрузить эту задачу на бота и ждать от него сообщения в мессенджере, занимаясь более полезными и интересными делами.

Чат-боты в Телеграм

Для создания чат-бота в Телеграм есть специальная система, возможности которой описаны в официальной статье "Bots: An introduction for developers". Документация по API ТГ-ботов опубликована здесь. Если какие-то из этих ссылок не будут открываться, то попробуйте через прокси, например: https://www.free-proxy.com/
Чтобы пользователи отличали чат-ботов от реальных аккаунтов, в Телеграм установлены некоторые ограничения.
  • Имя бота должно оканчиваться на bot, например — @practicum_bot.
  • У ботов нет статуса последнего посещения, вместо него выводится надпись «бот».
  • Бот не может «постучаться» к другому пользователю и первым начать диалог: он должен скромно сидеть и ждать, пока кто-нибудь обратит на него внимание и напишет ему.
Существуют четыре популярные библиотеки работы с Telegram API:
AIOGram и Telethon заточены под асинхронный стиль программирования, с которым вы пока не знакомы. Поработаем с python-telegram-bot.
Задача   1 / 3
1.
Если вы не зарегистрированы в Телеграм — самое время сделать это. Вы можете не пользоваться аккаунтом для личных нужд, но он понадобится вам для учёбы.
После подключения к Телеграм создайте своего бота: это делается при обращении к боту @BotFather (окно поиска над списком контактов в приложении поможет вам найти его: введите туда имя бота).
Нажмите кнопку Start («Запустить»), чтобы начать диалог с ботом. Затем дайте команду /newbot и укажите параметры нового бота:
  • имя (на любом языке), под которым ваш бот будет отображаться в списке контактов
  • техническое имя вашего бота, по которому его можно будет найти в Телеграме. Имя должно оканчиваться на "bot" в любом регистре, например — YaBot или ya_bot. Имена ботов должны быть уникальны, придумывайте сами. Например, «ваш логин_assistant_bot».
Бот создан! @BotFather поздравит вас и отправит вам токен для работы с HTTP API.
Токен пригодится в следующем задании. Но вы уже знаете, где можно его хранить, а куда его класть не стоит. @BotFather также может отозвать токен и сгенерировать новый, выясните самостоятельно, как это делается.
Подсказка
Нажмите кнопку Проверить чтобы перейти к следующему заданию.
2.
Сейчас вы научите бота говорить.
Напишите функцию, которая принимает id пользователя и отправляет этому пользователю сообщение «Привет, я ботик, у меня баги». При проверке кода вы вызовете эту функцию вручную. Отправлять сообщение вы будете себе, в свой личный аккаунт в Телеграм. Чтобы отправить себе сообщение от бота — вам нужно узнать ID своего ТГ-аккаунта. Спросите у телеграм-бота @userinfobot, он подскажет.
Импортируйте в код библиотеку telegram. После этого создайте экземпляр класса telegram.Bot, он будет интерфейсом между вашим кодом и Telegram.
На территории России Телеграм не запрещён, но заблокирован, поэтому нужно выполнять запрос через промежуточный proxy-сервер. Для этого создайте telegram.utils.request.Request и передайте в качестве аргумента proxy_url адрес прокси протокола SOCKS5:
Скопировать кодPYTHON
proxy = telegram.utils.request.Request(proxy_url='socks5://xxx.xxx.xxx.xxx:yyyy') # вместо xxx.xxx.xxx.xxx:yyyy укажите IP и порт прокси-сервера bot = telegram.Bot(token='', request=proxy)
Адрес прокси можно взять, например, здесь (берите socks5 или https): http://spys.one/proxies/ Какой-то из адресов прокси может оказаться нерабочим. Не беда, просто выберите другой. Выбирайте uptime, близкий к 100%.
В пятом модуле вы узнаете, что такое прокси-сервер и научитесь поднимать собственные прокси-сервера, но пока достаточно знать, что это промежуточный сервер между вашим компьютером и тем сервером, к которому вы отправляете запрос.
Рекомендуем такой порядок работы:
  1. Узнайте ID своего аккаунта в Телеграме и передайте этот ID в вашу функцию
  2. Найдите в Телеграме вашего бота (поиском по имени, например)
  3. Нажмите ссылку /start в реплике бота: это позволит ему отправлять вам сообщения. Бот не сможет начать разговор, пока вы не отправите ему эту команду.
  4. Найдите в документации метод для отправки сообщения и воспользуйтесь им для отправки.
  5. Убедитесь, что вам пришло сообщение в Телеграм.
Если после выполнения заданий в тренажере вы переживаете за свой токен, то просто отзовите его: попросите BotFather'а это сделать.
Подсказка
Вам нужен метод telegram.Bot.send_message
Передайте в него chat_id и text.
3.
Мы подготовили API, которое возвращает изменение статуса вашей домашки. К этому API будет обращаться ваш бот, чтобы узнать, проверена ли домашка, провалена или принята. Но для начала вам предстоит разобраться, как работает этот API:
  • API возвращает статус домашки за определённый интервал времени.
  • Интервал задается от даты, указанной в параметре from_date, до текущего времени. Время передаётся в формате Unix time (он вернется в ключе current_date).
Unix time определяется как количество секунд, прошедших с 1 января 1970 года (эту дату также называют «началом эпохи Unix»). Этот формат принят за стандарт в программном исчислении времени.
API домашки доступно по адресу: https://praktikum.yandex.ru/api/user_api/homework_statuses/
Токен можно получить по адресу: https://oauth.yandex.ru/authorize?response_type=token&client_id=9999999999999999999
Передайте токен авторизации в заголовке запроса Authorization: OAuth <token>
Пример ответа:
Скопировать кодJSON
{ "homeworks":[ { "id":123, "status":"approved", "homework_name":"username__hw_python_oop.zip", "reviewer_comment":"Всё нравится", "date_updated":"2020-02-13T14:40:57Z", "lesson_name":"Итоговый проект" } ], "current_date":1581604970 }
Статус домашки может быть двух типов (ключ status):
  • approved: ревью успешно пройдено
  • rejected: в работе есть ошибки, нужно поправить

Задача

Сделайте запрос к API и получите список своих домашек за всё время.
Подсказка
Вам нужно сделать запрос на https://praktikum.yandex.ru/api/user_api/homework_statuses/
Параметр from_date передайте обычным параметром GET-запроса. Чтобы получить статусы домашек за всё время, параметр from_date должен быть равен нулю.
Код
Результат