Работа с вебхуками и уведомлениями#
Получение входящих данных в GREEN API реализовано через входящие уведомления. Есть 2 способа получать уведомления HTTP API и Webhook Endpoint.
Ниже приведены рекомендации по работе с вебхуками и уведомлениями:
- Получение входящих уведомлений
- Обработка входящих уведомлений
- Безопасность при получении уведомлений
- Логирование и обработка ошибок
- Масштабирование и распределение нагрузки
1. Получение входящих уведомлений#
Работа через HTTP API#
При работе через методы HTTP API требуется вызывать последовательно 2 метода API:
-
Вызываем метод receiveNotification в зависимости от наличия сообщений, настроек метода и настроек инстанса в ответе Вы получете объект с номером и объектом уведомления.
Если уведомлений в очереди нет, в ответе придет null.
-
После получения уведомления необходимо обработать входящее уведомление обработчиком и удалить уведомление методом deleteNotification передав номер этого уведомления.
Если метод завершился статус кодом 500 и более требуется повторить запрос метода.
Работа через Webhook Endpoint#
При работе через методы Webhook Endpoint требуется настроить веб-сервер, способный принимать HTTP запросы.
Веб-сервер должен:
-
Принять входящий POST запрос (вебхук)
-
Обработать принятое уведомление
-
Вернуть ответ с кодом состояния 200 (после получения от сервера статус кода 200 уведомление будет удалено из очереди).
Время ожидания ответа от Вашего веб-сервера составляет 180 секунд, если сервер не отдаст статус код 200, сервер GREEN API сделает паузу в 60 секунд и повторит отправку текущего уведомления.
2. Обработка входящих уведомлений#
Все типы и форматы уведомлений указаны в документации.
Рекомендуется сделать обработку входящих уведомлений согластно инструкции ниже:
-
После получения уведомления сервисом обработчика, желательно проверить схему уведомления (JSONSchema).
Не рекомендуется делать проверку схемы на дополнительные поля, так как API может расширятся добавляя новые функции и информацию.
Если Вы получили уведомление в котором отсутствует поле или его формат не верный, требуется зафиксировать такое уведомление в системе логирования и проинформировать оперетора указав данное уведомление, это поможет зафиксировать и разобраться в ошибке в будущем. -
Сервис обработчика должен найти обязательное поле
typeWebhook
и в зависимости от его типа обработать или сбросить уведомление. -
После обработки уведомления обработчик должет отдать статус код 200.
Так все не обрабатываемые вам уведомления будут удаляться из очереди и последующие уведомления будут приходить корректно.
Если Вы не используете некоторые типы уведомлений, то рекомендуем делать сброс не нужных уведомлений, отдавая статус код 200, так Вы исключите ошибки обработчика и при выходе нового функционала у Вас не возникнет проблем в работе интеграции.
Пример простого веб-сервера от GREEN API:
3. Безопасность при получении уведомлений#
При проектировании сервиса необходимо уделить внимание безопасности.
При работе с технологией HTTP API Ваш IP адрес закрыт и не доступен другим пользователем интернета, данная технология хороша работает в небольших системах с малым объемом данных.
При работе с технологией Webhook Endpoint Ваш IP адрес доступен другим пользователем, требуется исключить вредоностные воздействия на Вашу систему извне.
Рекомендации по безопасности при использовании технологии Webhook Endpoint:
-
Настройте сетевой экран (Firewall), разрешите доступ к серверу только с требуемых Вам IP адресов.
-
Ограничение доступа только с определённых IP адресов. Вы можете настроить Ваш веб-сервер таким образом, чтобы он принимал входящие запросы только с IP адресов GREEN API.
-
Использовать токен авторизации при отправке уведомлений. Укажите токен авторизации в поле
webhookUrlToken
через личный кабинет или методом установки настроек setSettings.
Пример кода фильтрации IP адресов на python
from flask import Flask, request
from datetime import datetime
import json
app = Flask(**name**)
# Список IP-адресов Green Api
ALLOWED_IPS = [
"51.250.84.44",
"51.250.94.65",
"51.250.89.177",
"64.226.125.75",
"158.160.49.84",
"46.101.109.139",
"51.250.95.149",
"51.250.12.167",
"209.38.202.24"]
# Функция для проверки разрешенных IP-адресов
def check_ip():
client_ip = request.remote_addr
if client_ip not in ALLOWED_IPS:
return False
return True
@app.before_request
def before_request():
if not check_ip():
return "Access Denied", 403
# Остальной код вашего приложения...
if **name** == "**main**":
app.run()
4. Логирование и обработка ошибок#
Рекомендуется настроить систему логирования:
-
Используете многоуровневую настраиваемую систему логирования. Логируйте проблемы схемы на уровне ERROR, новые типы уведомлений на уровне WARN, необрабатываемые типы сообщений на уровне DEBUG и работу системы на уровне INFO. Включая нужный уровень логирования, Вы сможете отлаживать работу системы и определять все проблемы, связанные с интеграцией.
-
Рекомендуется сообщать оператору о неизвестных типах уведомлений и об ошибках уведомлений, это позволит максимально быстро локализовать проблему и даст больше информации оператору, не пропустив еще неподдерживаемые типы уведомлений интеграцией.
Обязательно логируйте данные по уведомлениям, в записи должна содержаться информация включая дату и время получения -
timestamp
, тип уведомления -typeWebhook
и остальные данные уведомления. Это позволит вам проводить анализ работы, при неожиданных сценариях работы системы.
5. Масштабирование и распределение нагрузки#
При увеличении размера системы Вы можете столкнуться с проблемой масштабирования. Рекомендуется масштабировать систему, распределяя нагрузку на несколько микросервисов обработчиков. Для этого можно использовать балансировщик нагрузки.
В качестве примера балансировщика приведем веб-сервер nginx, Вы можете использовать несколько экземпляров вашего сервера и распределять нагрузку между ними, используя nginx.
Nginx - это высокопроизводительный веб-сервер, который также может использоваться в качестве балансировщика нагрузки (процесс равномерного распределения веб-трафика между несколькими серверами), предотвращая перегрузку одного сервера. Nginx применяет различные алгоритмы для оптимального распределения трафика и может быть настроен для обеспечения надежности системы при выходе из строя одного или нескольких серверов.
Воспользуйтесь одним из приведённых способов, чтобы развернуть несколько экземпляров сервера:
Ручное развертывание на разных серверах или виртуальных машинах:#
- Создайте или арендуйте несколько физических серверов, виртуальных машин или контейнеров.
- Настройте каждый сервер так, чтобы он содержал копию вашего приложения.
Использование контейнеризации с Docker:#
- Создайте Docker-образ вашего приложения.
- Запустите несколько контейнеров с этим образом на одном или нескольких хост-машинах.
Использование облачных провайдеров:#
- Разверните несколько экземпляров вашего сервера на платформе облачных провайдеров, таких как Amazon Web Services (AWS), Google Cloud Platform (GCP) или Microsoft Azure.
- Используйте инструменты управления облачной инфраструктурой для автоматизации развертывания и масштабирования серверов.
Пример файла конфигурации nginx для балансировщика нагрузки
http {
upstream app{
server 10.2.0.100;
server 10.2.0.101;
server 10.2.0.102;
}
// Этот сервер принимает весь трафик на порт 80 и передает его вышестоящему потоку.
// Обратите внимание, что имя вышестоящего потока и proxy_pass должны совпадать.
server {
listen 80;
server_name mydomain.com;
location / {
include proxy_params;
proxy_pass http://app;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}