ウェブフックは、チャットクライアントや他の外部 API などの外部サービスにイベントを通知します。特定のイベントが発生したときに、ウェブフックは URL を設定できます。
注意
ファイルのアップロードは、uploads:create および uploads:processing ウェブフックイベントのみをトリガーします。
keys:create、keys:update、translations:create および translations:update ウェブフックイベントは、ファイルのアップロードや自動インポートによってトリガーされません:
ウェブフック履歴の保持期間は 30 日です。
ウェブフック応答
ウェブフックエンドポイントは、コールバックを受信してから 5 秒以内に 200–299 の範囲の HTTP ステータスコードを返す必要があります。他のステータスコードやリクエストのタイムアウトは、配信失敗と見なされます。配信が 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リリースが削除されました。 |
|
|
スクリーンショットが作成されました。 |
|
|
スクリーンショットが削除されました。 |
|
|
スクリーンショットが変更または名前変更されました。 |
|
|
翻訳の一覧が削除されました。 |
|
|
翻訳の一覧が含まれました。 |
|
|
翻訳の一覧がレビューされました。 |
|
|
翻訳の一覧が未レビューになりました。 |
|
|
翻訳の一覧が未検証になりました。 |
|
|
翻訳の一覧が検証されました。 |
|
|
特定の言語バージョンのキーの翻訳が追加されました。 |
|
|
特定の言語バージョンのキーの翻訳が言語サービスプロバイダによって提供されました。 |
|
|
特定の言語バージョンのキーの翻訳が除外されました。 |
|
|
特定の言語バージョンのキーの翻訳が含まれました。 |
|
|
特定の言語バージョンのキーの翻訳がレビューされました。 |
|
|
特定の言語バージョンのキーの翻訳が未レビューです。 |
|
|
特定の言語バージョンのキーの翻訳が未検証です。 |
|
|
特定の言語バージョンのキーの翻訳が編集されました。 |
|
|
特定の言語バージョンのキーの翻訳が検証されました。 |
|
|
ロケールファイルが正常に処理されました。 |
|
|
ロケールファイルが処理中です。 |
ウェブフックを追加するには、次の手順に従ってください:
-
ページから、までスクロールし、設定をクリックします。
ページが開きます。
-
ウェブフックを追加をクリックします。
ウィンドウが開きます。
-
ウェブフックの詳細を提供します。
-
オプションで。
-
保存をクリックします。指定されたウェブフックはページの一覧に追加されます。
ウェブフックは特定のウェブフックのメニューから無効にできます。
ウェブフックをテストするには:
ウェブフックの内容をキャプチャするには、RequestBinのようなサービスを使用します。RequestBinは、検査のためにリクエストデータを収集するURLを提供します。
指定されたタイプのイベントが発生するたびに、指定されたコールバックURLにPOSTリクエストが送信されます。リクエストのPOSTペイロードは、イベントに関連するデータを含むJSONエンコードされたドキュメントです。属性event、message、およびsent_atは常に含まれ、ウェブフックがトリガーされたイベントに関連する追加の属性(user、project、およびbranch)も含まれます。
レスポンスヘッダー
コールバックURLに対して行われたHTTPリクエストには、いくつかの特別なヘッダーが含まれます。
-
X-PhraseApp-Event:ウェブフックをトリガーしたイベントのタイプ。 -
X-PhraseApp-Signature:ペイロードのHMAC16進数ダイジェスト、フックの秘密をキーとして使用。
例:
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":"Joe Doe",
"email": "joe@phrase.com",
"position":"リードデベロッパー",
"created_at":"2015-01-28T09:52:53Z",
"updated_at":"2015-01-28T09:52:53Z"
},
"project": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"name":"My Android Project",
"main_format": "xml",
"project_image_url": "http://assets.phrase.com/project.png",
"account": "account",
"created_at":"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}"
],
"created_at":"2015-01-28T09:52:53Z",
"updated_at":"2015-01-28T09:52:53Z"
}
}