Синхронизация бота Telegram с помощью setWebhook

Напишем простой диалоговый Telegram-бот на Python и запустим его на сервере Heroku.

Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

Откройте Telegram, найдите @BotFather и начните беседу. Отправьте команду /newbot и следуйте инструкциям. Вы получите:

  • свой токен;
  • адрес Telegram API;
  • ссылку на документацию.

Обязательно сохраните токен, так как это ключ для взаимодействия с ботом.

Примечание Хранение токена должно быть локальным: ни в коем случае не выгружайте его в общий доступ.

Далее начните беседу с ботом. Введите в поисковой строке его имя и нажмите /start. Отправьте любое сообщение: оно станет первым обновлением, которое получит бот.

Установка Python

Для написания Telegram-бота на Python, нужно установить сам язык. Если вы пользуетесь Windows, скачать Python можно с официального сайта. Версия не важна, но в этой статье будет использоваться Python 3.x. Если же у вас Linux или macOS, то обе версии уже установлены.

Тем, кто только начал изучение этого языка, будет также полезна дорожная карта Python-разработчика.

Установка pip

Это менеджер пакетов. В версиях выше Python 2.7.9 и Python 3.4, а также на macOS/Linux он уже есть. Проверить это можно командой pip --version в терминале. Если же по каким-то причинам он отсутствует, установить его можно при помощи команды:

$ sudo apt-get install python-pip

Установка pyTelegramBotAPI

Есть два способа установить эту библиотеку:

  1. С помощью pip:
    pip install pytelegrambotapi
  2. Из исходников (требуется git):
    $ git clone https://github.com/eternnoir/pyTelegramBotAPI.git  $ cd pyTelegramBotAPI  $ python setup.py install

Давайте напишем простенькую программу приветствия. Для начала следует импортировать библиотеку и подключить токен Telegram-бота на Python:

import telebot  bot = telebot.TeleBot('TOKEN')  

Теперь напишем обработчик текстовых сообщений, который будет обрабатывать входящие команды /start и /help:

@bot.message_handler(commands=['start', 'help'])  def send_welcome(message):      bot.reply_to(message, f'Я бот. Приятно познакомиться, {message.from_user.first_name}')

Добавим ещё один обработчик для получения текстовых сообщений. Если бот получит «Привет», он также поздоровается. Все остальные сообщения будут определены, как нераспознанные:

@bot.message_handler(content_types=['text'])  def get_text_messages(message):      if message.text.lower() == 'привет':          bot.send_message(message.from_user.id, 'Привет!')      else:          bot.send_message(message.from_user.id, 'Не понимаю, что это значит.')

Запускаем бота следующей строкой:

bot.polling(none_stop=True)

Примечание Так мы задаём боту непрерывное отслеживание новых сообщений. Если бот упадёт, а сообщения продолжат поступать, они будут накапливаться в течение 24 часов на серверах Telegram, и в случае восстановления бота прилетят ему все сразу.

Juniors Online Conference

27 марта в 12:00, Онлайн, Беcплатно

tproger.ruСобытия и курсы на tproger.ru

Ну вот и всё, простенький бот в Телеграмме готов.

Последним шагом будет развёртывание бота на сервере. Зарегистрируйтесь на GitHub, если у вас ещё нет там аккаунта, и установите Git. Для этого на Linux выполните следующую команду:

$ sudo apt-get install git-all

На macOS и Windows его нужно скачать и установить вручную. И не забудьте зарегистрироваться на Heroku. Установите virtualenv:

$ pip install virtualenv

Создайте новую папку и перейдите в неё в терминале или командной строке. Инициализируйте в ней virtualenv:

$ virtualenv my_env

Имя не имеет значения, но лучше сделать его интуитивно понятным. Перейдите в папку my_env. Теперь нужно склонировать git-репозиторий. Введите команду:

$ git clone https://github.com/имя_вашего_профиля/имя_вашего_репозитория

Поместите скрипт в папку, полученную в результате выполнения команды git clone. Вернитесь в папку my_env и запустите virtualenv:

  • На Windows:
    $ scriptsactivate.bat
  • На Linux/macOS:
    $ source bin/activate

Если вы успешно запустили virtualenv, приглашение командной строки должно начинаться с (my_env). Перейдите в папку репозитория и ещё раз установите модуль requests:

$ pip install requests

Теперь нужно создать список зависимостей Heroku. Это несложно. Введите:

$ pip freeze > requirements.txt

Создайте Procfile. В этом файле следует разместить инструкции по работе со скриптом. Имя файла обязательно должно быть Procfile (Procfile.windows в случае с Windows). У него не должно быть других расширений. Содержимое файла должно быть таким (замените my_bot на имя вашего скрипта):

web: python my_bot.py

Добавьте файл __init__.py в вашу папку. Он может быть пустым, но должен там быть. Отправьте коммит с изменениями в репозиторий:

$ git init  $ git add .  $ git commit -m 'короткое сообщение, описывающее изменения в коммите'  $ git push -u https://github.com/имя_вашего_профиля/имя_вашего_репозитория

Теперь развернём Telegram-бота на Heroku. Можно использовать и панель управления на сайте, но мы потренируемся делать всё через консоль.

Если вы пользуетесь macOS или Windows, установите интерфейс командной строки, следуя гайду. Если у вас Ubuntu, используйте следующие команды:

$ sudo add-apt-repository "deb https://cliassets.heroku.com/branches/stable/apt ./"  $ curl -L https://cli-assets.heroku.com/apt/release.key |  $ sudo apt-key add -  $ sudo apt-get update  $ sudo apt-get install heroku

Теперь выполните следующие команды:

$ heroku login  $ heroku create  $ git push heroku master  $ heroku ps:scale web=1  $ heroku open

С этого момента приложение должно работать на сервере Heroku. Если что-то пойдёт не так, проверить логи можно следующим образом:

$ heroku logs --tail

Поздравляем! Теперь вы знаете, как создать бота в Телеграм.

Кроме того, Telegram bot на Python можно дополнять другими функциями, например, добавить отправку файлов, опрос или клавиатуру.

Кстати, в этом мессенджере есть два типа клавиатур:

  1. Классическая RelpyKeyboardMarkup, у которой кнопки располагаются под полем ввода сообщения:
  2. Более современная InlineKeyboardMarkup, которая привязывается к конкретному сообщению:

Но и это полностью рабочий Телеграм-бот на Python: дополните словарём и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.

Адаптированный перевод «How to Create and Deploy a Telegram Bot?»

Все кто начинает писать различных telegram ботов рано или поздно доходят до бота на вебхуках (webhook).

Для чего нужны webhook?

Когда мы пишем telegram бота и запускаем без вебхуков, то наш бот (который крутится на нашем сервере / компьютере) постоянно обращается к серверам телеграмма и спрашивает есть ли для него информация. Иногда сервера телеграмма не отвечают или посылают куда подальше и наш бот перестает работать. Это в принципе не большая проблема, можно же положить наш скрипт под тот же самый supervisor, который будет перезапускать демонок со скриптом и в целом то вся проблема решена. Конечно при таком раскладе будет периодически простой бота в 2-15 сек (а может и больше, зависит еще от тачки на котором крутится бот) и еще наш бот будет постоянно обращаться к серверам телеграмма, создавая на них нагрузку. В принципе это не наша проблема, но почему не сделать по человечески? Почему не увеличить скорость работы бота, отказоустойчивость и убрать создаваемую нагрузку? Для этого и приходят к нам на помощь Webhook. При работе бота на вебхуках сервер телеграмма сам обращается к нашему боту когда есть новые данные. Собственно и на наш сервер нагрузки будет меньше, ведь бот чаще будет простаивать, что рассмотрим как несомненный плюс.

Что необходимо для Webhook?

Нам понадобится сервер с белым IP адресом и SSL сертификат, можно самоподписной. Так же если у вас есть дома статический (белый) IPадрес, то можно сделать проброс портов до компьютера, на котором будет работать телеграмм бот. Но имейте ввиду, что для вебхуков нужен один из портов 80, 443, 8443.

Собственно небольшое ТЗ: нужно поднять свой веб-сервер, который висит на порту 443 (например) с открытым SSL сертификатом. Я покажу как это делается на примере python и Flask.

Настраиваем сервер

Вообще в интернете много статей как настроить webhook для телеграмм бота на python, но блииииина, нигде не указана пара нюансов, из-за которых ничего не работает и приходится сидеть и копаться, причем на офф страничке по APITelegram так же ничего интересного не указано для корректной работы сервера.

Сразу же ставим сам Flask:

Нужно сделать самоподписной сертификат:

Путь до файла ключа и сертификата, как и название, подставьте свои.

Теперь нам нужно сделать своего бота в @BotFather (в телеграмме, уже не раз обсуждалось как его сделать, да и в инете гляньте, там полно статей с картинками) и привязать нашего бота к серверу через API телеграмма:

заменяем BOT_TOKEN на токен, который получили при создании бота и IP:PORT на IP адрес нашего сервера и порт, на котором будет поднят наш сервис.

Все готово для того, чтобы закодить наш сервис и принять первое сообщение:

Такой небольшой telegram bot на webhook, который при запросе /start присылает сообщение «Привет WebHook» .

Не забудьте подставить свой IP адрес в host=»IP» и url=»https://IP:PORT», и конечно же указать правильный пути до сертификатов.

Теперь можно запустить бота и отправить ему /start. В логе фласка можно будет увидеть POST запрос в корень «сайта», в котором уже происходит наша обработка.

Вроде ничего сложного, но первый раз я потратил достаточно времени чтобы понять что нужно затирать вебхуки перед новым запуском и заново их привязывать, при этом открыв файл с сертификатом на чтение и передав в API телеграмма.

Если кому то вообще ничего не понятно, то просто копируйте команды терминала и код python, и все будет работать.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

logo-telegram-300x300.pngTelegram — быстро развивающийся мессенджер, множество программистов уже попробовали себя в создании ботов для telegram.

В данной статье мы разберёмся с созданием самоподписанного сертификата, научимся устанавливать этот сертификат в nginx и научим нашего бота получать обновления с помощью способа WebHook.

Методы взаимодействия с ботом:

Телеграмм разрешает устанавливать свои сертификаты https, что позволит нас не покупать дорогостоящий сертификат.

Для взаимодействия с пользователем в телеграмме используются 2 принципиально разных способа.

Существует ещё один способ получения сообщений от бота. Это использование WebHook. Идея заключается в том, что сервер сам будет присылать нам сообщения пользователя, а мы будем решать, что с ними делать. Каждый раз при получении обновления на этот адрес будет отправлен HTTPS POST с сериализованным в JSON объектом Update. В основном мы будем работать с объектом Message, который, соответственно, получим из Update.

Настройка синхронизации бота telegram с помощью setWebHook:

Приступим к настройке данного способа синхронизации. Для начала нам будет необходимо создать и настроить ssl сертификат.

Генерация и установка ssl сертификата:

Чтобы создать сертификат нам необходимо выполнить следующие действия:

Создадим папку в которую поместим наши полученные сертификаты:

Генерируем наш сертификат с помощью OpenSSL.

Обратите внимание, что вместо

Вы должны написать имя своего домена, в моём случае это

После выполнения данных действий в папке /ssl/, должны появится 2 файла: YOURPRIVATE.key и YOURPUBLIC.pem

Если всё получилось, то переходим к следующему шагу. Так как телеграмм передаёт всё по безопасному протоколу ssl мы должны настроить свой сервер, чтобы он поддерживал его. У меня установлен nginx, соответственно, мы будем работать с ним.

Конфигурация веб-сервера:

Переходим к конфигурации веб-сервера. Нам понадобится файл конфигурации nginx — nginx.conf. У меня он находится в папке: /usr/local/etc/nginx.

Открываем файл и переходим к разделу с нашим веб сервером.

У меня он выглядит следующим образом:

Мы должны добавить несколько строк, чтобы сервер начал поддерживать https.

В итоге у нас должно получится следующие:

После выполнения всех пунктов необходимо перезапустить nginx

Отлично. На данные момент мы имеем установленный и работающий сертификат. У нас всё готово для перехода к setWebhook.

Метод setWebHook:

Для начала разберёмся, что принимает на вход метод:

Параметры Тип Описание
url String HTTPS url для отправки запросов. Чтобы удалить вебхук,

отправьте пустую строку.

certificate InputFile Загрузка публичного ключа для проверки

корневого сертификата.

Подробнее в разделе про самоподписанные сертификаты.

URL — адрес до нашего скрипта-обработчика, куда будут приходить сообщения от сервера telegram.

certificate — наш полученный файл YOURPUBLIC.pem.

Установка метода синхронизации telegram bot с помощью setWebHook:

Теперь переходим на наш веб-сервер. Для удобства создадим папку telegram и в ней файл installhandler.php

У нас должно получится следующее:

kostyakulakov.ru/telegram/installhandler.php

Для безопасности я удалил все файлы, ссылка предоставлена для ознакомления с расположением файла инициализации обработчика.

Теперь вставим в наш файл следующий php код, который позволит зарегистрировать ссылку обработчика с помощью метода setWebhook

Не забудьте установить токен и путь до обработчика.

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

Потом в функции regHandler, мы формируем POST-запрос с сылкой на обработчик и прикреплённым ключом. Отправляем. Выводим результат.

Если всё прошло хорошо, то вы должны получит на экран следующее:

Если всё так и прошло, то переходим к следующему шага. Если нет, то пишите в комментарии, мы обязательно разберёмся и поможем вам.

Пример обработчика пользовательских сообщений:

Теперь создадим сам обработчик пользовательских сообщений. Мы уже указывали путь в функции до него: «https://kostyakulakov.ru/telegram/handler.php»

Создадим в папке telegram файл handler.php

и наполним его следующим кодом, который будет отвечать на пользовательские сообщения:

На каждое сообщение пользователя, она будет отвечать следующим образом: «{Имя пользователя}, я получила ваше сообщение!».

Выглядит это так:

IMG_4205-200x300.png

Дальше играет роль только ваша фантазия, можете обрабатывать сообщения и отвечать на них. Вы свободны в ваших действиях.

В конечном итоге мы смогли синхронизировать нашего бота с сервером, теперь мы можем обрабатывать сообщения от пользователя Telegram с помощью Web Hook.

Спасибо за внимание.

Используемые источники:

  • https://tproger.ru/translations/telegram-bot-create-and-deploy/
  • https://be-miner.info/telegram-bot-webhook-kak-nastroit-i-zapustit/
  • https://kostyakulakov.ru/telegram-bot-setwebhook/

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий