🎃

Zendesk Webhookで自分自身のAPIを呼び出してカスタムフィールドを更新する

に公開

はじめに

Zendeskのトリガ機能とWebhookを活用して、チケット作成時に自動で自分自身のZendesk APIを呼び出し、特定のカスタムフィールドを更新する構成を紹介します。Zendesk のチケット共有機能を使うにあたって、元の ID を何処かに持たせておきたかったのです。なお、トリガから直接自身のチケットフィールドを設定することはできるのですが、私の検証した限りプレースホルダが使えませんでした。

通常、ZendeskのWebhookは外部システムと連携するために使われますが、工夫すればZendesk自身のREST APIを呼び出すことも可能です。

やりたいこと

  • チケットが作成されたら
  • 条件に応じてトリガでWebhookを呼び出す
  • WebhookはZendesk自身のAPIを呼び出して、カスタムフィールド (例: ID: 12345) を更新する
  • 無限ループを避けるため、トリガではタグも設定する

準備

  1. APIトークンの作成

Zendesk管理センターから以下のようにAPIトークンを作成します。
1. 管理センター → [Apps and Integrations] → [Zendesk API]
2. APIトークンを有効化
3. [APIトークンを追加] → 任意の説明を入れてトークンをコピー

後述の認証で利用します。

Webhookの作成

管理センター → [Apps and integrations] → [Webhooks] にて新規作成。

  • URL: https://{your_subdomain}.zendesk.com/api/v2/tickets/{{ticket.id}}.json
  • メソッド: PUT
  • リクエスト形式: JSON
  • 認証: APIキー
    • ヘッダー名: Authorization
    • 値: Basic {設定した値}*

設定した値、というのは、base64 でユーザー名とAPIトークンをエンコードしたものです。たとえばユーザー名がexample@example.com、トークンがxxxxxxの場合、Macのターミナルで以下のコマンドを実行して作成します。

echo -n 'example@example.com/token:xxxxxx' | base64

テスト

以下の画像のように、テストをするとプレースホルダを置き換えられます。

フィールドは、以下のように書きます。id は適宜置き換えます。

{
    "ticket": {
        "custom_fields": [
            {
                "id": 12345,
                "value": "new_value"
            }
        ]
    }
}

無限ループを防ぐタグ戦略

WebhookがZendesk APIを呼び出すと、チケットが再び更新されるため再発火の無限ループになる可能性があります。

これを防ぐために、タグを制御用に使います:

  1. トリガの条件で tags does not include {タグ名}
  2. トリガのアクションでチケットにタグを追加
  3. 以降の更新ではトリガが発火しない

Discussion