Для синхронных ответов требуется тело ответа, а также должен возвращаться статус 200
(OK); для асинхронных ответов требуется статус 202
(Accepted).
Если несколько сообщений приходят от клиента одновременно в момент вызова вебхука, edna может отправить их как отдельные сообщения или как одно, включающее в себе тексты всех сообщений. По умолчанию сообщения отправляются по отдельности. Это поведение управляется настройкой bot.message.concat
.
Параметры запроса
Параметр | Тип | Описание |
action | boolean (обязательно) | MESSAGE |
text | string (обязательно) | Сообщение клиента для обработки ботом |
clientId | string (необязательно) | Внешний ID клиента (только для авторизованных клиентов). Этот параметр устарел, вместо него используйте threadsClientId . |
threadsClientId | Long (необязательно) | Внутренний ID клиента (подходит как для авторизованных, так и для неавторизованных клиентов) |
sessionId | string (необязательно) | Внутренний ID треда |
questionId | number (необязательно) | Внутренний ID сообщения клиента в edna |
questionIndex | number (необязательно) | Индекс сообщения клиента в треде |
channelInfo | object (обязательно) | Информация о канале, в котором получено сообщение |
channelType | string | Тип канала (WEB , MOBILE , EMAIL , VIBER , TELEGRAM , VIBERPA , FACEBOOK , VKONTAKTE , YANDEX , WHATSAPP , APPLE_BUSINESS_CHAT ) |
authorized | boolean | true – авторизован, false – не авторизован |
platform | string (необязательно) | Только для типа канала (channelType ) MOBILE :• iOS • Android |
clientData | dictionary (необязательно) | Данные клиента (подробнее в статье Кастомизация данных клиента (clientData) в содержимом вебхука). |
segmentationInfo | map<String, String> | Дополнительные параметры для изменения сегментации (используется как в пользовательских, так и в преднастроенных сегментах). Параметр сегментации personal_manager доступен “из коробки”. Если в этом параметре передан логин агента, а маршрут для сегмента с этим параметром настроен в системе, треды клиентов распределяются по соответствующему маршруту персональным менеджерам (агентам). |
receivedAt | string (обязательно) | Время получения сообщения, дата в формате UTC: yyyy-MM-dd’T’HH:mm:ss.SSS’Z’ |
attachments | array of object (необязательно) | Поля: • url – URL файла, строка до 4000 символов• name – Имя файла, строка до 1000 символов• type – MIME-тип файла, строка до 256 символов• size – Размер файла в байтах, целое число |
sender | string (обязательно) | Информация об отправителе, всегда ThreadsAPI |
settings | object (необязательно) | Дополнительные настройки сообщения |
settings.masked | boolean (необязательно) | Параметр, который указывает, замаскированы ли цифры в связанном сообщении клиента (true – замаскированы, false – не замаскированы). |
metaData | object (необязательно) | Отправляется боту при включенной функциональности распознавания голосовых сообщений |
metaData.speechText | boolean | Распознанный текст голосового сообщения |
metaData.score | integer | Качество распознавания (число от 0 до 100) |
metaData.resultStatus | string | Статус распознавания. Допустимые значения: • processing • success • noInput • maxSpeech • noMatch • error |
payload | string (необязательно) | Код кнопки, которую нажал клиент |
HTTP запрос
POST <url for webhook message> HTTP/1.1 Content-Type: application/json { "action":"MESSAGE", "threadsClientId":1, "sessionId":"1", "questionId":43, "questionIndex":null, "receivedAt":"2018-11-13T13:13:11.876Z", "text":"Message", "channelInfo":{ "channelType":"MOBILE", "authorized":true }, "platform":"Android", "attachments":[ { "url":"hhtp://...", "name":"test.jpg", "type":"image/jpeg", "size":256 } ], "clientData":{ "phone":"79000000000" }, "sender":"ThreadsAPI" }
Пример успешного HTTP ответа
Для синхронных ответов ожидается текст сообщения и статус 200
(OK); для асинхронных ответов ожидается статус 202
(Accepted).
{ "action":"MESSAGE", "threadsClientId":1, "sessionId":"1", "questionId":43, "questionIndex":null, "receivedAt":"2018-11-13T13:13:11.756Z", "text":"Message", "segmentationInfo": { "key":"value" }, "attachments":[ { "url":"https://...", "name":"test.jpg", "type":"image/jpeg", "size":256 } ], "sender":"ThreadsAPI", "settings" : { "masked" : true } }