メインコンテンツへスキップ
2分で読めます

Discord webhook

Zenovay イベントを Discord チャンネルに流し込みます。エンジニアチームの部屋やコミュニティグロース用のウォールームに便利です。

Discord の webhook はチャンネルスコープです。Discord ボットや OAuth は不要です。

アウトバウンド webhook は Pro+ の機能です。有効にするにはプランをアップグレードしてください。


1. Discord webhook を作成する

  1. Discord で、Zenovay アラートを受信するチャンネルを開きます。
  2. 歯車アイコン(チャンネルの編集)→ 連携サービスウェブフックウェブフックを作成をクリックします。
  3. 名前(「Zenovay Alerts」など)を付け、必要であればアバターを設定します。
  4. ウェブフック URL をコピーをクリックします。URL は https://discord.com/api/webhooks/123456789012345678/XXXXXXXX... のような形式です。

2. Zenovay に webhook を追加する

  1. app.zenovay.comSettings → Webhooks に移動します。
  2. 通知を受け取るウェブサイトを選択します。
  3. Add webhook をクリックします。
  4. 以下を入力します。
    • NameDiscord #ops(わかりやすい名前であれば何でも構いません)
    • URL:ステップ 1 でコピーした Discord webhook URL を貼り付けます
    • Events:受信したいイベントを選択します
  5. Create webhook をクリックします。
  6. テストイベントを送信(紙飛行機アイコン)をクリックします。約 5 秒以内に Discord チャンネルにメッセージが届くはずです。

Discord は任意の JSON を受け付けますが、生のペイロードはプレーンテキストとしてレンダリングされます。きれいなメッセージにしたい場合はステップ 3 をご覧ください。


3.(オプション)Discord 埋め込みでフォーマットする

Discord の incoming webhook は、色・フィールド・タイムスタンプ付きのリッチな埋め込みに対応しています。Zenovay は汎用的な JSON イベントを送信しますが、それを埋め込みとしてレンダリングするには小さなリレーを実行します。

// Cloudflare Workers / Node / Vercel — anywhere that runs JS
export default {
  async fetch(req) {
    const event = await req.json();
    const colour = event.event_type === 'website_down' ? 0xdc2626
                 : event.event_type === 'traffic_spike' ? 0x10b981
                 : 0x3b82f6;
    const discordPayload = {
      embeds: [{
        title: `Zenovay: ${event.event_type}`,
        description: `Event for site ${event.website_id}`,
        color: colour,
        fields: [
          { name: 'Event type', value: event.event_type, inline: true },
          { name: 'Time', value: event.timestamp, inline: true },
        ],
        footer: { text: 'Zenovay Analytics' },
      }],
    };
    await fetch(DISCORD_WEBHOOK_URL, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(discordPayload),
    });
    return new Response('ok');
  },
};

Zenovay の webhook URL を Discord に直接ではなく、このリレーに向けます。


4. Zenovay の署名を検証する

本番用リレーでは、HMAC-SHA256 署名を検証して、本物の Zenovay イベントのみが Discord に届くようにします。

import { createHmac } from 'crypto';

const signature = req.headers.get('x-zenovay-signature'); // 'sha256=<hex>'
const provided = signature.replace(/^sha256=/, '');
const expected = createHmac('sha256', YOUR_WEBHOOK_SECRET)
  .update(rawBody)
  .digest('hex');

if (provided !== expected) {
  return new Response('invalid signature', { status: 401 });
}

webhook シークレットSettings → Webhooks → webhook カードの目のアイコンをクリックすると確認できます。


トラブルシューティング

  • Discord が HTTP 400 を返す:Discord の webhook レシーバーは厳格です。未知のトップレベルキーを含むペイロードは 400 になる場合があります。ステップ 3 のリレーを使って形式を変換してください。
  • レート制限:Discord の webhook はチャンネルごとにレート制限されています(約 30 メッセージ/分)。traffic_spike などの頻繁なイベントタイプは、リレーでバッチ処理するか、Zenovay 側でフィルタリングしてください。
  • テストイベントは届くが実際のイベントが届かない:Zenovay の webhook 設定で正しいイベントタイプが選択されているか確認してください。テストイベントは選択されているイベントにかかわらず event_type: 'test' を使用します。

関連記事

このページは役に立ちましたか?