Telegram webhook не работает
Для всего этого нам понадобится (или правильнее будет сказать, что было использовано мной):
1) Apache 2.2.24
2) OpenSSL (входящий в установку апача)
3) 1C (с модулями веб-сервера)
4) Свой домен
5) Созданный бот в Телеграм (не буду описывать его создание, т.к. оно достаточно тривиально)
Предполагается, что весь софт у вас установлен.
Итак, начнем с получения сертификата. Открываем командную строку и выполняем следующий код:
YOURPRIVATE.key - закрытый ключ сертификата. Будет использован в апаче
YOURPUBLIC.pem - открытый ключ сертификата. Будет использован при регистрации вебхука
YOURDOMAIN.EXAMPLE - адрес вашего домена с вебхуком. Должен таки совпадать с адресом вебхука.
После выполнения этого кода в папке openssl ( у меня это "C:\Program Files\Apache Software Foundation\Apache2.2\bin") появятся файлы ключей.
Я их скопировал в папку conf апача.
Переходим к настройке Apache.
Я видел много разных способов. У меня сработал следующий:
для того, чтобы апач "слушал" 443 порт.
Блок <IfModule ssl_module> приведен к следующему виду:
В самом конце добавлены строчки, где указываю пути к сертификату:
И раскоменитурйте строчку:
На стороне вебсервера все готово. Переходим к 1С.
В моём случае указаны следующие параметры:
Имя: ТГВебхук
КорневойURL: webhook
Повторное использование сеансов: Не использовать (с автоматическим режимом у меня не заработало)
Время жизни: 20
Шаблоны URL: создан шаблон "Любой" с двумя методами: GET и POST
Обработчики методов создаются по умолчанию. В обработчик POST добавлю следующее, просто для проверки связи:
Прошу не пинать ногами за код, некоторые вещи умышленно сделаны хардкодом, т.к. это всё делалось исключительно в демонстрационных целях.
Публикация была написана, т.к. ни одного рабочего примера по работе с вебхуками на сайте не нашел, кроме Конструктор ботов Телеграм. Но она платная и, возможно, не всем нужна в таком виде.
Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.
Как пишут в документации, общаться с серверами Telegram бот может двумя способами:
Разницу можно изобразить следующим образом:
Что нужно сделать:
Сертификат
С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.
Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.
Серверная часть
Ставим необходимые пакеты:
И сокращённо код бота теперь такой:
Обратите также внимание на отличия от стандартного примера из репозитория:
- в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
- удалён код снятия и установки webhook’а.
Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:
То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:
Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:
Тогда сервис запустился нормально.
Теперь осталось самое, как оказалось, сложное - зарегистрировать endpoint бота в Telegram. Сложности возникли потому, что я сначала неправильно понял принцип составления endpoint’а, а также из-за проблем с проверкой сертификата.
Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:
Но потом я его видимо задолбал, и он стал возвращать мне следующее:
Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.
Проверить статус webhook’а можно таким запросом:
Если всё нормально, должно вернуть такое:
Как видим, в поле url стоит наш endpoint.
Однако, мне оно сейчас возвращает такое:
Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.
Ну и всё, не так уж и сложно. Если бы в документации (и сторонних манулах из интернетов) была указана такая простая вещь, что для webhook’а всего-то нужен лишь веб-сервер на стороне бота, я бы это сделал уже сто лет назад. Конечно, продвинутым чувакам это скорее всего было очевидно сразу, но мнe - нет.
Поэтому сегодня мы поговорим о том, что такое Telegram Webhook. Также в процессе повествования рассмотрим особенности функционала, а также область применения, методы настройки.
Что такое Telegram Webhook
Webhook – это технология, позволяющая отслеживать протекающие в мессенджере события в режиме реального времени. Главное преимущество такого подхода – доставка данных на указанный адрес через систему eSputnik.
Это позволяет собирать и доставлять информацию без непосредственного реагирования оператора.
Эта технология лучше всего реализуется в работе ботов. Они бывают несколько нескольких типов: игровые, ассистенты, чат-боты и информаторы.
Само взаимодействие организуется следующим образом:
- Пользователь пишет команду в чат с программным кодом.
- Встроенные алгоритмы принимают заявку и отправляют ее на сервера проекта.
- Команда обрабатывается, и передается обратно в понятной для пользователя форме.
- Алгоритм выводит информацию на дисплей.
Такая последовательность действий одинаково работает практически при любом взаимодействии с ботами. А технология Webhook упрощает этот процесс и обеспечивает стабильность протекающих процессов.
Если с этим все понятно, тогда давайте поговорим о том, как прописать бота с подобной технологией.
Как прописать бот на Вебхук
Процедура подключения бота на Вебхук несколько отличается от создания простого автоматизированного алгоритма – она основана на использовании самоподписного сертификата.
Для претворения задуманного в жизнь:
- Устанавливаем пакет openSSI.
- Создаем правильный ключ доступа и самоподписный сертификат.
Как только вы увидите значение этого кода статуса, можно считать процедуру успешно завершенной.
Если с этим пока все понятно, давайте поговорим о возможных проблемах при запуске бота на Вебхук.
Проблемы запуска
- Пропишите команду @Botfather. Она поможет коду избавиться от проблем и ошибок в коде. Если все совсем плохо, будет автоматически создана исправленная копия бота.
- Активируем чат командой /setprivacy. После указания адреса ваших алгоритмов, программа опубликует список ошибок и даст рекомендации по их исправлению.
- Если чат не работает, а bot работает в штатном режиме, обратитесь за разъяснениями в службу технической поддержки.
- Если помощник полностью вышел из строя и не работает, откройте исходный код и проверьте его на предмет ошибок.
Итоги
Взаимодействие с системой представлено связкой: телеграмм-бот-сервер-обработка-бот-чат в Телеграмме. Таким образом можно организовать общение полностью автоматизированным, и отвлекать только изредка.
Сама процедура прикручивания бота к Телеграмму имеет несколько особенный в виде создания дополнительного сертификата, который используется для связи сервера с ботом.
Если у вас возникли проблемы с ботом, проверьте исходный код на предмет ошибок или обратитесь за помощью в службу технической поддержки.
В статье представлена исчерпывающая информация по теме, так что вам, дорогие друзья, остается использовать полученные знания на практике. Пробуйте, и у вас все получится!
это чат для сайта и инструмент для общения с клиентами через Telegram.
Как это работает
Посетитель получает ответ
Возможности и преимущества
Установка
Для работы чата вам следует выполнить следующие шаги
После выполняения всех этих шагов, кнопка чата должна появится. Подробнее о всех шагах описано ниже
Установка модуля и добавление компонента
После установки модуля, добавьте компонент Telegram.Messenger на требуемую страницу или в footer.php шаблона сайта из визуального редактора
или добавьте код вызова компонента в режиме исходного кода:
<?$APPLICATION -> IncludeComponent (
"bit:telegram.helper" ,
"" ,
array(
"HIDE_IF_NO_CONNECTION" => "Y" ,
),
false
); ?>
Регистрирация telegram бота и получение token кода
После создания модуля, обязательно установите token бота в настройках в соответсвующее поле. Без token кода компонент работать не будет.
Есть два метода получения обновлений от телеграм бота — использование webHook и использование getUpdate. Модуль поддерживает оба эти метода:
Этот метод работает так: на своем сервере вы запускаете скрипт-демон, который постоянно запрашивает обновления у telegram бота. Демон - это приложение, которое работает самостоятельно в фоновом режиме, без остановок и без участия пользователя. На деле - это обычный php скрипт, который выполняет бесконечный цикл.
Для включения демона на сервере лучше всего добавить запуск скрипта в cron. В скрипте реализован функционал исключающий дублирование процессов.
Для этого метода ssl сертификат не нужен, но требуется определенный навык для запуска скрипта демона и добавления его в список задач cron.
Для работы модуля требуется настройка в PHP - "allow_url_fopen = On"
Настройка демона getUpdate.
Для работы модуля в таком режиме вам следует проделать несколько простых шагов
Сперва вам следует включить демон. Его можно запустить через консоль командой:
php /здесь путь к вашему document_root/bitrix/modules/bit.telegramhelper/tools/serv.php
В таком случае скрипт начнет свой бесконечный цикл получения обновлений с сервера Telegram. При таком запуске, при первом же обрывы соединения, демон завершит свою работу, и модуль перестанет работать. Чтобы этого избежать, нужно вызов демона добавить в cron. Тогда он будет запускаться автоматически в фоновом режиме. Для этого введите команду в консоли
и добавьте там строчку
* * * * * php /здесь путь к вашему document_root/bitrix/modules/bit.telegramhelper/tools/serv.php
Путь к скрипту демона указан в настройках модуля
Также добавления демона в cron возможно через панель управления хостингом и этот предпочтительно. Например в timeweb добавление выглядит так:
Убедитесь в том что процесс демона запущен и работает. Для этого введите команду в консоли
ps aux | grep php
демон чата должен быть в списке процессов.
Режим получения обновления webhook
В этом режиме все гораздо проще. Единственное, что нужно сделать для включения этого режима, это передать в telegram путь к скрипту webhook. Это можно осуществить в настройках модуля, выбрав в выпадающем списке «Метод получения обнволения» режим «webhook». Перед установкой webhook, убедитесь в наличие скрипта webhookа в корне сайте. Имя файла скрипта указано в настройках модуля:
Имя скрипта сгенерировано при установке. Имя можете поменять в настройках и переименовать скрипт.
Настройка
Настройка модуля
Подключение ассистентов
Ассистент должен из-под своего аккаунта в telegram найти вашего бота и написать ему что-нибудь. В ответ бот попросит вас ввести пароль, который вы сможете найти в настройках модуля. Пароль генериуется рандомно при установке модуля и может быть изменен в настройках модуля.
Если вы незнакомы с ботами в Telegram, рекомендуется сначала прочитать ознакомительную статью.
Также, возможно, вас заинтересует описание Bot API.
Общие вопросы
Как я могу создать бота?
Создание бота для Telegram крайне простое, однако, вам понадобится кое-какой опыт в программировании. Для работы вашего бота вам необходимо осуществить первоначальную настройку через бота @BotFather, а затем подключить его к вашему серверу через API.
К сожалению, какого-либо способа создать бота без программирования не существует. Поэтому, если вы не разработчик, лучше поищите себе готового бота или закажите его разработку.
Можно посмотреть примеры кода?
Вот два бота-образца, написанных на PHP:
-
: демонстрация основных возможностей Bot API. : более сложный бот, поддерживающий оба способа получения обновлений (long-polling и вебхуки).
Многие разработчики создают своих ботов с открытым исходным кодом. Мы собираем их на специальной странице.
Добавьте в ботов фичу X!
API ботов — весьма молодой проект. Есть ещё масса возможностей, которые уже рассматриваются к реализации. Пока что администрация Telegram наблюдает за тем, как пользователи используют своих ботов, чтобы понять, в каком направлении необходимо развивать платформу.
Если у вас есть мысли по этому поводу, вы можете высказать их пользователю @BotSupport (на английском).
Получение обновлений
Как можно получать обновления?
На текущий момент доступно два способа. Вы можете использовать либо опрос, либо вебхуки. Обратите внимание: если вы используете вебхуки, метод getUpdates работать не будет.
Доступные порты: 443, 80, 88, 8443.
Опрос всегда выдаёт один и тот же результат!
Метод getUpdates выдаёт 100 последних неподтверждённых обновлений. Чтобы подтвердить обновление, используйте параметр offset при вызове getUpdates вот так:
Все обновления с update_id меньшим или равным offset будут отмечены как подтверждённые и не будут больше возвращаться сервером.
У меня проблема с вебхуками
Если вы успешно задали адрес вебхука, но не получаете обновлений, убедитесь, что:
- SSL-сертификат вашего вебхука валиден и корректен
- При использовании самозаверенного сертификата, вы передаёте его публичный ключ в поле certificate метода setWebhook. Необходимо загружать InputFile , отправка строки не сработает.
- Ваш вебхук работает на одном из допустимых портов: 443, 80, 88, 8443.
У меня проблема с самозаверенным сертификатом
Ознакомьтесь с инструкцией по созданию сертификатов. Если после прочтения у вас остались вопросы, напишите пользователю @BotSupport.
Как мне убедиться, что запросы идут с серверов Telegram?
Для этого включите ваш токен в адрес вебхука, примерно так:
Так как никто посторонний не знает вашего токена, запросы на этот адрес смогут отсылать только сервера Telegram.
Это возможно при использовании вебхуков. Преимуществом является сокращение числа запросов, недостатком — невозможность получения результата запроса и его статуса.
Всякий раз при получении обновления на вебхук, у вас есть два варианта:
Пример реализации этой возможности на PHP можно посмотреть в коде HelloBot.
Обработка медиафайлов
Как скачивать файлы?
Для этого используйте метод getFile .
Этот метод работает только для файлов объёмом до 20 МБ.
Как закачать большой файл?
Как долго хранится file_id у файлов?
file_id у отправленных вашим ботом файлов будут удалены после отправления нескольких тысяч файлов.
Для принятых файлов file_id можно считать вечным и неизменным.
Массовая рассылка
Как получить список всех подписчиков моего бота?
К сожалению, пока сделать это встроенными методами нельзя. Возможно, в будущем будут добавлены пару строк для управления подписчиками.
Сайт про Telegram на русском (неофициальный).
Здесь собраны приложения на базе MTProto, переведена некоторая документация с официального сайта, а также работает Webogram.
Читайте также: