Простой бот 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. Интерфейс бота
Определим команды, на которые наш бот будет реагировать:
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=
Далее порядок такой:
Как написать телеграмм бота на java
Как сделать бота для telegram на java?
Как вы выбираете кандидата, кому доверить задание? Я задался этим вопросом, после того, как отклонили мое предложение о разработке бота для «вконтакте». Это задело мое самолюбие. На работе я делаю куда более сложные вещи, чем разработка ботов. Как доказать тому человеку, который находится по ту сторону экрана, который незнает меня и не доверяет, что я могу сделать простейшего бота информатора? Ответ есть — сделать этого бота и задокументировать процесс его создания. Статья расчитана на новичков, желающих познакомится с новым стандартом java 15 и простейшим ботостроением. Итак, нам понадобятся:
С какими трудностями мы столкнемся? Для меня, самым сложным было настроить среду разработки для работы с джавой 15 превью версии. Нужно отдельно настроить gradle и выставить в настройках запуска проекта аргумент «—enable-preview».
Начнем по порядку с создания проекта: Рис. 1 Создание нового проекта
Нажимаем на кнопку «New Project». Следом увидим вот такое меню:
Рис. 2 Выбор типа проекта
За основу я взял сборщик проектов Gradle. Выбираем Java и затем кнопку Next
Рис. 3 Задаем имя проекта
Теперь нужно дать имя проекту. В моем случае это «telegram-bot-example-java»
Рис.4 Ждем, пока проект проиндексируется
Какое-то время идея и gradle будут загружаться. Кстати, я уже допустил одну ошибку в конфигурации проекта, заметили, какую? Вернемся к этому позже.
Рис.5 Создание структуры java packages
Рис. 6 Создаем точку входа в программу
Рис. 7 Файл Main.java
Вот такой код должен быть в файле «Main.java». Обратите внимание на две зеленые стрелки рядом с определением класса и метода «main». Если вы их видите, значит сделали все правильно и IDEA может запустить ваш проект.
Рис. 8 Тестовый запуск
Проверим, что все ок, запустив проект.
Рис. 9 Успешный запуск
Если все хорошо, вы должны увидеть «done». У меня он есть, значит, можно продолжать.
Рис. 10 Проверяем новую фичу java 15
Итак, вот мы дошли до ошибки, о которой я упоминал выше. В чем тут дело? Тип «record» был добавлен в java 15 и в превью версии должен присутствовать. Но я при запуске указал джаву восьмой версии. Что теперь делать? Можно сделать новый проект и указать правильную версию. Или можно исправить текущий проект. Сделать новый слишком просто, поэтому я исправлю этот (на самом деле нет, я попробовал, это не решило проблему).
Рис. 11 Настройки проекта
Исправляем проблему. Нужно поменять версию джавы.Открываем настройки проекта.
Рис. 12 Настройки версии java
Рис. 13 Record тип работает
Теперь все ок, можно наконец-то взяться за программирование? Увы, нет. IDEA распознает новые фичи, но кроме нее есть еще gradle, который не сможет скомпилировать этот код. Чтобы это проверить, создаим рядом с «Main.java «еще один файл — «Bot.java» в котором будет происходить обработка сообщений.
У gradle будут проблемы со сборкой этого файла, а именно — из за 11 строки. Модификатор «sealed», как и «record», является экспериментальным. Проверим, соберем проект.
Рис. 15 Gradle error
Еще немного борьбы и мы запустим этот код. Нужно настроить сборку gradle и добавить аргумент «—enable-preview» при запуске.
Рис. 16 Gradle java 15 settings
Нужно добавить новую секцию, в которой будут задаваться флаги сборки «—enable-preview» и «-Xlint:Preview». Второй флаг не обязательный, нужен для отображения новых warnings. В комментарии пример, как можно задать все флаги одной строкой. Кроме этого, нужно добавить строку «jvmArgs([‘—enable-preview’])» в секцию «test». На этом с gradle закончили.
Рис. 17 Настройки сборки
Далее, нужно добавить аргумент для виртуальной машины java. Отрываем настройки.
Рис. 18 Открыть меню «Add VM options»
После чего у вас появится поле редактирование опций виртуальной машины.
Рис. 19 Редактор опций виртуальной машины
В пустое поле вписываем «—enable-preview». Также проверьте, что у вас стоит «java 15». Сохраняем настройки и собираем проект. У меня сборка и запуск прошли успешно. Теперь настроим прием сообщений и ответы.
Добавляем следующий код в файл «Bot.java». В нем два метода, хотя можно было обойтись и одним, выбранная мною библиотека присилает обновления в виде массива, а не по одному. Ах да, я забыл показать, как добавить эту библиотеку.
Рис. 21 Добавляем зависимость в «build.gradle»
В секцию «dependencies» добавьте строку «implementation ‘com.github.pengrad:java-telegram-bot-api:5.0.1′» как показано на рисунке (13 строка). И финальный штрих, обновляем Main класс, чтобы запустить бота.
Рис. 22 Новый Main класс
Здесь я читаю BOT_TOKEN из переменных среды, это значит, ее нужно как то добавить. Это можно сделать глобально в системе или задать в IDEA. Я выбираю второй вариант.
Рис. 23 Снова открываем «Edit configurations»
Рис. 24 Редактирование переменных среды
В поле «Environment variables» вставьте строку «BOT_TOKEN=123», где 123 — ваш токен. А я вставлю свой 🙂 Сохраняем настройки и запускаем проект.
Рис. 25 Бот успешно запущен
Рис. 25 Телеграм чат
Скорее всего, если вы захотите проверить моего бота, он вам не ответит. Потому что программа, которую мы написали, запущена локально, у меня на компьютере. Чтобы бот работал 24/7, программу нужно разметить на удаленном сервере (или просто держать компьютер всегда включенным всесте с запущенной программой). Это материал для другой статьи. Я также могу рассказать, как сделать ответы на команды в чате, отображать динамическую информацию, информировать клиентов. Или как написать бота на scala >_
About
Пошаговая инструкция, как сделать телеграм бота на JAVA 15 Preview
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. У меня есть такая штука где я подставляю инлайн клавиатуру и есть обработчик
Вопрос тот же — как сделать чтобы после нажатия виртуальной кнопки сервис ждал ввода пользователя, а потом печатал то, что юзер отправил в сообщении боту