/telegram-bot-example1-java

Пошаговая инструкция, как сделать телеграм бота на JAVA 15 Preview

Primary LanguageJava

Как сделать бота для telegram на java?

Как вы выбираете кандидата, кому доверить задание? Я задался этим вопросом, после того, как отклонили мое предложение о разработке бота для "вконтакте". Это задело мое самолюбие. На работе я делаю куда более сложные вещи, чем разработка ботов. Как доказать тому человеку, который находится по ту сторону экрана, который незнает меня и не доверяет, что я могу сделать простейшего бота информатора? Ответ есть — сделать этого бота и задокументировать процесс его создания. Статья расчитана на новичков, желающих познакомится с новым стандартом java 15 и простейшим ботостроением. Итак, нам понадобятся:

  • IntelliJ IDEA CE
  • Java JDK_15_PREVIEW
  • Библиотека для взаимодействия с телеграмом

С какими трудностями мы столкнемся? Для меня, самым сложным было настроить среду разработки для работы с джавой 15 превью версии. Нужно отдельно настроить gradle и выставить в настройках запуска проекта аргумент "--enable-preview".

Начнем по порядку с создания проекта: Рис. 1 Рис. 1 Создание нового проекта

Нажимаем на кнопку "New Project". Следом увидим вот такое меню:

Рис. 2 Рис. 2 Выбор типа проекта

За основу я взял сборщик проектов Gradle. Выбираем Java и затем кнопку Next

Рис. 3 Рис. 3 Задаем имя проекта

Теперь нужно дать имя проекту. В моем случае это "telegram-bot-example-java"

Рис. 4 Рис.4 Ждем, пока проект проиндексируется

Какое-то время идея и gradle будут загружаться. Кстати, я уже допустил одну ошибку в конфигурации проекта, заметили, какую? Вернемся к этому позже.

Рис. 5 Рис.5 Создание структуры java packages

Кликаем правой кнопкой по папке "src/main/java" -> New -> Package -> "org.example.tgbot"

Рис. 6 Рис. 6 Создаем точку входа в программу

Теперь самое главное, без чего программа не запустится — точка входа и метод "main". Выбираем "org.example.tgbot" -> New -> Java Class. Называем новый класс Main.

Рис. 7 Рис. 7 Файл Main.java

Вот такой код должен быть в файле "Main.java". Обратите внимание на две зеленые стрелки рядом с определением класса и метода "main". Если вы их видите, значит сделали все правильно и IDEA может запустить ваш проект.

Рис. 8 Рис. 8 Тестовый запуск

Проверим, что все ок, запустив проект.

Рис. 9 Рис. 9 Успешный запуск

Если все хорошо, вы должны увидеть "done". У меня он есть, значит, можно продолжать.

Рис. 10 Рис. 10 Проверяем новую фичу java 15

Итак, вот мы дошли до ошибки, о которой я упоминал выше. В чем тут дело? Тип "record" был добавлен в java 15 и в превью версии должен присутствовать. Но я при запуске указал джаву восьмой версии. Что теперь делать? Можно сделать новый проект и указать правильную версию. Или можно исправить текущий проект. Сделать новый слишком просто, поэтому я исправлю этот (на самом деле нет, я попробовал, это не решило проблему).

Рис. 11 Рис. 11 Настройки проекта

Исправляем проблему. Нужно поменять версию джавы.Открываем настройки проекта.

Рис. 12 Рис. 12 Настройки версии java

Выбираем "Project SDK" -> 15. Если у вас ее нет, можно скачать ниже, в выпадающем списке. В "Project language level" выбираем "15 (Preview) — Sealed types, records, patterns, local enums and interfaces". Сохраняем настройки.

Рис. 13 Рис. 13 Record тип работает

Теперь все ок, можно наконец-то взяться за программирование? Увы, нет. IDEA распознает новые фичи, но кроме нее есть еще gradle, который не сможет скомпилировать этот код. Чтобы это проверить, создаим рядом с "Main.java "еще один файл — "Bot.java" в котором будет происходить обработка сообщений.

Рис. 14 Рис. 14 Bot.java

У gradle будут проблемы со сборкой этого файла, а именно — из за 11 строки. Модификатор "sealed", как и "record", является экспериментальным. Проверим, соберем проект.

Рис. 15 Рис. 15 Gradle error

Еще немного борьбы и мы запустим этот код. Нужно настроить сборку gradle и добавить аргумент "--enable-preview" при запуске.

Рис. 16 Рис. 16 Gradle java 15 settings

Нужно добавить новую секцию, в которой будут задаваться флаги сборки "--enable-preview" и "-Xlint:Preview". Второй флаг не обязательный, нужен для отображения новых warnings. В комментарии пример, как можно задать все флаги одной строкой. Кроме этого, нужно добавить строку "jvmArgs(['--enable-preview'])" в секцию "test". На этом с gradle закончили.

Рис. 17 Рис. 17 Настройки сборки

Далее, нужно добавить аргумент для виртуальной машины java. Отрываем настройки.

Рис. 18 Рис. 18 Открыть меню "Add VM options"

После чего у вас появится поле редактирование опций виртуальной машины.

Рис. 19 Рис. 19 Редактор опций виртуальной машины

В пустое поле вписываем "--enable-preview". Также проверьте, что у вас стоит "java 15". Сохраняем настройки и собираем проект. У меня сборка и запуск прошли успешно. Теперь настроим прием сообщений и ответы.

Рис. 20 Рис. 20 Bot.java

Добавляем следующий код в файл "Bot.java". В нем два метода, хотя можно было обойтись и одним, выбранная мною библиотека присилает обновления в виде массива, а не по одному. Ах да, я забыл показать, как добавить эту библиотеку.

Рис. 21 Рис. 21 Добавляем зависимость в "build.gradle"

В секцию "dependencies" добавьте строку "implementation 'com.github.pengrad:java-telegram-bot-api:5.0.1'" как показано на рисунке (13 строка). И финальный штрих, обновляем Main класс, чтобы запустить бота.

Рис. 22 Рис. 22 Новый Main класс

Здесь я читаю BOT_TOKEN из переменных среды, это значит, ее нужно как то добавить. Это можно сделать глобально в системе или задать в IDEA. Я выбираю второй вариант.

Рис. 23 Рис. 23 Снова открываем "Edit configurations"

Рис. 24 Рис. 24 Редактирование переменных среды

В поле "Environment variables" вставьте строку "BOT_TOKEN=123", где 123 — ваш токен. А я вставлю свой :) Сохраняем настройки и запускаем проект.

Рис. 25 Рис. 25 Бот успешно запущен

Бот работает! Пруф:

Рис. 25 Рис. 25 Телеграм чат

Скорее всего, если вы захотите проверить моего бота, он вам не ответит. Потому что программа, которую мы написали, запущена локально, у меня на компьютере. Чтобы бот работал 24/7, программу нужно разметить на удаленном сервере (или просто держать компьютер всегда включенным всесте с запущенной программой). Это материал для другой статьи. Я также могу рассказать, как сделать ответы на команды в чате, отображать динамическую информацию, информировать клиентов. Или как написать бота на scala >_<. Пишите в комментариях, что у вас не получилось. До встречи в других статьях!