Задание 61. Бот для телеграмма
Задание: реализовать программу-бота для телеграмма, которая будет отвечать на запросы пользователя (обычного человека, использующего телеграмм) и предоставлять для него полезную информацию.
Тема-пример этой статьи Бот-эхо
:
- Бот отвечает таким же сообщением, какое пользователь отправил
- Бот шлет
Привет! Как дела?
в22:39
каждый день
Тема на оценку Бот-Remembrall
:
- Боту можно отправить сообщение о чем-то важном, например
20:00 загамать в доту
,5 марта сделать дз по информатике
- Бот предупредит о важном событии в указанное время (или за день до даты)
- Придумать какую-нибудь дополнительную полезную функциональность
Опционально
Напоминание может содержать геотег (метку на карте)Опционально
Предупреждать заN
минут до звонка (N
- настраиваемое)Опционально
Да что угодно!
Альтернативные темы:
- Генератор мемов (пользователь выбирает картинку и указывает текст для наложения)
- Оповещатель о новых сообщениях в vkontakte
- Выдаватель новых/случайных анекдотов/новостей из указанной пользователем группы vkontakte
Другие темы возможны по согласованию со мной.
В инструкции описано как сделать бота на Java
, но Python
для данной задачи на мой взгляд подходит лучше, так что любой другой язык для этого задания разрешен. Здесь есть ссылки для многих языков.
Дедлайн:
TBA
1) Про ботов
Общая идея в том, что вы регистрируете своего бота в телеграмме, затем запускаете программу, которая будет определять логику бота. Эта программа подключиться к серверам телеграмма, и если кто-то отправит сообщение вашему боту - сервера телеграмма оповестят об этом вашу программу. Программа соответственно может сообщать серверам телеграмма о том, какие действия совершает бот, например отправка овтетного сообщения.
2) Регистрация бота
Чтобы ваша программа-бот могла взаимодействовать с серверами телеграмма - ее нужно зарегистрировать, т.е. получить для нее идентификатор, чтобы сервера телеграмма могли понимать с кем они работают.
Для этого надо открыть https://telegram.me/botfather и нажать SEND MESSAGE
, это откроет BotFather
в установленном Телеграмме.
Теперь надо попросить у него выдать для нас идентификатор (и сделать это с уважением):
/start
/newbot
- Указать имя бота, например
PolarNickTestBot
- Указать username оканчивающийся на
_bot
, напримерpolar_nick_test_bot
- В ответ вам будет выслан
HTTP API
(в дальнейшемключ бота
), что-то вроде332239602:AAHGJSrMvTxVm239c3JJzHaz239mXyEE9tI
3) Библиотека Telegram API
Все взаимодействие с серверами телеграмма обернуто в нескольких удобных библиотеках, в рамках данной статьи предлагается использовать данную библиотеку - TelegramBots.
Создайте пустой проект, назвав его например TelegramEcho
.
Скачайте отсюда файл telegrambots-<версия>-jar-with-dependencies.jar
.
Теперь эту библиотеку надо подключить к проекту:
File->Project Structure->Libraries
- Зеленый плюсик сверху слева ->
Java
- Указать скачанный файл, нажать
Ok
4) Простой echo-bot
Создаем какой-нибудь класс и пишем в нем main
-функцию - точку входа в приложение:
public static void main(String[] args) {
Наследуем наш класс от TelegramLongPollingBot
. Например:
public class MyTelegramBot extends TelegramLongPollingBot {
Не забываем все ошибки Cannot resolve symbol
решать через Alt+Enter->Import class
.
В данном случае появится в том числе ошибка Class must either be declared abstract or implement abstract method...
.
Надо реализовать эти методы, по аналогии с тем как мы это делали при обработки нажатия кнопок/движения мышек/получения сообщений в задании 41 (Alt+Enter -> Implement methods
).
В main
-функции надо инициализировать библиотеку и запустить наш бот:
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try {
telegramBotsApi.registerBot(new MyTelegramBot());
} catch (TelegramApiException e) {
e.printStackTrace();
}
Теперь надо действительно реализовать те абстрактные методы, которые нам достались в наследство. Два из них заполняются тривиально - теми значениями, которые вы указали или получили на шаге 2 (в процессе регистрации бота):
@Override
public String getBotUsername() {
return "polar_nick_test_bot"; // Username вашего бота, второе значение которое вы указывали при регистрации
}
@Override
public String getBotToken() {
return "332339602:AAHGJSrMvTxVm0iCc3JJzHazToqmXyEE9tI"; // Ключ бота, который был выдан в конце регистрации
}
Осталось делать что-нибудь, когда бот получает сообщения. Это делается в onUpdateReceived
:
Message message = update.getMessage(); // Получаем текст входящего сообщения
System.out.println("New message: " + message.getText()); // Пишем в консоль о том, какое сообщение было получено
Но просто записывать в консоль полученное сообщение не интересно. Давайте ответим пользователю этим же сообщением в ответ:
SendMessage sendMessage = new SendMessage(); // Создаем объект, в котором опишем сообщение, которое хотим послать в ответ
sendMessage.setChatId(message.getChatId().toString()); // Укажем, что отправить это сообщение следует в чате, из которого мы получили сообщение
sendMessage.setText("Echo: " + message.getText()); // Укажем текст сообщения
try {
sendMessage(sendMessage); // Отправим сообщение
} catch (TelegramApiException e) {
e.printStackTrace(); // Это обработка исключительных ситуаций - на случай если что-то пойдет не так
}
Еще например можно было бы отправлять это сообщение как “ответ” на входящее сообщение:
sendMessage.setReplyToMessageId(message.getMessageId());
5) Дополнительные материалы
Взаимодействие с vkontakte: для этого есть библиотека, которая оборачивает взаимодействие с API. С помощью этой библиотеки можно написать бота для vkontakte.
Забор информации с произвольного сайта: для этого надо выкачивать соответствующую html-страницу, и из нее извлекать информацию. Помочь может например библиотека jsoup. Примеры работы с этой библиотеки можно нагуглить, например это.
6) Отправка задания
ВАЖНО
Обратите внимание, что API-ключ бота дает доступ и контроль над ботом. Поэтому если кто-то получит доступ к этому ключу - он сможет перехватить контроль над ботом. Поэтому при отправки кода мне или кому-либо еще - обязательно удалите
API-ключ бота из исходников.
Отправляйте выполненное задание ввиде zip-архива src
папки, и пожалуйста:
- Тему письма называйте правильно, например:
Задание 61 16-1 Полярный Коля
- Правильно названный zip-архив (или 7zip), внутри которого папка
src
с.java
файлами, пример названия:61_16_1_polyarniy_nikolay.zip