telegram bot — Как установить Webhook. Как узнать информацию по Webhook вашего бота
Если Вы пришете своего telegram bot-а, возможно вы выберите в качестве механизма обновления данных Webhook. Тогда Вам придётся разобраться с тем, как же настроить Webhook.
После регистрации бота у Вас появится его личный токен.
-
Для настройки Webhook достаточно перейти в браузере по индивидуальной ссылке, которую Вам нужно предварительно сгенерировать. Ссылка вида (текст и квадратные скобки заменить на корректные данные):
Инструкция по созданию Telegram ботов. Часть 3. Пишем простого чат-бота для Telegram на чистом php (webhook)
Создавать в Telegram аккаунты ботов мы уже научились (в предыдущей части), пора чего-нибудь накодить. Сегодня я покажу как создать простого чат-бота для Telegram на чистом, незамутнённом php, без всяких дополнительных библиотек и фреймворков. Такой чат-бот может использоваться, например, для организации чата на сайте или в интернет-магазине. При этом для связи с Telegram наш бот будет использовать вебхуки.
Итак, у нас есть домен (MYDOMEN), место на сервере от какого-либо хостера, поддержка https, а также мы зарегистрировали в Telegram аккаунт бота (BOTNAME) и получили токен (BOTTOKEN). Теперь нам нужно написать программу самого бота.
В общем виде у нашего бота будет следующий функционал:
- сообщения, отправляемые юзерами боту, пересылаются ботом админу с пометкой от кого это сообщение
- сообщения, отправляемые админом боту, пересылаются указанному юзеру (админ в своём сообщении должен указать кому оно предназначено)
Сначала опишем задуманный выше функционал более детально. Пусть наш бот понимает 3 команды: /start, /help, /send. Формат и выполняемые действия у этих команд будут такими:
- /start, /help — отвечают юзеру приветствием и выдают список команд с описанием
- /send message или /send chat_idmessage (в зависимости от того, кто эту команду отправляет)
- Если команда отправлена не админом, — она отправляет в чат бота с админом сообщение chat_id: message, где chat_id — идентификатор чата бота с юзером от которого это сообщение отправлено. В этом случае указывать chat_id в самой команде не нужно.
- Если команда отправлена админом, — она отправляет в чат с идентификатором chat_id сообщение message. В этом случае в команде нужно указать chat_id адресата.
Вот теперь переходим к кодингу.
Создаём папочку MYBOT, в ней файл bot.php, открываем его в каком-нибудь приличном блокноте, типа notepad++ или akelpad (сразу настраиваем кодировку «utf8 without bom») и пишем:
Вот и всё. Код, в общем-то, рабочий, теперь осталось залить папочку MYBOT с файлом bot.php к себе на сервак и установить на него webhook.
Для того, чтобы установить webhook, — достаточно просто отправить запрос вида:
Для того, чтобы отменить webhook — нужно отправить такой же запрос, но без урла, указывающего расположение бота. То есть вот такой:
Итак, файл залит, webhook установлен. Первым делом нужно узнать id своего чата с ботом командой /whoami. Далее нужно отредактировать файл bot.php, вписав этот id в ADMINCHATID. После всего этого команду /whoami можно из файла bot.php удалять, она больше не нужна.
На этом этапе наш чат должен заработать, однако расслабляться пока рано. Теперь нужно хоть немного решить вопросы с безопасностью.
Telegram-бот на вебхуках — Java+Spring, Redis, клавиатуры и деплой на Heroku — снова для самых маленьких

Это вторая статья в моей серии «для самых маленьких» — предыдущая была посвящена «классическому» Telegram-боту, наследуемому от TelegramLongPollingBot .
Для кого написано
Если вы ни разу не писали Telegram-ботов на Java с использованием вебхуков и только начинаете разбираться — эта статья для вас. В ней подробно и с пояснениями описано создание реального бота, автоматизирующего одну конкретную функцию. Можно использовать статью как мануал для создания скелета своего бота, а потом подключить его к своей бизнес-логике.
Я пытаюсь писать как для себя, а не сразу для умных — надеюсь, кому-нибудь это поможет быстрее въехать в тему.
Предыстория
Учить словарные слова — занятие довольно скучное, а если делать это в лоб, ещё и малоэффективное, поэтому я решил разработать для дочери задания такого вида:

Ребёнок сначала выбирает правильный вариант, а затем закрепляет его написанием. По ощущениям, запоминание идёт неплохо. Дело оставалось за малым — написать бота и составить словари неправильных написаний.
Что в статье есть, чего нет
В статье есть про:
- создание бекенда Telegram-бота на вебхуках на Java 11 с использованием Spring;
- использование базы данных Redis;
- отправку пользователю текстовых сообщений и файлов;
- подключение постоянных и временных клавиатур;
- локальный запуск бота для дебага;
- деплой и запуск бота на Heroku, включая подключение к проекту Heroku Redis.
- использование функций ботов, не перечисленных выше;
- работу с Apache POI — создание Word и Excel файлов;
- общение с BotFather (создание бота, получение его токена и формирование списка команд подробно и понятно описано во многих источниках, вот первый попавшийся мануал;
- создание и загрузку в БД словарей по умолчанию.
Бизнес-функции бота
- создавать Word-файлы с заданиями из имеющихся словарей (стандартных или пользовательского);
- скачивать имеющиеся словари в Excel-файлы (для корректировки и последующей загрузки в качестве пользовательского словаря);
- загружать пользовательский словарь;
- выводить справку.

Порядок разработки
- разобраться с зависимостями;
- сконфигурировать БД;
- создать бота;
- реализовать обработку сообщений, включая работу с клавиатурами;
- раскурить приём и отправку файлов;
- завести локально;
- задеплоить на Heroku.
Зависимости
Для управления зависимостями используем Apache Maven. Нужные зависимости — собственно Telegram Spring Boot, Redis и Lombok, использовавшийся для упрощения кода (заменяет стандартные java-методы аннотациями).
Вот что вышло в
Конфигурируем базу данных Redis
Создадим модель — классы-сущности, объекты которых должны храниться в БД. В каждом из них должны быть ключ и значение — очень похоже на привычную Map<K,V> . В нашем случае сущности всего две — словарное слово
Для сохранения объектов в БД и обращения к ним нам нужны два конвертера, переводящие объект «Слово» в массив байт (да-да, Redis нужно скормить именно его) для сохранения
… и обратно для получения объектов из БД.
С использованием конвертеров создадим файл конфигурации.
Наконец, нужно создать репозиторий. Привыкшим к Postgre (как я) будет особенно приятно узнать, что работу с Redis поддерживает набивший оскомину CrudRepositoty<T, ID> . Поскольку мы используем только его стандартные методы, оставляем репозиторий без своих методов:
К классу Word напрямую я не обращаюсь, поэтому для него репозиторий не нужен.
Создаём бота
Начнём с добавления в application.yaml (или application.properties , если так привычнее) настроек:
- telegram.api-url — тут всё просто, https://api.telegram.org/ ;
- telegram.webhook-path — адрес вебхука, который должен быть зарегистрирован в Telegram (об этом ниже, в разделе «Запускаем локально»);
- telegram.bot-name и telegram.bot-token — имя и токен бота, полученные от BotFather.
Далее, чтобы эти настройки можно было использовать в коде, создадим небольшой
Теперь создадим класс бота и унаследуем его от SpringWebhookBot —
MessageHandler и CallbackQueryHandler — обработчики (соответственно) сообщений и нажатий на кнопки инлайн-клавиатур (подробнее ниже, в разделе «Обрабатываем сигналы»).
Методы класса направляют получаемый от пользователей сигнал в необходимый класс-обработчик в зависимости от его типа (сообщение или нажатие на кнопку инлайн-клавиатуры).
Для создания бина бота нам нужна ещё одна конфигурация:
Поскольку наш бот — это веб-приложение, для доступа к нему нам нужен контроллер:
Ну и где-то должен быть метод main(), чтобы всё это запустилось. Создадим стандартный для Spring класс:
Бот готов, осталось научить его общаться с пользователем.
Обрабатываем сигналы
Как уже говорилось, наш бот получает от пользователя сигналы двух типов — сообщения и нажатия на кнопки инлайн-клавиатур. Эти сигналы обрабатываются в классах MessageHandler и CallbackQueryHandler , а маршрутизация между ними осуществляется в классе бота WriteReadBot (его код чуть выше, в разделе «Создаём бота»).
Классы-обработчики служат связующим звеном между ботом и бизнес-логикой решаемой задачи — в зависимости от конкретного полученного значения происходит обращение к нужного методу внешнего сервиса. Код этих классов можно посмотреть в этом пакете на Github, а в статье рассмотрим только две ключевых детали — создание клавиатур и работу с файлами.
Постоянная клавиатура
Чтобы сразу было понятно, вот это она:

Постоянная клавиатура — это основное меню бота. Она создаётся в отдельном классе путём создания отдельных кнопок, затем их рядов и, в завершении, присвоения клавиатуре нужных признаков:
Для удобства названия кнопок можно вынести в отдельный ButtonNameEnum (на GitHub), но это необязательно — можно прописать их текстом прямо в классе.
Инициализируется клавиатура в рамках обработки команды /start (то есть при первом обращении пользователя к боту) в классе-обработчике сообщений MessageHandler . Необходимо:
Кроме того, в классе MessageHandler надо не забыть обработать текстовые сообщения, отличные от названий кнопок — наш бот в этом случае призывает пользователя воспользоваться клавиатурой.
Инлайн-клавиатуры

В нашем боте инлайн-клавиатуры используются для выбора пользователем словаря и отображаются в ответ на команды основного меню «Создать файл с заданиями» и «Скачать словарь». Состав кнопок отличается всего на одну позицию — при обработке команды «Скачать словарь» добавляется кнопка «Шаблон». Кроме того, если пользователь загрузил в базу данных свой словарь, при обработке обеих команд в клавиатуру добавляется кнопка «Ваш словарь».
Также, как и постоянная клавиатура, инлайн-версия формируется в отдельном классе:
В отличие от кнопок постоянных клавиатур, инлайн-кнопкам можно добавлять не только название (которое видит пользователь), но и ответное значение, которое будет отправлено при нажатие на неё.
Инициализация инлайн-клавиатуры происходит:
Отправка и получение файлов
Наш бот умеет как отправлять пользователю готовые файлы заданий и словарей, так и получать от него пользовательский словарь для загрузки в базу данных.
Отправка и загрузка файлов происходит в отдельном классе, в котором реализовано REST-взаимодействие с сервисами Telegram:
Методы этого класса используются в классах-обработчиках MessageHandler и CallbackQueryHandler .
Для отправки файла пользователю необходимо перевести его в объект класса ByteArrayResource и отправить POST-запрос на адрес вида:
https://api.telegram.org/bot<токен бота>/sendDocument?chat_id=<id чата>
При загрузке пользовательского файла в составе объекта Document приходит идентификатор файла. Чтобы скачать файл, необходимо отправить GET-запрос на адрес вида:
https://api.telegram.org/bot<токен бота>/getFile?file_id=<id файла>
Следует обратить внимание, что скачивается объект File из пакета org.telegram.telegrambots.meta.api.objects , и для последующего использования мы переводим его в привычный java.io.File .
Подключаем Heroku Redis для локального запуска
Идём на Heroku и выполняем алгоритм:
- Зарегистрироваться (если нет аккаунта)
- Создать проект — нажать «New»/«Create new app» в правой части экрана
- Перейти на вкладку «Resources»
- В разделе «Add-ons» ввести в поисковую строку «Heroku Redis», выбрать её в результатах поиска
- Подтвердить подключение БД к проекту
- В правом верхнем углу нажать на иконку в виде квадрата из синих точек, выбрать пункт Data, в открывшемся списке баз нажать на только что созданную. Первые несколько минут после подключения может тормозить и показывать ошибку
- Перейти на вкладку «Settings»
- Нажать на кнопку «View credentials» в правой части экрана
- Вуаля, перед Вами настройки подключения к БД
spring.redis.database: 0
spring.redis.host: <хост БД Redis, копируем с Heroku>
spring.redis.port: <порт БД Redis, копируем с Heroku>
spring.redis.password: <пароль БД Redis, копируем с Heroku>
spring.redis.ssl: trueПолный application.yaml можно посмотреть ниже, в разделе «Запускаем локально».
Запускаем локально
Нам осталось сделать вебхук и зарегистрировать его в Telegram.
Для получения внешнего адреса при локальном запуске используем утилиту ngrok по вот этой инструкции. Не забываем добавить в application.yaml настройки telegram.webhook-path (выдаст ngrok) и server.port (передаётся ngrok в качестве параметра)
Вот так выглядит итоговый (для локального запуска с использованием БД Redis на Heroku)
Регистрируем вебхук в Telegram, формируя в строке браузера запрос вида:
https://api.telegram.org/bot<токен бота>/setWebhook?url=<URL, полученный от ngrok>
… видим ответ:Деплоим на Heroku
Если используется версия Java, отличная от 8, необходимо в корне проекта создать файл system.properties , содержащий одну строку:
java.runtime.version=<версия Java, в нашем случае 11>
Ещё один специфический для Heroku файл Procfile в данном случае можно не добавлять, он будет сгенерирован автоматически на основе pom.xml .
Сначала нужно обязательно удалить/закомментировать в application.yaml настройки подключения к БД — она подцепится автоматически, поскольку подключена к проекту на Heroku. Если оставить эти настройки, ничего не заведётся, они нужны только для внешнего подключения к этой БД.
Также нужно изменить настройку webhook-path — это адрес веб-приложения на Heroku. Чтобы его получить, надо нажать на кнопку «Open app» в интерфейсе Heroku, убедиться, что приложение запустилось (должна отображаться надпись «Whitelabel Error Page» — значит, успех) и скопировать содержимое адресной строки.
Вот так должен выглядеть готовый к деплою на Heroku
- в консоли heroku create <имя приложения> (либо heroku git:remote -a <название проекта> , если приложение на Heroku уже было создано ранее)
- в интерфейсе Heroku создать в проекте БД Heroku Redis (если ранее это не было сделано — алгоритм выше, в разделе «Запускаем локально»)
- в консоли mvn clean install
- в консоли git push heroku master
- в консоли heroku ps:scale web=1 — установить количество используемых контейнеров (dynos) для типа процесса web
- открыть приложение — нажать на кнопку «Open app» в интерфейсе Heroku, убедиться, что оно запустилось (должна отображаться надпись «Whitelabel Error Page» — значит, успех)
- зарегистрировать вебхук в Telegram (алгоритм выше, в разделе «Запускаем локально»), используя URL из адресной строки предыдущего пункта
При необходимости в интерфейсе Heroku на вкладке «Deploy» можно переключить деплой на GitHub-репозиторий (по запросу или автоматически).
Что можно доделать
Как известно, Heroku гасит веб-приложения, которые не используются какое-то время, поэтому на первое сообщение бот может отвечать порядка 8-10 секунд — он ждёт, когда приложение развернётся с нуля. Это позволяет на бесплатном тарифе хостить много редко используемых веб-приложений — в тарифе учитывается только время аптайма.
Чтобы заставить приложение работать постоянно, можно добавить в проект пинг по расписанию условного Google, но нужно понимать, что в этом случае бот будет съедать львиную долю бесплатного тарифа. Я жадный, я так делать не буду.
Синхронизация бота Telegram с помощью setWebhook
Telegram — быстро развивающийся мессенджер, множество программистов уже попробовали себя в создании ботов для telegram.
В данной статье мы разберёмся с созданием самоподписанного сертификата, научимся устанавливать этот сертификат в nginx и научим нашего бота получать обновления с помощью способа WebHook.
Методы взаимодействия с ботом:
Телеграмм разрешает устанавливать свои сертификаты https, что позволит нас не покупать дорогостоящий сертификат.
Для взаимодействия с пользователем в телеграмме используются 2 принципиально разных способа.
Этот метод используется для получения обновлений через long polling (wiki). Ответ возвращается в виде массива объектов Update. У данного способа обновлений есть масса недостатков. Мы должны сами запрашивать с сервера список сообщений пользователей, что не очень удобно. Для этого мы должны запрашивать каждые n секунд с сервера телеграмма данные. Это ресурсоёмко и не рационально. Лично я, не рекомендую без крайне необходимости использовать данный способ.
Существует ещё один способ получения сообщений от бота. Это использование WebHook. Идея заключается в том, что сервер сам будет присылать нам сообщения пользователя, а мы будем решать, что с ними делать. Каждый раз при получении обновления на этот адрес будет отправлен HTTPS POST с сериализованным в JSON объектом Update. В основном мы будем работать с объектом Message, который, соответственно, получим из Update.
Настройка синхронизации бота telegram с помощью setWebHook:
Приступим к настройке данного способа синхронизации. Для начала нам будет необходимо создать и настроить ssl сертификат.
У меня на сервере установлен дистрибутив FreeBSD, соответственно все дальнейшие действия описаны для этой системы.