На сервере может происходить много разного: регистрации пользователей, новые комментарии, кто-то начал видеотрансляцию, поступили сигналы от датчиков, случились системные события и так далее. О некоторых таких событиях было бы здорово узнавать сразу, как они произошли. Если это наш собственный сервер, то всё просто: добавляем службу мониторинга и ждём, пока наступит нужное событие.
Но на внешних публичных серверах такое сделать не получится — доступ к скриптам нам никто не даст. Вместо этого владельцы серверов часто используют вебхуки.
Что такое вебхук
Вебхук — это технология оповещения о новых событиях на сервере. С английского webhook дословно переводится как «веб-крюк» — мы как бы цепляем крюк на сервер к какому-то событию, а когда оно наступает, то мы сразу узнаём об этом.
Новым событием может быть что угодно:
- регистрация нового пользователя,
- начало новой видеотрансляции,
- новый комментарий к записи,
- лайки, шеры и репосты,
- товар в корзине,
- новый товар на витрине,
- смена статуса по заявке.
Что такое WebApp в Telegram. Как работает и какие преимущества дает
Кроме самого события, сервер может передавать дополнительные данные: время события, логин пользователя, количество регистраций и другие параметры. Что именно передаёт сервер и в каком порядке — зависит от настроек сервера.
Чтобы сервер знал, куда отправлять данные, на странице делают специальное поле ввода адреса — туда мы вставляем адрес нашего сервера, который эти данные получит. Например, у конструктора страниц Тильда это сделано так: после выбора события, на которое нужно среагировать, мы попадаем на страницу, куда вводим адрес своего сервера, и выбираем, что ещё передавать:
Куда отправляются данные
Когда на сервере срабатывает вебхук, он отправляет данные на тот адрес, который мы сами указываем в настройках вебхука. Чтобы мы могли принять эти данные, по указанному адресу должен работать наш скрипт — он и будет обрабатывать входящие сообщения.
Получается, что в вебхуках участвуют два сервера: один отправляет данные, а второй принимает. Отправляет, соответственно, чужой; принимает — наш. Допустим, мы хотим сделать так, чтобы все данные, которые пришли в вебхуке, отправлялись нам на почту. Для этого создаём на сервере php-скрипт mail.php и кладём его, например, в папку myserver.ru/test . В скрипте пишем такое:
Теперь мы можем указать адрес myserver.ru/test как адрес для отправки вебхуков. Вот что произойдёт, когда на внешнем сервере сработает нужное событие:
Это самый простой пример обработки вебхуков. Вместо отправки данных по почте можно заносить их в свою базу, выполнять новые скрипты, запускать связанные микросервисы, оповещать пользователей и делать что угодно ещё.
Python Telegram Бот На WebHook | Как Создать И Использовать Вебхуки Для Отправки Уведомлений
Как на сервере появляются вебхуки
Чтобы сервер мог работать с вебхуками, их нужно создать заранее:
- Разработчики серверного софта прикидывают, о чём пользователям было бы полезно узнавать сразу, как только это случилось, например комментарии и новые регистрации.
- Добавляют механизм оповещений в свои скрипты.
- На отдельной странице на сервере создают поле для ввода адреса, на который будут отправляться данные.
Это значит, что не у каждого сервиса в интернете есть вебхуки — только у тех, которые сделали их специально.
Чем вебхук отличается от API
Ключевая разница между ними в том, кто первый начинает что-то делать.
Если мы работаем с сервером по API, то мы должны сначала сделать запрос, узнать, есть ли новые события, и если есть — сделать новый запрос, чтобы их получить:
С вебхуками всё проще: сервер сам следит за событиями и первый отправляет нам новые данные:
Как это применяется в жизни
Представим, что мы сделали на «Тильде» страницу с формой регистрации на мероприятие. Когда регистрируется новый участник, данные о нём попадают во внутреннюю систему «Тильды» и, например, записываются в новую гуглотаблицу — на этом действия после регистрации заканчиваются.
Но мы хотим, чтобы каждый участник после регистрации получил приветственное письмо. Для этого мы создаём новый вебхук в «Тильде» и указываем адрес нашего сервера. По этому адресу мы размещаем скрипт, который возьмёт данные из поступившего вебхука, добавит их в шаблон письма и отошлёт новому участнику. Получается, что с помощью вебхуков можно автоматизировать разные события и создавать цепочки действий, привязанных к этому событию.
Работа с объёмными данными
Вебхук — инструмент оповещения, а не передачи объёмных данных. Если мы захотим передавать через вебхук сразу много информации, сервер может заблокировать такие вызовы и запретить отправку данных на наш адрес. Если с сервера всё-таки нужно забирать что-то большое, лучше использовать API в связке с вебхуками:
- Настраиваем вебхук на сервере на нужное нам событие.
- Как только оно срабатывает — нам приходит оповещение.
- В этот момент мы отправляем на сервер API-запрос, где просим отдать нам много данных.
- Сервер через API отдаёт нам всё, что нужно.
При таком подходе мы решаем сразу две проблемы: сразу узнаём, что на сервере что-то произошло, и получаем стабильный канал передачи данных.
Вебхуки — не самый надёжный способ оповещений
Вебхук — это просто разовый POST-запрос на наш сервер. Это значит, что если по каким-то причинам мы не успели обработать этот запрос, то данные будут потеряны. У вебхуков нет гарантированной доставки, поэтому привязывать к ним критичные события не стоит — лучше поискать другой механизм мониторинга.
Ещё бывает так, что проблемы могут быть на самом сервере. Например, если зависнет сервис, который рассылает вебхуки, то мы об этом не узнаем и не получим новых данных.
Что дальше
Теперь, когда мы знаем, как работают вебхуки, можем сделать свой обработчик вебхуков на сервере и поработать с вебхуками из внешних сервисов. Этим займёмся уже в следующий раз.
Читаете «Код»? Зарабатывайте на коде
Сфера ИТ и разработки постоянно растёт и требует новых кадров. Компании готовы щедро платить даже начинающим разработчикам, а опытных вообще отрывают с руками. Обучиться на разработчика можно в «Яндекс Практикуме».
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Источник: thecode.media
Интеграция Входящие вебхуки и Telegram (Телеграм)
Подключение за 5 минут, 30 дней на тесты, попробуйте.
Какие данные можно передавать из Входящие вебхуки в Telegram
События в Входящие вебхуки
Нажмите на название события, чтобы посмотреть доступные поля.
Документация по API — нет.
1. Простая заявка
Описание
Доступные поля
event_name | Название события |
id | Id сущности |
name | Имя |
phone | Телефон |
telegram | Telegram |
price | Сумма заказа |
prime_cost | Себестоимость |
comment | Комментарий |
utm_source | Utm source |
utm_medium | Utm source |
utm_campaign | Utm campaign |
utm_content | Utm source |
utm_term | Utm term |
gclid | Google client id |
yclid | Yandex client id |
fclid | Facebook client id |
state | Метка для фильтра |
+ можно добавить свои поля, которые есть в вебхуке.
Если вы не нашли нужное событие, но в сервисе есть нужный вебхук, то используйте универсальный коннектор «Входящий вебхук». Можно будет завязать логику связок на любое поле, приходящее в вебхуке.
Действия в Telegram
Нажмите на название действия, чтобы посмотреть доступные поля.
Документация по API — здесь.
1. Создать сообщение
Поля запроса
message | Сообщение |
Поля ответа
queue_id | Отправленные сообщения |
2. Создать уведомление о заявке
Поля запроса
Поля ответа
queue_id | Отправленные сообщения |
Кейсы использования сервиса смотрите здесь.
Смотрите кейсы на нашем канале
Не хватает возможностей?
Пожалуйста, заполните бриф и мы постараемся добавить новый функционал в ближайшую неделю.
Также можете написать нам в чат в телеграме.
План настройки интеграции Входящие вебхуки с Telegram
1 | Настроить подключение для Входящие вебхуки в ApiMonster. |
2 | Настроить вебхук в Входящие вебхуки, указав ссылку из ApiMonster. |
3 | Настроить подключение для Telegram в ApiMonster, указав логин/пароль/токен для доступа к апи. |
4 | Создать связку. |
5 | Указать в качестве источника данных Входящие вебхуки. |
6 | Создать требуемое действие для Telegram, указав в какие поля Telegram передавать значения полей из Входящие вебхуки. |
7 | Настроить фильтры для каждого шага при необходимости. |
8 | Протестировать связки и убедиться что они работают согласно ТЗ. |
Пример типовой настройки, посмотрите видео
Или пройдите полный курс по Apimonster.
Тарифы
Даем 30 дней на тест, что бы могли оценить стоимость сервиса под ваши задачи.
Наши тарифы одни из самых выгодных на рынке, мы посчитали.
Кешбэк до 25% при оплате за несколько месяцев.
Тариф 2
990 ₽. / мес.
- 1 200 транзакций / мес.
Примерно 400 заказов/заявок
в мес., зависит от сложности связок. - 12 000 вебхуков / мес.
- 4 дней — срок хранения истории вебхуков
- До 5 входящих вебхуков / сек.
- Неограниченное число подключений на каждый сервис
- Бесплатная настройка
под ключ
Тариф 3
1 990 ₽. / мес.
- 5 000 транзакций / мес.
Примерно 1667 заказов/заявок
в мес., зависит от сложности связок. - 50 000 вебхуков / мес.
- 7 дней — срок хранения истории вебхуков
- До 30 входящих вебхуков / сек.
- Неограниченное число подключений на каждый сервис
- Бесплатная настройка
под ключ
Тариф 4
2 990 ₽. / мес.
- 10 000 транзакций / мес.
Примерно 3333 заказов/заявок
в мес., зависит от сложности связок. - 100 000 вебхуков / мес.
- 14 дней — срок хранения истории вебхуков
- До 50 входящих вебхуков / сек.
- Неограниченное число подключений на каждый сервис
- Бесплатная настройка
под ключ
Тариф 5
6 990 ₽. / мес.
- 50 000 транзакций / мес.
Примерно 16667 заказов/заявок
в мес., зависит от сложности связок. - 500 000 вебхуков / мес.
- 21 дней — срок хранения истории вебхуков
- До 70 входящих вебхуков / сек.
- Неограниченное число подключений на каждый сервис
- Бесплатная настройка
под ключ
Кешбэк
Оплачивайте сервис на несколько месяцев и получайте кешбэк на баланс до 25%.
10 000 ₽ | 20 000 ₽ | 30 000 ₽ | 40 000 ₽ | 50 000 ₽ |
5 % | 10 % | 15 % | 20 % | 25 % |
+ 500 ₽ | + 2 000 ₽ | + 4 500 ₽ | + 8 000 ₽ | + 12 500 ₽ |
+ 10 500 ₽ | + 22 000 ₽ | + 34 500 ₽ | + 48 000 ₽ | + 62 500 ₽ |
FAQ
Что такое транзакция?
Это любой исходящий вебхук (запрос в api): отправить конверсию, создать/найти сделку/контакт/задачу и тд.
Сколько нужно транзакций?
Умножьте количество заявок в месяц на 3-4. Например, если заявок 100, то транзакций будет около 300-400 — создать сделки, отправить конверсии, уведомления. Для персонального расчета тарифа воспользуйтесь калькулятором.
Сколько нужно входящих вебхуков в месяц?
Обычно в 2-5 раз больше количества транзакций. Данное ограничение введено для уменьшения нагрузки от проектов с аномальным количеством вебхуков, создающих лишнюю нагрузку. Если вы не отправляете по 10 вебхуков в секунду, то для вас скорее всего ограничение не актуально.
Что такое срок хранения истории вебхуков?
История вебхуков нужна на случай если вы найдете ошибки в связке и захотите посмотреть что пришло в вебхуке для отладки. Содержимое вебхуков может требовать много ресурсов для хранения, поэтому введено ограничение. На работу связок данный параметр не влияет.
Для настройки связок достаточно 1-3 дней.
Сколько нужно входящих вебхуков в секунду?
Обычно входящий вебхук — это создание или обновление заявки. Данное событие редко происходит чаще 1 раза в секунду, поэтому лимита в 5-30 вебхуков в секунду более чем достаточно.
Смотрите кейсы на нашем канале
Пока не готовы начать работу с сервисом? Подпишитесь на наши блоги для дополнительного прогрева:
Источник: apimonster.ru
Telegram бот на PHP
Примеры как зарегистрировать бота в Telegram, описание и взаимодействие с основными методами API. Документация на core.telegram.org и tlgrm.ru (неофициальный, на русском).
Все запросы к API должны осуществляться по HTTPS, подойдет бесплатный сертификат «Let’s Encrypt».
Регистрация бота
Следующим сообщением отправляем название для бота, обязательно на конце имени должно быть слово «bot» или «_bot». Ответным сообщением получим токен:
Тут же можно настроить описание и аватарку:
/setname | Имя |
/setdescription | Краткое описание |
/setabouttext | Описание бота |
/setuserpic | Юзерпик |
Далее нужно поставить «Webhook» чтобы все сообщения из Telegram приходили на PHP скрипт ( https://example.com/bot.php ). Для этого нужно пройти по ссылке в которой подставлены полученный токен и адрес скрипта.
В ответе будет
При смене токена, установку вебхука нужно повторить.
Входящие сообщения
Сообщения приходят POST-запросом, с типом application/json . Получить его в PHP можно следующим образом:
$data = file_get_contents(‘php://input’); $data = json_decode($data, true);
Чтобы посмотреть входящие данные, их придется дампить в файл:
file_put_contents(__DIR__ . ‘/message.txt’, print_r($data, true));
Текстовое сообщение
Запрос от Телеграм:
Array ( [update_id] => 17584194 [message] => Array ( [message_id] => 26 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => UserName [language_code] => ru-US ) [chat] => Array ( [id] => 123456789 [first_name] => UserName [type] => private ) [date] => 1541888068 [text] => Привет бот! ) )
Получим текст сообщения:
if(!empty($data[‘message’][‘text’]))
Фотографии
При отправки фото боту, на скрипт приходит массив превьюшек, последним элементом будет оригинальное фото. Максимальный размер файла 20МБ.
Запрос от Телеграм:
Array ( [update_id] => 17584194 [message] => Array ( [message_id] => 38 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => UserName [language_code] => ru-US ) [chat] => Array ( [id] => 123456789 [first_name] => UserName [type] => private ) [date] => 1541924962 [photo] => Array ( [0] => Array ( [file_id] => AgADAgADUqexG7u8OEudBvlhgMzKC1agOQ8ABC6Bx26USA7Mw3gAAgI [file_size] => 1196 [width] => 51 [height] => 90 ) [1] => Array ( [file_id] => AgttAgADUqoxG7u8OEudBvlhgMzKC1agOQ8ABKwp_3jDPrIlxHgAAgI [file_size] => 21146 [width] => 180 [height] => 320 ) [2] => Array ( [file_id] => AgADAgADUqyxG7u8OEudBvlhgMzKC1agOQ8ABAN8gJWpUT1MxXgAAgI [file_size] => 90940 [width] => 449 [height] => 800 ) [3] => Array ( [file_id] => AgADAgADUqouu7u8OEudBvlhgMzKC1agOQ8ABIqVC1nEpbLDwngAAgI [file_size] => 114363 [width] => 719 [height] => 1280 ) ) ) )
Чтобы скачать файл нужно отправить POST или GET запрос на получение c параметром file_id изображения по URL:
https://api.telegram.org/bot/getFile
В ответ придет информация о файле:
Array ( [ok] => 1 [result] => Array ( [file_id] => AgADAgADUqoxG5u88E0dBvlhgMzKC1agOQ8ABIqVC1nEpbLDwngAAgI [file_size] => 114363 [file_path] => photos/file_1.jpg ) )
Далее его можно скачать по ссылке:
В PHP сохранение файла на сервер можно реализовать следующим образом:
$token = ‘123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11’; if (!empty($data[‘message’][‘photo’])) < $photo = array_pop($data[‘message’][‘photo’]); $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/getFile’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘file_id’ =>$photo[‘file_id’])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, true); if ($res[‘ok’]) < $src = ‘https://api.telegram.org/file/bot’ . $token . ‘/’ . $res[‘result’][‘file_path’]; $dest = __DIR__ . ‘/’ . time() . ‘-‘ . basename($src); copy($src, $dest); >>
Документ
Запрос от Телеграм:
Array ( [update_id] => 17474201 [message] => Array ( [message_id] => 44 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => UserName [language_code] => ru-US ) [chat] => Array ( [id] => 123456789 [first_name] => UserName [type] => private ) [date] => 1541925844 [document] => Array ( [file_name] => IMG_7947.JPG [mime_type] => image/jpeg [thumb] => Array ( [file_id] => AAQCABMNv_QOAATwQugveIZBldZ3AAIC [file_size] => 2644 [width] => 67 [height] => 90 ) [file_id] => BQADAgADtQEAAqu9OEhzn2cEz8LpkgI [file_size] => 1976218 ) ) )
Скачивание файлов происходит по такой же схеме как у фотографий.
if (!empty($data[‘message’][‘document’])) < $file_id = $data[‘message’][‘document’][‘file_id’]; $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/getFile’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘file_id’ =>$file_id)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, true); if ($res[‘ok’]) < $src = ‘https://api.telegram.org/file/bot’ . $token . ‘/’ . $res[‘result’][‘file_path’]; $dest = __DIR__ . ‘/’ . time() . ‘-‘ . basename($src); copy($src, $dest); >>
Ответы бота
Отправка текста
$response = array( ‘chat_id’ => $data[‘message’][‘chat’][‘id’], ‘text’ => ‘Хай!’ ); $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/sendMessage’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);
Отправка картинки
$response = array( ‘chat_id’ => $data[‘message’][‘chat’][‘id’], ‘photo’ => curl_file_create(__DIR__ . ‘/image.png’) ); $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/sendPhoto’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);
Отправка файла
Пример скрипта
Скрипт простейшего бота. Он отвечает на вопросы и сохраняет файлы и изображение на сервере.
define(‘TOKEN’, ‘123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11’); // Функция вызова методов API. function sendTelegram($method, $response) < $ch = curl_init(‘https://api.telegram.org/bot’ . TOKEN . ‘/’ . $method); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); return $res; >// Прислали фото. if (!empty($data[‘message’][‘photo’])) < $photo = array_pop($data[‘message’][‘photo’]); $res = sendTelegram( ‘getFile’, array( ‘file_id’ =>$photo[‘file_id’] ) ); $res = json_decode($res, true); if ($res[‘ok’]) < $src = ‘https://api.telegram.org/file/bot’ . TOKEN . ‘/’ . $res[‘result’][‘file_path’]; $dest = __DIR__ . ‘/’ . time() . ‘-‘ . basename($src); if (copy($src, $dest)) < sendTelegram( ‘sendMessage’, array( ‘chat_id’ =>$data[‘message’][‘chat’][‘id’], ‘text’ => ‘Фото сохранено’ ) ); > > exit(); > // Прислали файл. if (!empty($data[‘message’][‘document’])) < $res = sendTelegram( ‘getFile’, array( ‘file_id’ =>$data[‘message’][‘document’][‘file_id’] ) ); $res = json_decode($res, true); if ($res[‘ok’]) < $src = ‘https://api.telegram.org/file/bot’ . TOKEN . ‘/’ . $res[‘result’][‘file_path’]; $dest = __DIR__ . ‘/’ . time() . ‘-‘ . $data[‘message’][‘document’][‘file_name’]; if (copy($src, $dest)) < sendTelegram( ‘sendMessage’, array( ‘chat_id’ =>$data[‘message’][‘chat’][‘id’], ‘text’ => ‘Файл сохранён’ ) ); > > exit(); > // Ответ на текстовые сообщения. if (!empty($data[‘message’][‘text’])) < $text = $data[‘message’][‘text’]; if (mb_stripos($text, ‘привет’) !== false) < sendTelegram( ‘sendMessage’, array( ‘chat_id’ =>$data[‘message’][‘chat’][‘id’], ‘text’ => ‘Хай!’ ) ); exit(); > // Отправка фото. if (mb_stripos($text, ‘фото’) !== false) < sendTelegram( ‘sendPhoto’, array( ‘chat_id’ =>$data[‘message’][‘chat’][‘id’], ‘photo’ => curl_file_create(__DIR__ . ‘/image.jpg’) ) ); exit(); > // Отправка файла. if (mb_stripos($text, ‘файл’) !== false) < sendTelegram( ‘sendDocument’, array( ‘chat_id’ =>$data[‘message’][‘chat’][‘id’], ‘document’ => curl_file_create(__DIR__ . ‘/test.txt’) ) ); exit(); > >
- ← Как сбросить root-пароль Linux-сервера
- Авторизация на сайте через Google →
Источник: it-stories.ru