Задание: реализовать программу-бота для телеграмма, которая будет отвечать на запросы пользователя (обычного человека, использующего телеграмм) и предоставлять для него полезную информацию.

Тема-пример этой статьи Бот-эхо:

  • Бот отвечает таким же сообщением, какое пользователь отправил
  • Бот шлет Привет! Как дела? в 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.

Теперь эту библиотеку надо подключить к проекту:

  1. File->Project Structure->Libraries
  2. Зеленый плюсик сверху слева -> Java
  3. Указать скачанный файл, нажать 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