Как зарегистрировать webhook в telegram

от admin

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, а в статье рассмотрим только две ключевых детали — создание клавиатур и работу с файлами.

    Постоянная клавиатура

    Чтобы сразу было понятно, вот это она:

    image

    Постоянная клавиатура — это основное меню бота. Она создаётся в отдельном классе путём создания отдельных кнопок, затем их рядов и, в завершении, присвоения клавиатуре нужных признаков:

    Для удобства названия кнопок можно вынести в отдельный ButtonNameEnum (на GitHub), но это необязательно — можно прописать их текстом прямо в классе.

    Инициализируется клавиатура в рамках обработки команды /start (то есть при первом обращении пользователя к боту) в классе-обработчике сообщений MessageHandler . Необходимо:

    Кроме того, в классе MessageHandler надо не забыть обработать текстовые сообщения, отличные от названий кнопок — наш бот в этом случае призывает пользователя воспользоваться клавиатурой.

    Инлайн-клавиатуры

    image

    В нашем боте инлайн-клавиатуры используются для выбора пользователем словаря и отображаются в ответ на команды основного меню «Создать файл с заданиями» и «Скачать словарь». Состав кнопок отличается всего на одну позицию — при обработке команды «Скачать словарь» добавляется кнопка «Шаблон». Кроме того, если пользователь загрузил в базу данных свой словарь, при обработке обеих команд в клавиатуру добавляется кнопка «Ваш словарь».

    Также, как и постоянная клавиатура, инлайн-версия формируется в отдельном классе:

    В отличие от кнопок постоянных клавиатур, инлайн-кнопкам можно добавлять не только название (которое видит пользователь), но и ответное значение, которое будет отправлено при нажатие на неё.

    Инициализация инлайн-клавиатуры происходит:

    Отправка и получение файлов

    Наш бот умеет как отправлять пользователю готовые файлы заданий и словарей, так и получать от него пользовательский словарь для загрузки в базу данных.

    Отправка и загрузка файлов происходит в отдельном классе, в котором реализовано 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, соответственно все дальнейшие действия описаны для этой системы.

    Читать:
    Как удалить глобальный поиск в телеграмме

Похожие статьи