Простой бот Telegram на Java с нуля
Сегодня мы будем писать простейшего бота Telegram, который будет отвечать на команды. Такая статья была, но писали бота на Питоне.
Java в плане ботов, серверов, плагинов да и вообще программ будет удобнее для меня.
1. Виртуальная машина хоть и долгая, но если обрабатывать события в несколько потоков, то будет работать быстро.(Вообще для многих серверов/мультиплеерных игр в одном потоке не всегда получится обрабатывать события, в Jav’e сделать это гораздо проще)
2. Наличие хорошей документации и Javadoc’ов, которые можно сделать для всех библиотек(не только для системных)
Бот — это профиль в соцсети/мессенджере(в данном случае Telegram) который отвечает на команды.( В любом случае все действия буду происходить после выполнения команды)
Тип чата с ботом — это переписка 1 на 1.
1.С чего же начинать?
Здесь качать библиотеку Telegram(обязательно with-dependiciens)
IDE можно выбрать любую, я бы порекомендовал eclipse.
Импотрируем библиотеку Телеграма и приступаем.
2.Наследование бота
Для того чтобы отвечать на команды, класс должен наследовать TelegramLongPillingBot
Получить токен и username можно вбив в поиск @BotFather и написать ему /newbot
3.Как же нам добавить в него что-нибудь?
В телеграме нет «приветствующего сообщения», но когда мы нажимаем кнопку «Start» чтобы начать общение с ботом, то автоматом прописывается команда «/start», поэтому для начала добавим именно её. В telegramapi нету метода отправить сообщение по типу send(строка), но мы его создадим, после всех войдов пишем:
А в UpdateReceived дописываем это:
4.Ура, всё получилось, как запустить?
Можно в Runnable JAR File так как у нас есть метод main, но лучше запускать прямо из IDE:
Когда мы запустили бота, зарегистрировали и получили токен у BotFather, то мы можем написать ему /start и увидеть что всё работает. Но бот будет работать только когда он запущен.(Много ему не нужно, за 50-100 рублей/месяц на хостинге можно держать). Также с помощью Telegram API можно отправлять картинки, создавать inline-ботов с кнопками и многое другое, но о этом уже в продолжении…
Пример использования Java-библиотеки для создания Telegram-бота
Каждый разработчик (и не только), который использует Telegram в повседневной жизни, хотя бы раз задумывался о том, каково это — создать своего бота, на сколько это сложно и какой язык программирования лучше использовать.
На все эти вопросы могу дать самый простой (и, наверно, самый правильный) ответ: все зависит от вас самих, ваших знаний и намерений.
… Но в этой небольшой статье, я покажу, как можно создать своего бота на языке Java и что это довольно интересно и несложно.
Мы будем использовать библиотеку для работы с Telegram Bots API и ее расширение, позволяющее создавать свои команды (‘ /custom_cmd ‘) и обрабатывать их простым способом.
Задачей бота будет являться регистрация пользователя и отправка сообщения от указанного им имени другим пользователям бота.
Создание нового проекта и подготовка
1. Добавление зависимостей в проект
Telegram API — библиотека для работы с Telegram Bots API, содержит в себе классы и методы для взаимодействия с сервисами Telegram и некоторые расширения этих классов.
2. Создание аккаунта для бота
Для этого нам необходимо обратиться за помощью к боту BotFather:
После выполнения этих команд мы получим токен, который нам понадобится для использования Bot API. (7xxxxxxx2:Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0)
Реализация
1. Модель анонимного отправителя сообщений
Данные, необходимые нам от каждого пользователя:
Добавим сервис, содержащий часто используемые методы для манипулирования множеством анонимных пользователей.
2. Интерфейс бота
Определим команды, на которые наш бот будет реагировать:
inaword
Блог о разработке и современных технологиях
Как написать робот для Telegram на java с использованием Eclipse
Собственно, в методе onUpdateReceived сравниваются отправленный пользователем текст с командами робота и отправляются соответствующие сообщения. Чтобы изменить робота просто добавьте свои команды в этот метод.
Может быть полезно:
inaword 02.02.2016 08.12.2020
Читайте также
Базовые тесты для разработчика DApp
Пишем смарт-контракт Ethereum — это просто: Часть 11 — ICO, refund — возврат средств по softcap
Пишем смарт-контракт Ethereum — это просто: Часть 10 — ICO, исходники на Etherscan, типы эмиссии
Стандарт ERC223 и его отличия от ERC20
1 Комментарий
Огромное спасибо! Кратко и по делу:)
А если Eclipse закрыть, бот не будет работать? Как сделать, чтобы он всегда работал?
Бот будет работать все время пока ваша программу будет запущена. Естественно после закрытия Eclipse программа остановится.
Я запускаю программу бота на отдельном сервере, который у меня постоянно работает.
а как добавить виртуальную клавиатуру?
В методе sendMsg, сразу после строчки «sendMessage.enableMarkdown(true);» добавить следующий код (пример клавиатуры из четырех кнопок).
(И не забудьте обновить библиотеку, в статье по ссылке она обновлена)
После добавления вирт клавиатуры, все появилось и все вроде работает, но
сыпет эксепшены:
дек 06, 2016 12:00:28 PM org.telegram.telegrambots.logging.BotLogger severe
SEVERE: BOTSESSION
org.telegram.telegrambots.exceptions.TelegramApiRequestException: Error getting updates: [409] Conflict: terminated by other long poll or webhook
at org.telegram.telegrambots.api.methods.updates.GetUpdates.deserializeResponse(GetUpdates.java:96)
at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$ReaderThread.run(DefaultBotSession.java:177)
дек 06, 2016 12:00:28 PM org.telegram.telegrambots.logging.BotLogger severe
SEVERE: BOTSESSION
org.telegram.telegrambots.exceptions.TelegramApiRequestException: Error getting updates: [409] Conflict: terminated by other long poll or webhook
at org.telegram.telegrambots.api.methods.updates.GetUpdates.deserializeResponse(GetUpdates.java:96)
at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$ReaderThread.run(DefaultBotSession.java:177)
дек 06, 2016 12:00:28 PM org.telegram.telegrambots.logging.BotLogger severe
SEVERE: BOTSESSION
org.telegram.telegrambots.exceptions.TelegramApiRequestException: Error getting updates: [409] Conflict: terminated by other long poll or webhook
at org.telegram.telegrambots.api.methods.updates.GetUpdates.deserializeResponse(GetUpdates.java:96)
at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$ReaderThread.run(DefaultBotSession.java:177)
Скорее всего вы запустили две копии робота.
update.getMessage();
Получит сообщение если такое вообще есть. (это личка)
А как быть с груп чатами? У меня он не отлавливает сообщения.
— Бот в чате есть.
— сообщения пробовал отправлять с «/»
— пробовал переключить «/setprivacy» на «Disable»
Надо/setprivacy» на «Disable» и бота надо исключить из группы и заново добавить. Была такая же проблема.
А если у меня допустим такой сценарий — пользователь отправляет команду /старт
потом бот у него что-то спросит
а потом пользователь что-то еще ответит
как это реализовать?
Вся логика должна быть в методе onReceiveUpdate:
1. Бот ожидает сообщение от пользователя
2. Читает сообщение и если понимает его то отвечает
Спасибо! Очень информативно! Вы не думали создать серию видео уроков написания на java? Думаю многим было бы полезно.
Уроков по Java очень много и много очень хороших и простых книг. Но если есть интересующие вас темы по каким-то слабо освещенным вопросам, то можно подумать…
Exception in thread «main» com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for org.telegram.telegrambots.generics.BotSession was bound.
while locating org.telegram.telegrambots.generics.BotSession
1 error
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1045)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1054)
at org.telegram.telegrambots.ApiContext.getInstance(ApiContext.java:25)
at org.telegram.telegrambots.TelegramBotsApi.registerBot(TelegramBotsApi.java:83)
at com.nastin.bot.SimpleBot.main(SimpleBot.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Да действительно. Библиотеку разработчики изменили. Статью обновил.
В main добавьте самую первую строчку:
Спасибо еще раз! Благодаря Вашему вступительному уроку по созданию бота на джаве, мне удалось двинуться дальше. Хотел у Вас спросить такое: сдеть заложенна схема общения с ботом вопрос-ответ. Как можно сделать так, что бы бот через определленый промежуток времени присылал уведомления?
К сожалению с инлайн режимом не работал, но думаю ответ кроется в этой строчке:
update.getCallbackQuery().getData() — возвращает ответ.
Пример отправляет сообщение «Вам пришли новости» каждые пять секунд после того как пользователь ввел команду «/start».
После того как пользователь удалит бота — нужно удалить поток, отправляющий сообщения, иначе бот будет кидать Exception. В примере этого нет, но об этом стоит помнить.
А как сделать локализацию? Может подскажете?
Язык интерфейса меняется следующим образом:
Будьте добры напишите пожалуйте пример :
для сценария
погода — клик
response: current weather click Send /current, or weather for three days sends /weatherthree
sendMsg(message, current weather);
> else if(message == «/weatherthree»)
respone:enter your location
Заранее огромное спасибо
Не работает( выдает ошибку в этой и еще некоторых строках
import org.telegram.telegrambots.TelegramApiException;
Какую ошибку выдаёт? Вариантов не много — либо библиотека другой версии, либо вы забыли подключить библиотеку.
Попробовал развернуть пример в NetBeans — работает! Только ссылка на гитхабовскую библиотеку уже битая.
У меня следующая задача: клиенты пишут боту вопросы, эти вопросы бот перефутболивает операторам (point-to-point), операторы отвечают боту, бот возвращает ответы к соответствующим клиентам.
Возникает вопрос с параллелизмом: если пишут сразу несколько клиентов, то не перемешаются ли сообщения (в одной сессии)? И как переслать ответ нужному клиенту — запоминать ID сообщения или чата?
Да,ссылка битая.Подскажите,а где вы тогда скачали библиотеку?
Вышла новая версия библиотеки. Статью исправил.
Качать отсюда — https://github.com/rubenlagus/TelegramBots/releases/
Там обязательно выбирать «with dependencies»
Добрый день, уважаемый автор.
Большое вам спасибо за небольшой, но крайне информативный урок.
Можете ещё подсказать куда копать в решении задачи написания собственного маленького клиента к телеграмму под android?
Интернет даёт ссылку на официальную библиотеку tdlib (Telegram Database Library) но я никак не могу найти ни одного достаточно простого примера её использования.
Добрый день, ругается на setOneTimeKeyboad, List и ArrayList. Видать не хватает какой-то библиотеки, хотя я установил самую последнюю версию. (это из кода с виртуальной клавиатурой, в сообщении выше)
setOneTimeKeyboad(false); — тут пропущена буква r в слове Keyboard. должно быть:
setOneTimeKeyboard(false);
Вы скопировали текст из комментария. Там поправлю.
Насчет List и ArrayList — это стандартные коллекции из библиотеки Java. Добавьте импорты:
import java.util.List;
import java.util.ArrayList;
Добрый день, запускаю и получаю ошибку. Интернет через прокси, может в этом дело?
авг 16, 2017 5:19:34 PM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to ->https://api.telegram.org:443
org.telegram.telegrambots.exceptions.TelegramApiRequestException: Error executing setWebook method
at org.telegram.telegrambots.bots.TelegramLongPollingBot.clearWebhook(TelegramLongPollingBot.java:56)
at org.telegram.telegrambots.TelegramBotsApi.registerBot(TelegramBotsApi.java:120)
at test.SimpleBot.main(SimpleBot.java:19)
Caused by: java.net.SocketException: Socket is not connected: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
Подскажите пожалуйста, как заставить бота отправить сообщение всем, кто на него подписан?
Вроде всё сделал по уроку, а выдаёт ошибку. В чём может быть причина?
Exception in thread «main» java.lang.ClassNotFoundException: Main
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:123)
import org.telegram.telegrambots.exceptions.TelegramApiException;
import org.telegram.telegrambots.ApiContextInitializer;
import org.telegram.telegrambots.TelegramBotsApi;
import org.telegram.telegrambots.api.methods.send.SendMessage;
import org.telegram.telegrambots.api.objects.Message;
import org.telegram.telegrambots.api.objects.Update;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
public class SimpleBot extends TelegramLongPollingBot <
public static void main(String[] args) <
ApiContextInitializer.init();
TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
try <
telegramBotsApi.registerBot(new SimpleBot());
> catch (TelegramApiException e) <
e.printStackTrace();
>
>
@Override
public String getBotUsername() <
return «———«;
>
@Override
public String getBotToken() <
return «—————————«;
>
private void sendMsg(Message message, String text) <
SendMessage sendMessage = new SendMessage();
sendMessage.enableMarkdown(true);
sendMessage.setChatId(message.getChatId().toString());
sendMessage.setReplyToMessageId(message.getMessageId());
sendMessage.setText(text);
try <
sendMessage(sendMessage);
> catch (TelegramApiException e) <
e.printStackTrace();
>
>
Точно скачали библиотеку по ссылке и добавили в проект?
Подскажите как отправить документ в чат, пробовал аналогичным образом метод sendDocument создать, но ошибки:
org.telegram.telegrambots.exceptions.TelegramApiRequestException: Error sending document: [400] Bad Request: wrong persistent file_id specified: Wrong character in the string
at org.telegram.telegrambots.api.methods.send.SendDocument.deserializeResponse(SendDocument.java:165)
at org.telegram.telegrambots.bots.DefaultAbsSender.sendDocument(DefaultAbsSender.java:163)
at Bot.sendDocument(Bot.java:103)
at Bot.onUpdateReceived(Bot.java:66)
at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:271)
Привет,
у меня есть бот который отвечает на запросы и есть кнопки внизу экрана(благодаря inaword). Мне требуется сделать что бы когда пользователь нажимал на кнопки, бот задавал вопросы, человек отвечает на несколько вопросов, и так что бы я потом получил все данные которые ввел пользователь.
Спасибо.
Статья агонь!
Господа, только начал изучать Java, поэтому малость «подтормаживаю»… Нужна ваша помощь…!
Есть такая вот «хотелка»…
Требуется, чтобы бот получал от пользователей некие данные (числовые, целые), производил бы с ними некоторые операции и отправлял бы результат в определенную группу в Telegram… Например:
Один из пользователей отправил боту такой набор данных —
500 (Дима собрал 500 яблок в саду)
15 (он распределил их по 15-ти корзинам)
6 (в шести корзинах были отобраны только красные яблоки)
4 (в четырех — только зелёные)
5 (в пяти корзинах — смешанного цвета)
Таких пользователей, к примеру — 7.
Задача бота, например, сделать сумму по каждой из позиций и отправить в группу:
1. Упорядоченные данные по каждому из пользователей
2. Итог (сумму) по всем пользователям.
Возможно? Реально? Насколько сложно? Где и что почитать? Может кто черкнёт какие «наброски»? Спасибо! И да, статейка годная!
Привет, спасибо большое за столь информативную статью, но у меня есть вопрос: Как просто отправить сообщение с бота? Я имею ввиду вводишь код, перезагружаешь бота, и он отправляет сообщение. Все мои попытки проводили к тому, что бот отправлял сообщение только отвечая на реплику юзера.
Здравствуйте как получить данные от пользователя в телеграмме
И как использовать хранилище
Я использую Ability и прокси. У меня нет теперь onReceiveUpdate. У меня есть такая штука где я подставляю инлайн клавиатуру и есть обработчик
Вопрос тот же — как сделать чтобы после нажатия виртуальной кнопки сервис ждал ввода пользователя, а потом печатал то, что юзер отправил в сообщении боту
Telegram-бот на Java для самых маленьких — от старта до бесплатного размещения на heroku
Для кого написано
Если вы ни разу не писали Telegram-ботов на Java и только начинаете разбираться — эта статья для вас. В ней подробно и с пояснениями описано создание реального бота, автоматизирующего одну конкретную функцию. Можно использовать статью как мануал для создания скелета своего бота, а потом подключить его к своей бизнес-логике.
Предыстория
Когда моя дочь начала изучать арифметику, я между делом накидал алгоритм генерации простых примеров на сложение и вычитание вида «5 + 7 =», чтобы не придумывать и не гуглить для неё задания.
И тут на глаза попалась новость, что Telegram выпустил новую версию Bot API 5.0. Ботов я раньше не писал, и потому решил попробовать поднять бота как интерфейс для своей поделки. Все примеры, которые мне удалось найти, показались либо совсем простыми (нужные мне функции не были представлены), либо очень сложными для новичка. Также мне не хватало объяснений, почему выбран тот или иной путь. В общем, написано было сразу для умных, а не для меня. Потому я решил описать свой опыт создания простого бота — надеюсь, кому-нибудь это поможет быстрее въехать в тему.
Что в статье есть, чего нет
Бизнес-функции бота
Порядок разработки
Зависимости
Для управления зависимостями использовался Apache Maven. Нужные зависимости — собственно Telegram Bots и Lombok, использовавшийся для упрощения кода (заменяет стандартные java-методы аннотациями).
Класс бота и обработка текстовых сообщений
В качестве параметров для инициализации бота используются его имя и токен, полученные от BotFather. В ходе разработки удобно создать тестового бота и прописать его параметры прямо в коде, чтобы проще было запускать бекенд локально и отлаживать прямо в Telegram, однако перед релизом стоит пересоздать бота и вынести эти настройки из кода — например, в переменные окружения (об этом ниже).
Получился вот такой
Классы команд
Команды в моём боте делятся на 2 группы:
Начнём с более простых Сервисных команд. В абстрактный суперкласс вынесен метод отправки пользователю ответа, а в классах команд формируется текст ответа.
Абстрактный суперкласс Сервисных команд
Приложение
Получаем вот такой
Деплой на heroku
Если в проекте используется версия Java, отличная от 8, также необходимо создать в корне проекта файл system.properties и прописать в нём одну строку:
java.runtime.version=
Далее порядок такой:
Задание 61. Бот для телеграмма
Задание: реализовать программу-бота для телеграмма, которая будет отвечать на запросы пользователя (обычного человека, использующего телеграмм) и предоставлять для него полезную информацию.
Тема-пример этой статьи Бот-эхо :
Тема на оценку Бот-Remembrall :
Другие темы возможны по согласованию со мной.
Дедлайн:
1) Про ботов
2) Регистрация бота
Теперь надо попросить у него выдать для нас идентификатор (и сделать это с уважением):
3) Библиотека Telegram API
Теперь эту библиотеку надо подключить к проекту:
4) Простой echo-bot
public static void main(String[] args) <
public class MyTelegramBot extends TelegramLongPollingBot <
Осталось делать что-нибудь, когда бот получает сообщения. Это делается в onUpdateReceived :
Но просто записывать в консоль полученное сообщение не интересно. Давайте ответим пользователю этим же сообщением в ответ:
Еще например можно было бы отправлять это сообщение как “ответ” на входящее сообщение:
5) Дополнительные материалы
Взаимодействие с vkontakte: для этого есть библиотека, которая оборачивает взаимодействие с API. С помощью этой библиотеки можно написать бота для vkontakte.
Забор информации с произвольного сайта: для этого надо выкачивать соответствующую html-страницу, и из нее извлекать информацию. Помочь может например библиотека jsoup. Примеры работы с этой библиотеки можно нагуглить, например это.
6) Отправка задания
Отправляйте выполненное задание ввиде zip-архива src папки, и пожалуйста: