آخر تحديث
Webhooks
يمكن لقاعدة التنبيه الإرسال إلى نقطة نهاية HTTPS إلى جانب الإشعارات داخل التطبيق والبريد الإلكتروني وTelegram. كل إرسال هو طلب POST بصيغة JSON موقّع بسر القناة، الذي يُعرض مرة واحدة فقط عند إنشاء القناة.
إعداد نقطة نهاية
- في لوحة التحكم افتح Alerts → Rules → New rule، واختر أنواع الأحداث، ثم أضف قناة Webhook مع عنوان HTTPS الخاص بك. وباستخدام مفتاح API، أرسل القاعدة نفسها إلى
POST /v1/alerts/rules(النطاقwebhook:manage). - انسخ سر التوقيع (
whsec_…). يُرجَع مرة واحدة فقط، فيwebhookSecrets[].signingSecret، سرّ واحد لكل قناة webhook. احفظه مع نقطة النهاية الخاصة بك. - أجب برمز
2xxخلال 10 ثوانٍ، ونفّذ المعالجة بشكل غير متزامن. لا تُتبَع عمليات إعادة التوجيه، وتُرفض العناوين الخاصة وعناوين الاسترجاع (loopback) وعناوين الارتباط المحلي (link-local). - يرسل
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 | إصدار مخطط الحمولة، حاليًا 2026-11-03 (يضيف `links`). |
x-roomscope-signature | sha256=<hex>، حيث <hex> هو ملخص HMAC-SHA256 الست عشري لـ "<timestamp>.<raw body>". |
الحمولة
حدث واحد لكل طلب، بصيغة JSON مضغوطة. تُضبط الحقول diamondCount وpeopleCount وunpackAt (بثواني Unix) للنوعين envelope وgoodyBag، وتكون null للأنواع الأخرى.
{ "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);}إعادة المحاولة والإخفاقات
- أي حالة أقل من 300 تُعد نجاحًا. يُعاد إرسال الطلب عند
5xxأو408أو429أو خطأ في الشبكة أو انتهاء المهلة؛ أما أي4xxآخر أو3xxفيُعد إخفاقًا نهائيًا. - يحصل الإرسال على 4 محاولات كحد أقصى، تُرسل واحدة تلو الأخرى دون تأخير. تُوقَّع كل محاولة من جديد، لذا تتغير قيمة
deliveredAtوالطابع الزمني والتوقيع. أزِل التكرار بالاعتماد علىalertId، لا على جسم الطلب. - بعد نجاح الإرسال، لا يُرسل
alertIdنفسه مرة أخرى لمدة 7 أيام. - يكلّف كل webhook مُرسل وحدة رصيد واحدة. يمكن لمساحة العمل استقبال ما يصل إلى 100,000 webhook في الشهر الميلادي (بتوقيت UTC)؛ وتُسقَط الإرسالات التي تتجاوز ذلك.
- لا تُعرض الإرسالات الفاشلة في لوحة التحكم حتى الآن. سجّل الطلبات التي تستقبلها إن كنت بحاجة إلى سجل تدقيق.
Telegram والبريد الإلكتروني
يمكن للقاعدة نفسها أيضًا الإرسال إلى محادثة Telegram متصلة أو إلى عنوان بريد إلكتروني؛ ولا تتطلب هاتان القناتان أي معالجة للتوقيع. اربط Telegram من Alerts → Channels.