通知と Webhook 設定
Webhook 通知チャネル。URL・任意 HMAC 署名・リクエスト仕様、運営/コンソールでの設定とテスト送信。
運営の「システム通知」とコンソールの「通知設定」で Webhook を有効にし、指定の HTTPS/HTTP エンドポイントへ運用アラートを送れます。Telegram と単独/併用が可能です。
用途
- 自前サービス、メッセージゲートウェイ、ローコード自動化(n8n など)、他の IM へ転送
- Bot Token を製品側に置かず、自前サービスから再配信したい場合
運営側とアカウント側の設定は独立です。Webhook を有効にした側では、通知ごとにその URL へ 1 回 POST します(Telegram も有効なら両方送られます)。
設定項目
| 項目 | 必須 | 説明 |
|---|---|---|
| Webhook スイッチ | — | オフなら配信しない |
| Webhook URL | 有効時必須 | http:// または https:// で始まること |
| 署名シークレット | 任意 | 設定時は本文に HMAC-SHA256 署名を付与 |
| 署名ヘッダ名 | 任意 | シークレットがあるとき有効。空なら X-Adswds-Signature |
どこで設定するか
コンソール(本アカウント)
- 管理者が システム管理 → 通知設定 → チャネル → Webhook を開く
- 有効にして URL を入力。検証するならシークレット/ヘッダも設定
- 保存後に テスト送信 し、受信側で JSON を確認
運営コンソール
- システム通知 → チャネル → Webhook を開く
- 同様に URL/任意署名を設定
- 保存してテスト
リクエスト仕様
プラットフォームは次のように呼び出します。
- メソッド:
POST - Content-Type:
application/json - User-Agent:
Adswds-Notify-Webhook/1.0 - タイムアウト:約 15 秒。リダイレクトは追従しない(3xx は成功にならない)
- 成功:HTTP ステータスが 2xx。それ以外は配信失敗
ボディ
JSON は 2 フィールドのみ(現在の通知言語でレンダリング済みのタイトル/本文):
{
"title": "通知タイトル",
"body": "通知本文"
}{{client_name}} などのプレースホルダは送信前にサーバー側で展開されます。Webhook に生のイベント ID や未展開の変数表は含まれません。
任意署名(推奨)
署名シークレットを設定すると、生のリクエストボディバイト列に対して:
HMAC-SHA256(secret, raw_body) → 小文字 hexを計算し、ヘッダ(既定名 X-Adswds-Signature)に載せます:
X-Adswds-Signature: sha256=<hex>受信側は同じシークレットで再計算し、sha256= 以降を定数時間比較してください。シークレット未設定時は署名ヘッダを付けません。
疑似コード:
expected = "sha256=" + hex(hmac_sha256(secret, raw_body))
assert header["X-Adswds-Signature"] == expected受信側の例
一時的な公開トンネルや小さな HTTP サーバーで十分確認できます。最小の Node 例:
import http from 'node:http'
import crypto from 'node:crypto'
const SECRET = process.env.HOOK_SECRET || ''
http.createServer((req, res) => {
const chunks = []
req.on('data', (c) => chunks.push(c))
req.on('end', () => {
const raw = Buffer.concat(chunks)
if (SECRET) {
const sig = req.headers['x-adswds-signature'] || ''
const expected =
'sha256=' + crypto.createHmac('sha256', SECRET).update(raw).digest('hex')
if (sig !== expected) {
res.writeHead(401)
res.end('bad signature')
return
}
}
console.log(JSON.parse(raw.toString('utf8')))
res.writeHead(200)
res.end('ok')
})
}).listen(8080)製品の Webhook URL をその公開アドレスにし、シークレットを揃えてからテスト送信してください。
テスト送信と切り分け
| 症状 | 確認点 |
|---|---|
| URL 無効 | http:// / https:// で始まっているか |
| HTTP 非 2xx | 受信側が 200–299 を返すか。リダイレクトに依存していないか(追従しない) |
| 署名不一致 | 生 body バイトで計算しているか。シークレット一致。ヘッダ名(既定 X-Adswds-Signature) |
| テスト成功だが本番が来ない | イベントスイッチ、マスター、アカウント利用中か |
| タイムアウト | 約 15 秒以内に応答。重い処理は先に ACK して非同期化 |
関連:通知と Telegram 設定 · システムとアカウント · FAQ。