Вебхуки

Вы можете настроить FindFace Multi для автоматической отправки уведомлений об определенных событиях, эпизодах, записях счетчиков и активациях областей на заданный URL-адрес. Для этого создайте и настройте вебхук. При наступлении нужного события/эпизода/записи счетчика/активации области FindFace Multi отправит HTTP-запрос на URL-адрес, указанный в настройках вебхука.

Вебхуки можно использовать для решения разнообразных задач, например, для уведомления пользователя об определенном событии, вызова определенных действий на целевом веб-сайте, при решении задач безопасности, таких как удаленное автоматическое управление доступом и др.

В этом разделе:

Настройка вебхука

Важно

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

Примечание

Для того чтобы использовать вебхуки, обязательно укажите по крайней мере один из параметров SERVICE_EXTERNAL_ADDRESS/EXTERNAL_ADDRESS в файле /etc/findface-security/config.py.

Для создания вебхука выполните следующие действия:

  1. Перейдите на вкладку Настройки. Выберите Вебхуки.

  2. Нажмите +.

    create_webhook_ru

  3. Введите имя вебхука.

    webhook_ru

  4. Укажите адрес, на который будут отправляться оповещения.

  5. Вы можете отправлять уведомления в пакетном режиме. Укажите максимальное количество уведомлений в пакете. Фактическое количество может быть меньшим.

  6. Укажите максимальное количество попыток отправить уведомление. Интервал между попытками увеличивается экспоненциально с максимумом 100 секунд.

    Важно

    Для того чтобы получить все сообщения с момента потери соединения, если оно имеет место, установите значение 0. Установите 1, чтобы пропустить старые сообщения.

  7. 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, если совпала карточка с id 12 или 25.

    {
            "body_events": {
                    "camera_group_in": [1, 3],
                    "matched_card_in": [12, 25],
            },
    }
    
  8. Поставьте флажок Активный.

  9. Нажмите Сохранить.

Как работает вебхук

Для тестирования работы вебхука можно использовать следующий простой веб-сервер на 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

В подробном режиме оповещения по вебхуку имеют следующие форматы: