intprog/lwB2/README.md
2023-03-06 22:20:52 +04:00

87 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа №B2 - Разработка чат-бота для Telegram
## Цель работы
Понять концепцию построения чат-ботов на примере Telegram.
## Ход работы
**Чат-бот** - программа, с которой можно общаться, будто вы общаетесь с живым (но может быть и не самым умным) собеседником.
Чат-боты служат для различных целей: в качестве напоминателей (всяческие календари), подсказчиков ("не забудь заплатить за электричество!1"), информационных служб (например, "пробить авто по номеру" или "показать погоду в Ульяновске") и много чего ещё.
Обычно чат-бот не умеет сам писать сообщения людям, только реагировать на сообщения от людей.
Однако иногда допускается писать самостоятельно, если диалог с пользователем уже был когда-то инициирован.
Существует множество архитектур по созданию чат-ботов для разных платформ.
Мы же рассмотрим Telegram.
Для создания нового бота необходимо... написать боту `@BotFather`!
Он на английском языке предложит определить имя нового бота, его логин и выдаст в итоге ключ доступа к API (_token_).
Там же будет написано, что этот ключ ни в коем случае нельзя передать кому-либо, поэтому при оформлении отчёта по этой работе, пожалуйста, **удаляйте _token_ из исходного кода и из скриншотов**.
Список доступных методов для ботов Telegram перечислен здесь: <https://core.telegram.org/bots/api#available-methods>.
Где-то там есть и описание того, как эти методы вызывать.
Нам пока это не особо интересно, однако знать следующие вещи стоит:
- бот получает обновления при помощи команды `getUpdates`.
Эта команда позволяет возвращать те обновления, к которым имеет доступ чат-бот.
Например, кто-то написал или отредактировал личное сообщение.
Команда позволяет получать до 100 обновлений за один вызов.
- при вызове команды обычно требуется объект какого-то формата на вход.
Также обычно команда возвращает ответ в определённом формате.
Параметры можно сериализовать в JSON-строку.
- если кто-то пишет чат-боту сообщения, информация об этом состоит из следующих полей: <https://core.telegram.org/bots/api#message>.
Как можете заметить, возвращается много информации, но там есть как минимум: ИД сообщения, текст сообщения, чат, из которого было получено сообщение, дата, прикреплённые аудио, фото и т.д.
- если мы хотим отправить сообщение, следует вызвать метод `sendMessage`: <https://core.telegram.org/bots/api#sendmessage>.
Там обязательно требуется указать ИД чата и текст нашего сообщения.
Однако можно указать и другие поля, например, ИД сообщения, на который мы хотим ответить и список доп. кнопок для быстрых действий.
Также первое сообщение боту от пользователя обычно `/start`, это также стоит помнить.
Предположим, мы хотим написать диагностического бота, который будет реагировать на сообщения людей следующим образом:
- на сообщение `/start` писать, что этот бот написан в качестве учебного материала и может выполнять следующие команды: ...
- на сообщение `/who` выводит ИД чата, ИД сообщения, ИД отправителя, имя отправителя и дату отправки сообщения.
- на сообщение `/rand %i %j` выводит случайное число между `%i` и `%j`.
Или сообщение об ошибке, если `%j` меньше, чем `%i`.
- при отправке голосового сообщения должен отвечать, что он "бумер" и не понимает голосовые сообщения.
- при отправке картинки должен всегда осыпать пользователя комплиментами по поводу красоты того, что он прислал.
Забавно?
Ещё бы.
Осталось реализовать.
Ход выполнения видится следующим:
1. Регистрация бота.
2. Обработка получения обновлений.
3. По каждому обновлению: если оно сообщение, то разбираем содержимое сообщения.
4. После разбора содержимого формируем ответ.
5. Отправляем ответ на сообщение.
Вроде бы всё просто, однако одновременно с этим ничего и не понятно.
Здесь нам придёт на помощь сообщество ИТ-специалистов, потому что многие стандартные решения уже были реализованы до нас (или нами).
Например, далеко не полный список библиотек для построения ботов для Telegram:
- для C# - <https://github.com/TelegramBots/Telegram.Bot>;
- для Python - <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Extensions-%E2%80%93-Your-first-Bot>;
- для Java - <https://github.com/pengrad/java-telegram-bot-api>;
- для Go - <https://github.com/go-telegram-bot-api/telegram-bot-api>.
Ваши задачи на эту лабораторную работу:
- определиться с любимым языком программирования;
- найти популярную реализацию библиотеки для создания чат-бота в Telegram;
- зарегистрировать чат-бота;
- подключить чат-бота к библиотеке и проверить, что обновления приходят;
- попытаться хоть что-нибудь ответить самому себе через программу (хотя бы тем же самым сообщением);
- дополнить обработку ответов уже тем, что описано выше в тексте лабораторной работы;
- продемонстрировать работу.
## Демонстрация работы
Демонстрация работы предполагает запуск бота и проверку его ответов на сообщения преподавателя в режиме реального времени.