Размер
Как написать робот для Telegram на java с использованием Eclipse
Play

Как написать робот для Telegram на java с использованием Eclipse

Эта статья — краткое руководство — как в среде Eclipse написать самый простой рабочий шаблон робота для телеграмма , который в последствии можно расширять и дописывать до полноценного бота.

  1. Открываем eclipe и создаем новый Java проект
  2. Качаем отсюда (выбирать «with-dependencies») библиотеку для создания Telegram роботов
  3. Добавляем эту библиотеку в проект
  4. Создаем класс test.SimpleBot со следующим содержимым:

Собственно, в методе 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. В примере этого нет, но об этом стоит помнить.

А как сделать локализацию? Может подскажете?

Язык интерфейса меняется следующим образом:

  • Подписываетесь на робот @telerobot
  • Пишите ему: Locale Android (если у вас андройд) или Locale iOS — соответственно если iphone
  • Загрузите файл нажатием на сообщение с ним. Нажмите на знак с тремя точками в блоке сообщения и выберите «Apply localization file». Если у вас iPhone, то нажмите на файл выберите “Apply localization file”.

Будьте добры напишите пожалуйте пример :

для сценария погода — клик

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)

код package test;

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

📎📎📎📎📎📎📎📎📎📎