Webhookは、チャットクライアントやその他の外部APIなどの外部サービスにイベントを通知します。Webhookは、特定のイベントが発生したときにURLを設定できます。
注意
ファイルのアップロードは、uploads:createおよびuploads:processingのWebhook イベントのみをトリガーします。
keys:create、keys:update、translations:create、およびtranslations:updateのWebhook イベントは、ファイルのアップロードや以下による自動インポートではトリガーされません。
Webhook履歴の保持期間は30日間です。
Webhookレスポンス
Webhookエンドポイントは、コールバックを受信してから5秒以内に200〜299の範囲のHTTPステータスコードを返す必要があります。その他のステータスコードおよびリクエストのタイムアウトは、配信失敗とみなされます。10回連続で配信に失敗した場合、Webhookは無効化されます。コールバックは繰り返されません。
コールバックを受信した場合は、5秒のリクエストタイムアウト期間内に応答してください。アプリケーションが誤ってタイムアウトをトリガーしないように、HTTPレスポンスを送信した後に処理を延期してください。
Webhookリクエストの整合性
各Webhookリクエストには、Webhook検証トークンをシークレットとして使用し、リクエストで送信されたデータとともに生成される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;
各Webhookペイロードの構造は、https://app.phrase.com/webhook_schemas/<event_underscored_name>.jsonで入手可能なスキーマファイルで定義されており、<event_underscored_name>はアンダースコアで区切られたWebhookイベント名に対応します。
branches:createはhttps://app.phrase.com/webhook_schemas/branches_create.jsonからアクセスできます。
|
イベント名 |
項目 |
|---|---|
|
|
ブランチが作成されました。 |
|
|
ブランチがマージされました。 |
|
|
翻訳キーへのコメントが追加されました。 |
|
|
カスタムメタデータフィールドの値が複数のキーで更新されました。 |
|
|
カスタムメタデータフィールドの値がキーレベルで更新されました。 |
|
|
ジョブが完了としてマークされました。 |
|
|
ジョブが作成されました。 |
|
|
ジョブのロケールが完了としてマークされました。 |
|
|
ジョブのロケールが再開されました。 |
|
|
ジョブのロケールがレビューされ、完了としてマークされました。 |
|
|
ジョブのロケールがレビューされ、再開されました。 |
|
|
ジョブが再開されました。 |
|
|
ジョブが開始されました。 |
|
|
ジョブが更新されました。 |
|
|
子キーが親キーにリンクされました。 |
|
|
子キーが親キーからリンク解除されました。 |
|
|
複数のキーが削除されました。 |
|
|
キーが作成されました。 |
|
|
キーが削除されました。 |
|
|
複数のキーにタグが追加されました。 |
|
|
キーにタグが追加されました。 |
|
|
キーの名前が変更されたり、内容が変更されたりしました。 |
|
|
プロジェクト内に新しい言語バージョンが作成されました。 |
|
|
言語バージョンが削除されました。 |
|
|
言語バージョンが変更、名前変更、または再設定されました。 |
|
|
プロジェクトが変更または再設定されました。 |
|
|
OTAリリースが作成されました。 |
|
|
OTAリリースが削除されました。 |
|
|
スクリーンショットが作成されました。 |
|
|
スクリーンショットが削除されました。 |
|
|
スクリーンショットが変更または名前変更されました。 |
|
|
翻訳リストが削除されました。 |
|
|
翻訳リストが含まれました。 |
|
|
翻訳リストがレビューされました。 |
|
|
翻訳リストが未レビューになりました。 |
|
|
翻訳リストが未検証になりました。 |
|
|
翻訳リストが検証されました。 |
|
|
特定の言語バージョンのキーの翻訳が追加されました。 |
|
|
特定の言語バージョンのキーの翻訳が言語サービスプロバイダーによって納品されました。 |
|
|
特定の言語バージョンのキーの翻訳が除外されました。 |
|
|
特定の言語バージョンのキーの翻訳が含まれました。 |
|
|
特定の言語バージョンのキーの翻訳がレビューされました。 |
|
|
特定の言語バージョンのキーの翻訳が未レビューになりました。 |
|
|
特定の言語バージョンのキーの翻訳が未検証になりました。 |
|
|
特定の言語バージョンのキーの翻訳が編集されました。 |
|
|
特定の言語バージョンのキーの翻訳が検証されました。 |
|
|
ロケールファイルが正常に処理されました。 |
|
|
ロケールファイルを処理しています。 |
Webhookを追加するには、以下の手順に従ってください。
-
ページから、までスクロールダウンし、Configureをクリックします。
ページが開きます。
-
Add webhookをクリックします。
ウィンドウが開きます。
-
Webhookの詳細を入力します。
-
必要に応じてを選択します。
-
保存をクリックします。指定したWebhookがページのリストに追加されます。
Webhookは、特定のWebhookのメニューから無効にできます。
Webhookをテストするには:
Webhookの内容をキャプチャするには、RequestBinなどのサービスを使用してください。RequestBinは、検査用のリクエストデータを収集するURLを提供します。
指定されたタイプのイベントが発生するたびに、指定されたコールバックURLにPOSTリクエストが送信されます。リクエストのPOSTペイロードは、イベントに関連するデータを含むJSONエンコードされたドキュメントです。event、message、sent_atの各属性は常に含まれます。これに加え、Webhookのトリガー元となったuser、project、branchなど、イベントに関連する追加の属性も含まれます。
レスポンスヘッダー
コールバックURLに対して行われるHTTPリクエストには、いくつかの特別なヘッダーが含まれます。
-
X-PhraseApp-EventWebhookによってトリガーされたイベントの種類。
-
X-PhraseApp-Signatureフックのシークレットをキーとして使用して算出された、ペイロードのHMAC16進数ダイジェスト。
例:
Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123
{
"event": "translations:create",
"message":"Peter translated page.help.title in fr.",
"sent_at":"2015-01-29T09:52:53Z"
"user": {
"id": "abcd1234cdef1234abcd1234cdef1234",
"username": "joe.doe",
名前"ジョー・ドウ"、
"email": "joe@phrase.com",
ポジション"Lead Developer",
作成日時"2015-01-28T09:52:53Z",
"updated_at":"2015-01-28T09:52:53Z"
},
"project": {
"id": "abcd1234cdef1234abcd1234cdef1234",
名前"My Android Project",
"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"