Вебхуки
Вы можете настроить FindFace Multi для автоматической отправки уведомлений об определенных событиях, эпизодах, записях счетчиков и активациях областей на заданный URL-адрес. Для этого создайте и настройте вебхук. При наступлении нужного события/эпизода/записи счетчика/активации области FindFace Multi отправит HTTP-запрос на URL-адрес, указанный в настройках вебхука.
Вебхуки можно использовать для решения разнообразных задач, например, для уведомления пользователя об определенном событии, вызова определенных действий на целевом веб-сайте, при решении задач безопасности, таких как удаленное автоматическое управление доступом и др.
В этом разделе:
Настройка вебхука
Важно
Для создания вебхука необходимы права администратора.
Примечание
Для того чтобы использовать вебхуки, обязательно укажите по крайней мере один из параметров SERVICE_EXTERNAL_ADDRESS
/EXTERNAL_ADDRESS
в файле /etc/findface-security/config.py
.
Для создания вебхука выполните следующие действия:
Перейдите на вкладку Настройки. Выберите Вебхуки.
Нажмите +.
Введите имя вебхука.
Укажите адрес, на который будут отправляться оповещения.
Вы можете отправлять уведомления в пакетном режиме. Укажите максимальное количество уведомлений в пакете. Фактическое количество может быть меньшим.
Укажите максимальное количество попыток отправить уведомление. Интервал между попытками увеличивается экспоненциально с максимумом 100 секунд.
Важно
Для того чтобы получить все сообщения с момента потери соединения, если оно имеет место, установите значение
0
. Установите1
, чтобы пропустить старые сообщения.FindFace Multi будет автоматически отправлять оповещения о событиях, эпизодах, записях счетчика и активациях области, удовлетворяющих заданным фильтрам. Фильтровать события можно по следующим параметрам:
События распознавания (лицо, силуэт, автомобиль):
Секции:
face_events
,body_events
,car_events
.allowed_bs_types
: режим отслеживания объектов на видео, возможные значения:overall
,realtime
.camera_group_in
: id группы камер, число.camera_in
: id камеры, число.matched_lists_in
: id списка наблюдения, число.matched_card_in
: id совпавшей карточки, число.matched
: результат сопоставления с картотекой, логическое значение. Установитеtrue
илиfalse
, если отправку оповещения должны вызывать только события с совпадениями или только события без совпадений.confidence_gte
: минимальное значение уверенности алгоритма, число.
Эпизоды с людьми:
Секция:
human_episodes
.allowed_types
: статус эпизода, возможные значения: открытие эпизода (episode_open
), добавление нового события в эпизод (episode_event
), закрытие эпизода (episode_close
).camera_group_in
: id группы камер, число.camera_in
: id камеры, число.matched_lists_in
: id списка наблюдения, число.face_matched
: статуссовпадения
лиц в эпизоде с картотекой, логическое значение. Установитеtrue
, если только эпизоды с совпадениями лиц, илиfalse
, если только эпизоды без совпадений лиц должны вызывать отправку оповещения.body_matched
: статуссовпадения
силуэтов в эпизоде с картотекой, логическое значение. Установитеtrue
, если только эпизоды с совпадениями силуэтов, илиfalse
, если только эпизоды без совпадений силуэтов должны вызывать отправку оповещения.events_count_gte
: минимальное количество событий в эпизоде, число.events_count_lte
: максимальное количество событий в эпизоде, число.
Эпизоды с автомобилями:
Секция:
car_episodes
.allowed_types
: статус эпизода, возможные значения: открытие эпизода (episode_open
), добавление нового события в эпизод (episode_event
), закрытие эпизода (episode_close
).camera_group_in
: id группы камер, число.camera_in
: id камеры, число.matched_lists_in
: id списка наблюдения, число.car_matched
: статуссовпадения
автомобилей в эпизоде с картотекой, логическое значение. Установитеtrue
, если только эпизоды с совпадениями автомобилей, илиfalse
, если только эпизоды без совпадений автомобилей должны вызывать отправку оповещения.events_count_gte
: минимальное количество событий в эпизоде, число.events_count_lte
: максимальное количество событий в эпизоде, число.
Записи счетчиков:
Секция:
counters
.counter_in
: id счетчика, число.camera_group_in
: id группы камер, число.camera_in
: id камеры, число.faces_gte
: минимальное количество лиц в записи счетчика, число.faces_lte
: максимальное количество лиц в записи счетчика, число.silhouettes_gte
: минимальное количество силуэтов в записи счетчика, число.silhouettes_lte
: максимальное количество силуэтов в записи счетчика, число.cars_gte
: минимальное количество автомобилей в записи счетчика, число.cars_lte
: максимальное количество лиц в записи счетчика, число.proximity_min_lte
: отправить оповещение, если минимальное задетектированное расстояние в метрах меньше указанной величины, число.proximity_min_gte
: отправить оповещение, если минимальное задетектированное расстояние в метрах больше указанной величины, число.proximity_avg_lte
: отправить оповещение, если среднее задетектированное расстояние в метрах меньше указанной величины, число.proximity_avg_gte
: отправить оповещение, если среднее задетектированное расстояние в метрах больше указанной величины, число.proximity_max_lte
: отправить оповещение, если максимальное задетектированное расстояние в метрах меньше указанной величины, число.proximity_max_gte
: отправить оповещение, если максимальное задетектированное расстояние в метрах больше указанной величины, число.
Активации областей:
Секция:
areas
.area_in
: id области, число.camera_group_in
: id группы камер, число.camera_in
: id камеры, число.
{ "face_events": { "allowed_bs_types": [ "overall", "realtime" ], "camera_group_in": [], "camera_in": [], "matched_lists_in": [], "matched_card_in": [], "matched": true, "confidence_gte": 0.75 }, "body_events": { "allowed_bs_types": [ "overall", "realtime" ], "camera_group_in": [], "camera_in": [], "matched_lists_in": [], "matched_card_in": [], "matched": true, "confidence_gte": 0.75 }, "car_events": { "allowed_bs_types": [ "overall", "realtime" ], "camera_group_in": [], "camera_in": [], "matched_lists_in": [], "matched_card_in": [], "matched": true, "confidence_gte": 0.75 }, "human_episodes": { "allowed_types": [ "episode_open", "episode_event", "episode_close" ], "camera_group_in": [], "camera_in": [], "matched_lists_in": [], "face_matched": true, "body_matched": true, "events_count_gte": 0, "events_count_lte": 999 }, "car_episodes": { "allowed_types": [ "episode_open", "episode_event", "episode_close" ], "camera_group_in": [], "camera_in": [], "matched_lists_in": [], "car_matched": true, "events_count_gte": 0, "events_count_lte": 999 }, "counters": { "counter_in": [], "camera_group_in": [], "camera_in": [], "faces_gte": 1, "faces_lte": 100, "silhouettes_gte": 1, "silhouettes_lte": 100, "cars_gte": 1, "cars_lte": 100, "proximity_min_lte": 100, "proximity_min_gte": 0, "proximity_avg_lte": 100, "proximity_avg_gte": 0, "proximity_max_lte": 100, "proximity_max_gte": 0 }, "areas": { "area_in": [], "camera_group_in": [], "camera_in": [] } }
Важно
Используйте только фильтры, соответствующие цели поиска. Для выключения фильтра удалите его из вебхука. Не оставляйте фильтр пустым (
[]
), поскольку в этом случае фильтр вернет пустой результат.Примечание
Для получения всех оповещений передайте скобки без вложенных фильтров:
{}
Совет
Пример №1. Получение оповещений обо всех событиях c автомобилями:
{ "car_events": {} }
Пример №2. Получение оповещений об открытии эпизодов с людьми с совпадениями в картотеке по лицам и силуэтам:
{ "human_episodes": { "allowed_types": ["episode_open"], "face_matched": true, "body_matched": true }}
Примечание
Вы можете задать несколько значений в фильтрах с квадратными скобками. В этом случае вебхук будет активироваться при совпадении одного из значений фильтра. В примере ниже вы будете оповещены о событии с силуэтом с группы камер
1
или3
, если совпала карточка с id12
или25
.{ "body_events": { "camera_group_in": [1, 3], "matched_card_in": [12, 25] } }
Поставьте флажок Активный.
Нажмите Сохранить.
Как работает вебхук
Для тестирования работы вебхука можно использовать следующий простой веб-сервер на Python, обеспечивающий захват отправленных вебхуком оповещений о событиях:
from pprint import pprint
from aiohttp import web
async def handle(request):
pprint(await request.json())
return web.Response(status=200)
app = web.Application()
# for aiohttp v 3.x
# app.add_routes([web.post('/', handle)])
# for aiohttp v 2.x
app.router.add_post('/', handle)
web.run_app(app, port=8888)
Важно
Используемый вами сервер-ловушка оповещений по вебхуку должен возвращать ответ HTTP 200
после получения вебхука от FindFace Multi, по аналогии с примером выше.
Если для вебхука не задано ни одного фильтра, данный веб-сервер будет получать оповещения обо всех произошедших в системе событиях, эпизодах, записях счетчиков и активациях областей. Оповещения отправляются в следующих форматах:
Для просмотра статуса отправки вебхука в FindFace Multi выполните следующую команду:
sudo journalctl -u findface-security.service | grep 'Webhook'
Ответ в случае успеха:
May 30 14:13:43 ffsecurity[12441]: INFO [Webhook(id=6) worker(type=face_events] <queue: 0> Sent batch(len-1, type-"face_events"): ['4355024961160384430']
May 30 14:13:43 ffsecurity[12441]: INFO [SC:OQSrsPV9] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.003450
May 30 14:13:43 ffsecurity[12441]: INFO [Webhook(id=6) worker(type=face_events] <queue: 0> Sent batch(len-1, type-"face_events"): ['4355024961658847580']
May 30 14:13:44 ffsecurity[12441]: INFO [SC:JtRz2Vuo] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.001263
May 30 14:13:44 ffsecurity[12441]: INFO [Webhook(id=6) worker(type=face_events] <queue: 0> Sent batch(len-1, type-"face_events"): ['4355024962087522421']
May 30 14:13:44 ffsecurity[12441]: INFO [SC:9AnzRJwU] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.001691
May 30 14:13:44 ffsecurity[12441]: INFO [Webhook(id=6) worker(type=face_events] <queue: 0> Sent batch(len-1, type-"face_events"): ['4355024962355957878']
Ответ, если попытка была неудачной:
May 30 14:18:49 ffsecurity[12441]: INFO [SC:sp34rVQR] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.001376
May 30 14:18:49 ffsecurity[12441]: WARNING [Webhook(id=6) worker(type=face_events] <queue: 0> Error sending webhook: Cannot connect to host 127.0.0.1:8888 ssl:None [Connection refused]. Attempt 1 out of 10. Next attempt in 0.270 seconds.
May 30 14:18:50 ffsecurity[12441]: WARNING [Webhook(id=6) worker(type=face_events] <queue: 0> Error sending webhook: Cannot connect to host 127.0.0.1:8888 ssl:None [Connection refused]. Attempt 2 out of 10. Next attempt in 0.729 seconds.
May 30 14:18:50 ffsecurity[12441]: INFO [SC:zUhLHNxN] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.001368
May 30 14:18:50 ffsecurity[12441]: INFO [SC:1Q66tcUS] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.001386
May 30 14:18:50 ffsecurity[12441]: WARNING [Webhook(id=6) worker(type=face_events] <queue: 2> Error sending webhook: Cannot connect to host 127.0.0.1:8888 ssl:None [Connection refused]. Attempt 3 out of 10. Next attempt in 1.968 seconds.
May 30 14:18:52 ffsecurity[12441]: WARNING [Webhook(id=6) worker(type=face_events] <queue: 2> Error sending webhook: Cannot connect to host 127.0.0.1:8888 ssl:None [Connection refused]. Attempt 4 out of 10. Next attempt in 5.314 seconds.
May 30 14:18:55 ffsecurity[12441]: INFO [SC:5kl6zGrF] [Webhooks manager-38bc5] Processing message(type="face_events:event_created"). Consumer reception delta: 0.001542
May 30 14:18:58 ffsecurity[12441]: WARNING [Webhook(id=6) worker(type=face_events] <queue: 3> Error sending webhook: Cannot connect to host 127.0.0.1:8888 ssl:None [Connection refused]. Attempt 5 out of 10. Next attempt in 14.349 seconds.
Подробные данные в вебхуках (Verbose)
По умолчанию оповещения по вебхуку содержат только идентификаторы таких сущностей, как карточки, списки наблюдения, камеры и группы камер. Для того чтобы получать подробную информацию по данным сущностям, включите подробный режим оповещений по вебхукам (режим verbose).
Для этого откройте файл конфигурации /etc/findface-security/config.py
и установите в нем 'VERBOSE_WEBHOOKS': True
:
sudo vi /etc/findface-security/config.py
...
FFSECURITY = {
...
# send serialized cards, card-lists, camera and camera groups in webhooks
'VERBOSE_WEBHOOKS': True,
...
}
...
После внесения изменений обязательно перезапустите сервис findface-security
.
sudo systemctl restart findface-security.service
В подробном режиме оповещения по вебхуку имеют следующие форматы: