التفاعلات عبر HTTP
استقبل الأوامر والأزرار والنماذج على عنوان HTTPS الخاص بك، دون اتصال بالبوابة.
ما تحتاج إليه
- Node 22 أو أحدث، وعنوان HTTPS عام.
- رمز بوتك (
YOUR_BOT_TOKEN) وسر التوقيع (YOUR_SIGNING_SECRET). - لا نيّات اتصال: تصل التفاعلات أيًا كانت نيّات البوابة.
الخطوات
- افتح بوتك في بوابة المطورين واختر تفاعلات HTTP. أنشئ سر توقيع وانسخه. يظهر مرة واحدة.
- شغّل المثال أدناه على سيرفرك، والسر في
ZRZUR_SIGNING_SECRET. - أدخل عنوانك في النافذة نفسها، واحفظ وأكّد كلمة مرورك. يرسل زرزور أولًا طلبي اختبار بأي ترتيب: طلبًا بتوقيع خاطئ يجب رفضه، و
Pingموقعًا يجب أن يجاب بـ{"type":"Pong"}. تفعل المكتبة الأمرين عنك.
من الآن لا تستقبل البوابة تفاعلات هذا البوت. أزل العنوان للعودة.
مثال كامل
// A bot without a gateway connection: `/hello` answered over HTTP.
//
// ZRZUR_BOT_TOKEN=... ZRZUR_SIGNING_SECRET=... PORT=8787 node http-interactions.mjs
import { Client } from "@zrzur/sdk/bot";
const bot = new Client({ apiUrl: process.env.ZRZUR_API_URL });
bot.command("hello", (i) => i.reply(`Hello ${i.user.username}, over HTTP!`));
await bot.loginHttp(process.env.ZRZUR_BOT_TOKEN);
await bot.syncCommands([{ name: "hello", description: "Say hello" }]);
await bot.listen({
secret: process.env.ZRZUR_SIGNING_SECRET,
port: Number(process.env.PORT ?? 8787),
});
console.log(`ready as ${bot.user.username}`);
ما يجب أن تراه
ready as <your bot> في الطرفية، ثم Hello <name>, over HTTP! في القناة عندما يستخدم أحدهم /hello.
كيف يبدو الطلب
كل طلب هو POST يحمل JSON نفسه الموجود في interaction داخل InteractionCreate، مع ثلاث ترويسات:
| الترويسة | المعنى |
|---|---|
X-Zrzur-Timestamp | الثواني منذ بداية التقويم عند التوقيع |
X-Zrzur-Signature | v1= ثم HMAC-SHA256 بصيغة ست عشرية للنص الموقّع |
X-Zrzur-Delivery | معرّف هذا التسليم لسجلاتك. غير موقّع |
النص الموقّع هو v1:<timestamp>:<raw body>. دون المكتبة:
- ارفض الطلب بـ
401إذا ابتعد الوقت عن ساعتك أكثر من 300 ثانية. - احسب HMAC-SHA256 للنص الموقّع بسرك وقارنه في زمن ثابت (
crypto.timingSafeEqualفي Node وhmac.compare_digestفي Python). لا تقارن أبدًا بـ==. - ارفض
_idمن الجسم الموقّع إذا عالجته في الدقائق العشر الأخيرة: فهذا طلب مسروق أُعيد إرساله. لا تستخدمX-Zrzur-Deliveryلذلك: فهو غير موقّع ويستطيع أي أحد تغييره. - أجب
{"type":"Ping"}بـ{"type":"Pong"}.
لا يصل شيء إلى بوت معطل أو مالكه معلّق، ولا يمكن تغيير عنوانه.
تحقق بهذا المثال. مع السر zrzur_sign_f27c5773e21ddeceaeb5e956dc45c16451f737addd5c0e4472f61060bca9b030 والوقت 1700000000 والجسم {"type":"Ping"} يكون التوقيع v1=928e5ffdc88564103b59f5485a6bfa7e1a633dca64f397396606a314f572c4d3.
كيف ترد
رد خلال 3 ثوانٍ بإحدى طريقتين:
202أو204بلا جسم، ثم استدعPOST /interactions/{id}/{token}/callbackكما مع البوابة. هذا ما تفعله المكتبة.200بالجسم الذي كنت سترسله إلى ذلك المسار، مثل{"type":"Message","data":{"content":"Hello"}}.
أي حالة أخرى أو انتهاء المهلة أو إعادة توجيه أو جواب يتجاوز 1 ميبيبايت يُفشل التفاعل، ويرى الشخص الفشل. لا تُتبع إعادات التوجيه.
الأخطاء الشائعة
يفشل حفظ العنوان بالخطأ SignedDeliveryRejected، ويبيّن reason السبب:
reason | السبب | الحل |
|---|---|---|
invalid_url | ليس https، أو يحمل كلمة مرور | استخدم عنوان https:// عاديًا |
blocked_address | العنوان خاص أو محظور | استخدم عنوانًا عامًا |
not_reachable | لم يجب شيء | تحقق من أن السيرفر يعمل وأنه عام |
timed_out | لا جواب خلال 3 ثوانٍ | رد أسرع |
accepts_bad_signatures | مر الطلب ذو التوقيع الخاطئ | افحص التواقيع وأجب 401 |
bad_status | لم يحصل Ping على 200 | أجب Ping بـ200 |
bad_answer | لم يحصل Ping على {"type":"Pong"} | أرسل هذا JSON تمامًا |
answer_too_large | الجواب يتجاوز 1 ميبيبايت | أرسل جوابًا أصغر |
FeatureDisabled يعني أن هذا السيرفر بلا مفتاح توقيع مضبوط، أو مفتاحه أقل من 32 بايتًا. وInvalidOperation يعني أن البوت لا يملك سر توقيع بعد.