-
Планы Team, Professional, Business, Enterprise и Software UI/UX
Свяжитесь с отделом продаж по вопросам лицензирования.
Вебхуки уведомляют внешние службы, такие как чат-клиенты или другие внешние API, о событиях. Для вебхука можно указать URL-адрес, который будет вызван при наступлении определенного события.
Важно
Загрузка файлов запускает только события вебхука uploads:create и uploads:processing.
События вебхука keys:create, keys:update, translations:create и translations:update не запускаются при загрузке файлов или автоматизированном импорте через:
Для истории вебхуков установлен 30-дневный период хранения.
Ответ вебхука
Конечная точка вебхука должна возвращать HTTP-код состояния в диапазоне 200–299 в течение 5 секунд после получения обратного вызова. Другие коды состояния и тайм-ауты запросов считаются сбоями доставки. Вебхук будет деактивирован, если доставка не удалась более чем для 10 последовательных событий. Обратные вызовы не повторяются.
При получении обратного вызова отвечайте в течение 5-секундного периода ожидания запроса. Чтобы гарантировать, что приложения случайно не вызовут тайм-аут, отложите обработку до момента отправки HTTP-ответа.
Целостность запроса вебхука
Каждый запрос вебхука включает заголовок X-PhraseApp-Signature, который генерируется с использованием токена проверки вебхука в качестве секрета вместе с данными, отправленными в запросе. Проверяйте источник запроса путем вычисления HMAC-дайджеста тела запроса и сравнения его со значением в заголовке X-PhraseApp-Signature.
Примеры:
Ruby
def verify_webhook(signatureheader)
digest = OpenSSL::Digest::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, VERIFICATION_TOKEN, request.body)
hmac = Base64.encode64(hmac).strip
hmac == signatureheader
end
<?PHP
function verify_webhook($signatureheader){
$hmac = hash_hmac('sha256', $requestBody, $verificationToken, true);
$hmac = trim(base64_encode($hash));
return $hmac == $signatureheader;
}
Структура полезной нагрузки каждого вебхука определяется в файле схемы, доступном по адресу https://app.phrase.com/webhook_schemas/<event_underscored_name>.json, где <event_underscored_name> соответствует имени события вебхука с подчеркиваниями.
branches:create доступен по адресу https://app.phrase.com/webhook_schemas/branches_create.json
|
Имя события |
Описание |
|---|---|
|
|
Ветка была создана. |
|
|
Ветка была объединена. |
|
|
Добавлен комментарий к ключу перевода. |
|
|
Значение пользовательского поля метаданных было обновлено в нескольких ключах. |
|
|
Значение пользовательского поля метаданных было обновлено на уровне ключа. |
|
|
Задание помечено как выполненное. |
|
|
Задание создано. |
|
|
Локаль задания помечена как выполненная. |
|
|
Локаль задания повторно открыта. |
|
|
Локаль задания проверена и помечена как выполненная. |
|
|
Локаль задания проверена и повторно открыта. |
|
|
Задание повторно открыто. |
|
|
Задание запущено. |
|
|
Задание обновлено. |
|
|
Дочерний ключ связан с родительским ключом. |
|
|
Дочерний ключ отвязан от родительского ключа. |
|
|
Несколько ключей были удалены. |
|
|
Был создан ключ. |
|
|
Ключ был удален. |
|
|
Теги были добавлены к нескольким ключам. |
|
|
Теги были добавлены к ключу. |
|
|
Ключ был переименован или изменен. |
|
|
В проекте была создана новая языковая версия. |
|
|
Языковая версия была удалена. |
|
|
Языковая версия была изменена, переименована или перенастроена. |
|
|
Проект был изменен или перенастроен. |
|
|
Был создан OTA-релиз. |
|
|
OTA-релиз был удален. |
|
|
Был создан скриншот. |
|
|
Скриншот был удален. |
|
|
Скриншот был изменен или переименован. |
|
|
Список переводов был удален. |
|
|
Список переводов был включен. |
|
|
Список переводов был проверен. |
|
|
Список переводов был помечен как непроверенный. |
|
|
Список переводов был помечен как неподтвержденный. |
|
|
Список переводов был подтвержден. |
|
|
Был добавлен перевод ключа в определенной языковой версии. |
|
|
Перевод ключа в определенной языковой версии был предоставлен поставщиком языковых услуг. |
|
|
Перевод ключа в определенной языковой версии был исключен. |
|
|
Перевод ключа в определенной языковой версии был включен. |
|
|
Перевод ключа в определенной языковой версии был проверен. |
|
|
Перевод ключа в определенной языковой версии был помечен как непроверенный. |
|
|
Перевод ключа в определенной языковой версии был помечен как неподтвержденный. |
|
|
Перевод ключа в определенной языковой версии был отредактирован. |
|
|
Перевод ключа в определенной языковой версии был подтвержден. |
|
|
Файл локали был успешно обработан. |
|
|
Файл локали обрабатывается. |
Чтобы добавить вебхук, выполните следующие действия:
-
На странице прокрутите вниз до и нажмите Configure.
Откроется страница .
-
Нажмите «Add webhook».
Откроется окно .
-
Укажите сведения о вебхуке.
-
При необходимости .
-
Нажмите «Сохранить». Указанный вебхук добавляется в список на странице .
Вебхук можно деактивировать в меню конкретного вебхука.
Чтобы проверить вебхук:
-
На странице выберите вебхук и выберите «Send Test-Notification» в меню .
Отображается уведомление о том, что проверка прошла успешно.
Используйте сервис, такой как RequestBin, для захвата содержимого вебхука. RequestBin предоставляет URL-адрес, который собирает данные запроса для проверки.
POST-запрос отправляется на указанный URL-адрес обратного вызова каждый раз, когда происходит событие указанного типа. POST-полезная нагрузка запроса представляет собой JSON-кодированный документ с соответствующими данными о событии. Атрибуты event, message и sent_at будут включены всегда, наряду с дополнительными атрибутами, относящимися к событию, такими как user, project и branch, из которых был вызван вебхук.
Заголовки ответа
HTTP-запросы, отправленные на URL-адрес обратного вызова, будут содержать несколько специальных заголовков.
-
X-PhraseApp-Event Тип события, которое вызвало вебхук.
-
X-PhraseApp-Signature Шестнадцатеричный дайджест HMAC полезной нагрузки, использующий секретный ключ хука в качестве ключа.
Например:
Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123
{
"event": "translations:create",
"message": "Peter перевел page.help.title на fr.",
"sent_at": "2015-01-29T09:52:53Z"
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "joe.doe",
"name": "Джо Доу",
"email": "joe@phrase.com",
Позиция «Ведущий разработчик»,
Создана в "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
},
"project": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name": "Мой Android проект",
"main_format": "xml",
"project_image_url": "http://assets.phrase.com/project.png",
"account": "account",
Создана в "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
},
"branch": {
"name": "branch_name"
},
"translation": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"content": "Мой перевод",
"unverified": false,
"excluded": false,
"plural_suffix": "",
"key": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name": "home.index.headline",
"plural": false
},
"locale": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name": "de",
"code": "de-DE"
},
"placeholders": [
"%{count}"
Создана в "2015-01-28T09:52:53Z",
"updated_at": "2015-01-28T09:52:53Z"
}
}