最後更新
Webhook
除了應用程式內、電子郵件與 Telegram 之外,提醒規則也可以推送到 HTTPS 端點。每次推送都是以通道密鑰簽章的 JSON POST 請求;該密鑰只會在建立通道時顯示一次。
設定端點
- 在主控台開啟 提醒 → 規則 → 新增規則,選擇事件類型,並以你的 HTTPS 網址新增一個 Webhook 通道。若使用 API 金鑰,請將相同的規則送到
POST /v1/alerts/rules(權限範圍webhook:manage)。 - 複製簽章密鑰(
whsec_…)。它只會在webhookSecrets[].signingSecret中回傳一次,每個 Webhook 通道各一組。請將它與你的端點一起保存。 - 請在 10 秒內回應
2xx,並以非同步方式處理後續工作。系統不會跟隨重新導向,也會拒絕私有、迴路或鏈路本地位址。 POST /v1/alerts/rules/{id}/test會送出一筆範例envelope推送(sourceEventId以test_開頭),方便你檢查處理程式。
事件
規則會在 eventTypes 中列出它要回應的事件類型;空清單代表符合所有類型。以下是值得設定提醒的類型:
| 類型 | 觸發時機 |
|---|---|
envelope | 在觀察中的直播間觀測到寶箱(紅包)。適用規則設定的最低鑽石值。 |
goodyBag | 在觀察中的直播間觀測到福袋。適用規則設定的最低鑽石值。 |
gift | 在觀察中的直播間有人送出禮物。每份禮物都會觸發:不適用最低鑽石值。 |
minDiamondCount 預設為 49,並與每位觀眾 1.51 顆鑽石的下限一起,只用於篩選寶箱與福袋。開播與結束直播事件目前尚未推送。
標頭
| 標頭 | 值 |
|---|---|
content-type | application/json |
x-roomscope-alert-id | <ruleId>:<eventId>,與請求主體中的 alertId 相同。請以此值去除重複。 |
x-roomscope-timestamp | 此次嘗試簽章時的 Unix 時間(秒)。 |
x-roomscope-schema-version | Payload 結構描述版本,目前為 2026-11-03(新增 `links`)。 |
x-roomscope-signature | sha256=<"<timestamp>.<raw body>" 的十六進位 HMAC-SHA256>。 |
Payload
每個請求一個事件,以精簡的 JSON 傳送。diamondCount、peopleCount 與 unpackAt(Unix 秒)只在 envelope 與 goodyBag 時有值,其他類型則為 null。
POST your-endpoint
{ "schemaVersion": "2026-11-03", "alertId": "8f0c…:evt_…", "rule": { "id": "8f0c…", "name": "Big treasure boxes" }, "event": { "type": "envelope", "sourceEventId": "evt_…", "roomId": "7432…", "creatorUniqueId": "room.one", "region": "VN", "diamondCount": 5000, "peopleCount": 120, "score": 5000, "unpackAt": 1793520000, "observedAt": "2026-11-01T10:02:31.123Z" }, "links": { "creator": "https://app.toktokdata.live/creators/room.one", "session": "https://app.toktokdata.live/live?creator=room.one" }, "occurredAt": "2026-11-01T10:02:31.123Z", "deliveredAt": "2026-11-01T10:02:33.456Z"}驗證簽章
簽章為 HMAC-SHA256,以完整的 whsec_… 密鑰為金鑰,計算對象是時間戳記標頭、一個句點與原始請求主體:<timestamp>.<body>。十六進位摘要會以 sha256=<hex> 的格式放在 x-roomscope-signature 中送出。請以固定時間演算法比對,並拒絕超出你所設定時間範圍(以下範例為五分鐘)的時間戳記,以防止重送攻擊。
import { createHmac, timingSafeEqual } from "node:crypto"; // rawBody: the exact bytes received, e.g. express.raw({ type: "application/json" }).// secret: the full whsec_… value shown when the webhook channel was created.export function verify(rawBody, headers, secret, toleranceSec = 300) { const signature = headers["x-roomscope-signature"]; const timestamp = headers["x-roomscope-timestamp"]; if (!signature || !/^\d+$/.test(timestamp ?? "")) return false; if (Math.abs(Date.now() / 1000 - Number(timestamp)) > toleranceSec) return false; const expected = "sha256=" + createHmac("sha256", secret).update(`${timestamp}.`).update(rawBody).digest("hex"); const a = Buffer.from(signature, "utf8"); const b = Buffer.from(expected, "utf8"); return a.length === b.length && timingSafeEqual(a, b);}使用原始請求主體
請在簽章驗證通過後才解析 JSON,並以你收到的原始位元組計算 HMAC。重新序列化物件會改變空白與跳脫字元,導致比對失敗。
重試與失敗
- 狀態碼低於 300 即視為成功。
5xx、408、429、網路錯誤或逾時會重試;其他4xx或3xx則視為永久失敗。 - 每次推送最多嘗試 4 次,一次接著一次送出,中間沒有延遲。每次嘗試都會重新簽章,因此
deliveredAt、時間戳記與簽章都會改變。請以alertId去除重複,而不是以請求主體判斷。 - 推送成功後,同一個
alertId在 7 天內不會再次推送。 - 每個成功推送的 Webhook 花費 1 點。每個工作區每個日曆月(UTC)最多可接收 100,000 個 Webhook;超過的推送會被捨棄。
- 主控台目前尚未列出推送失敗的紀錄。若需要稽核軌跡,請自行記錄你收到的請求。
Telegram 與電子郵件
同一條規則也可以推送到已連結的 Telegram 聊天室或電子郵件地址;這些通道不需要處理簽章。請在 提醒 → 通道 中連結 Telegram。
這個頁面對你有幫助嗎?