2分で読めます
Discord webhook
Zenovay イベントを Discord チャンネルに流し込みます。エンジニアチームの部屋やコミュニティグロース用のウォールームに便利です。
Discord の webhook はチャンネルスコープです。Discord ボットや OAuth は不要です。
アウトバウンド webhook は Pro+ の機能です。有効にするにはプランをアップグレードしてください。
1. Discord webhook を作成する
- Discord で、Zenovay アラートを受信するチャンネルを開きます。
- 歯車アイコン(チャンネルの編集)→ 連携サービス → ウェブフック → ウェブフックを作成をクリックします。
- 名前(「Zenovay Alerts」など)を付け、必要であればアバターを設定します。
- ウェブフック URL をコピーをクリックします。URL は
https://discord.com/api/webhooks/123456789012345678/XXXXXXXX...のような形式です。
2. Zenovay に webhook を追加する
app.zenovay.comで Settings → Webhooks に移動します。- 通知を受け取るウェブサイトを選択します。
- Add webhook をクリックします。
- 以下を入力します。
- Name:
Discord #ops(わかりやすい名前であれば何でも構いません) - URL:ステップ 1 でコピーした Discord webhook URL を貼り付けます
- Events:受信したいイベントを選択します
- Name:
- Create webhook をクリックします。
- テストイベントを送信(紙飛行機アイコン)をクリックします。約 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'を使用します。
関連記事
このページは役に立ちましたか?