حصلت الويدجت في رسائل تيليجرام على قناة اتصال عكسية مع البوت. في إصدارات تيليجرام التجريبية لنظام macOS 13.1.0 بتاريخ 26 أكتوبر، ظهر استدعاء request() في سكربت الويدجت: عند النقر، يرسل ما يصل إلى 64 بايت إلى البوت وينتظر ردًا يصل إلى 1,024 بايت. بدون نقرة، يُرسل الطلب فقط في الدردشة الخاصة مع البوت، إذا سمح البوت بمثل هذه الطلبات، طالما أن الويدجت على الشاشة وليس أكثر من مرة كل خمس ثوانٍ. هناك، تعرف الويدجت الآن من قام بفتحها — المعرّف، الاسم، اسم المستخدم، ووجود Premium — ونوع الدردشة التي توجد فيها. لوحظت الويدجت نفسها في إصدارات iOS و macOS و Android التجريبية، ولكن هذه الآلية لا تظهر حاليًا إلا في إصدار macOS؛ لا توجد ويدجت في مخطط API العام أو في Bot API.
ما الذي تغير بين 25 و 26 أكتوبر
يتم توزيع إصدار macOS التجريبي عبر موجز التحديثات، وكل إصدار هو ملف مضغوط (zip) يحتوي على التطبيق. للمقارنة، تم أخذ الإصدار 13.1.0.283381 بتاريخ 25 أكتوبر والإصدار 13.1.0.283391 بتاريخ 26 أكتوبر.
يتواصل سكربت الويدجت مع العميل عبر الكائن العام TelegramWidget. يوجد رمزه في حزمة WidgetSandbox داخل التطبيق، في ملف sandbox-bundle.js. في الإصدار 283381، كان الكائن قادرًا على القليل: إرجاع سمة التصميم، الاشتراك في الأحداث، فتح رابط، وتفعيل الاهتزاز. في الإصدار 283391، أُضيف إلى ذلك ما يلي:
| ماذا | ماذا يفعل |
|---|---|
request(data) | يرسل سلسلة نصية من 1 إلى 64 بايت إلى البوت ويعيد رده |
viewer | معرّف واسم واسم عائلة واسم مستخدم وعلامة Premium للمشاهد |
chatType | نوع الدردشة: خاص، مجموعة، مجموعة خارقة، أو قناة |
chatData | بيانات مرتبطة بالرسالة في هذه الدردشة، تصل إلى 1,024 بايت |
publicData | بيانات الرسالة نفسها، تصل إلى 1,024 بايت |
watchPublicData() | اشتراك في تغييرات publicData |
isForward و isPreview | هل هي نسخة مُعاد توجيهها وهل هي معاينة لنتيجة مضمنة لم تُرسل بعد |
copyText(text) | يضع ما يصل إلى 256 حرفًا في الحافظة |
setResizeAnchor | الحافة التي تنمو منها الويدجت عند تغيير الارتفاع — العلوية أو السفلية |
إلى الأحداث الثلاثة السابقة — تغيير السمة، التفعيل، وإلغاء التفعيل — أُضيف chatDataChanged و publicDataChanged.
في الوقت نفسه، أُزيل كل المحتوى التجريبي من حزمة HTMLBubbles: ثلاث عشرة دردشة تجريبية، والتي ذُكرت في المقال بتاريخ 13 أكتوبر، ومجلد ported الذي يحتوي على البطاقات المنقولة، ولعبة voxel-clash متعددة اللاعبين، ومجلد widget-sandbox الذي يحتوي على الأمثلة. بقيت مكتبة three.js واحدة فقط في الحزمة.
متى يمكن للويدجت أن تكتب إلى البوت
القواعد مسجلة في نفس بيئة الاختبار المعزولة، في نص الأخطاء التي يتلقاها السكربت، وفي سلاسل التطبيق:
- يُرسل الطلب من معالج النقر على الويدجت، استدعاء واحد لكل نقرة؛
- بدون نقرة — فقط في الدردشة الخاصة مع البوت، فقط إذا سُمح للرسالة بطلبات الخلفية (العلامة
background_query)، فقط طالما أن الويدجت على الشاشة وليس أكثر من مرة كل خمس ثوانٍ؛ - بينما ينتظر الطلب السابق ردًا، لا يُرسل طلب جديد؛
- معاينة النتيجة المضمنة، التي لم تُرسل بعد إلى الدردشة، لا تسأل البوت؛
- الطلبات معطلة إذا لم يسمح البوت بها لهذه الرسالة — للنسخة المُعاد توجيهها إذن منفصل؛
- رد البوت — نص فقط ولا يزيد عن 1,024 بايت، وإلا يتلقى السكربت خطأ
INVALID_ANSWER؛ إذا لم يرد في الوقت المحدد —TIMEOUT.
في النسخة المُعاد توجيهها، يكون chatData فارغًا، بينما يبقى publicData.
في سلاسل التطبيق بجانب رمز فقاعة HTML، ظهرت العبارة «A tap may send data to the bot» — «قد ترسل النقرة بيانات إلى البوت». لا يظهر من الإصدار أين يعرض العميل هذه العبارة بالضبط.
ماذا تفعل
- الويدجت تعيش حاليًا في الإصدارات التجريبية فقط، ولا يمكن إرسالها من البوتات: لا توجد طريقة في Bot API لإرسال ويدجت.
- عند النقر على الويدجت، ضع في اعتبارك أن كل نقرة قد تصبح طلبًا إلى البوت. يرى السكربت معرّفك واسمك واسم المستخدم وحالة Premium، ويشغل المعرّف ما يصل إلى 16 رقمًا — وهو يتسع في طلب بحجم 64 بايت.
- بحد ذاتها، بدون نقرة، تكتب الويدجت إلى البوت فقط في الدردشة الخاصة مع هذا البوت. بالنسبة للمجموعات والقنوات، لا توفر بيئة الاختبار المعزولة طلبات الخلفية.
- لا تملك الويدجت شبكة:
fetchوXMLHttpRequestوWebSocketوالعاملون (workers) في بيئة الاختبار المعزولة تم استبدالهم ببدائل تعيد خطأ. تُرسل البيانات إلى الخارج عبر البوت أو عبر رابط تفتحه الويدجت (openLinkيقبل https فقط ولا يزيد عن 256 حرفًا) — كان هذا هو الحال أيضًا في إصدار 25 أكتوبر.
كيف يقوم الخادم بتسليم الويدجت
في الملف الثنائي 283391، ظهرت أسماء أنواع المخطط التي لم تكن موجودة في 283381. في المخطط العام للطبقة 232 — لا في Telegram Desktop ولا في Telegram Web A — لا توجد ويدجت، ولا توجد ويدجت في وثائق Bot API. يمكن قراءة البنية من الأسماء، لذا ما يلي هو قراءة، وليس وصفًا:
botInlineMessageWidgetوinputBotInlineMessageWidgetوinputBotInlineMessageWidgetId— البوت، على ما يبدو، يعيد الويدجت كنتيجة مضمنة، بالكامل أو بالمعرّف؛inputMediaWidgetId— الويدجت كمرفق رسالة بالمعرّف؛updateBotWidgetQueryوupdateInlineBotWidgetQueryوupdateBotWidgetCopyQuery— طلبات إلى البوت من الويدجت في رسالة عادية، وفي رسالة مرسلة عبر الوضع المضمن، وعلى ما يبدو من الاسم، في نسخة مُعاد توجيهها؛ الرد هوbotWidgetQueryAnswer؛updateMessageWidgetDataوwidgetPublicData— يرسل الخادم بيانات جديدة للويدجت المرسلة بالفعل، وفي بيئة الاختبار المعزولة يوجد حدثpublicDataChangedلذلك؛- أخطاء الخادم
WIDGET_QUERY_NOT_ALLOWEDوWIDGET_RESPONSE_TIMEOUTتبدو كزوج لأخطاء السكربتNOT_ALLOWEDوTIMEOUT.
تسمي سلاسل العميل أيضًا علامات الأذونات: allow_queries للرسالة، fwd_allow_queries لنسخها المُعاد توجيهها، و background_query للطلبات بدون نقرة. ما الذي يتلقاه البوت بالضبط مع الطلب — معرّف الناقر، كما هو الحال مع الأزرار أسفل الرسالة، أم لا — لا يظهر من الإصدار.
ما الذي تختبره مختبرات القياس في الكود المفتوح
في مستودع العميل المفتوح، تم ربط محرك الويدجت كوحدة فرعية twidget؛ عند رابط الوحدة الفرعية، يرد GitHub بالخطأ 404 — المستودع مغلق أو محذوف. توجد بجانبه مختبرات للقياس، وفي مجلد tools/perflab/TwidgetLab/widgets/attack — 28 ويدجت تحاول العمل بدون نقرة حقيقية. ستة عشر منها ترسل بيانات إلى البوت: بمؤقت كل 50 مللي ثانية، بنقرة اصطناعية، باستدعاء مؤجل بعد النقر، عبر تسمية حقل النموذج (label)، بالسحب والإفلات. اثنا عشر منها تحاول بدون نقرة فتح رابط أو مغادرة الصفحة — برابط فوق زر، بإرسال نموذج، بالتحديث التلقائي للصفحة. ظهر المجلد في المستودع مع التزام بتاريخ 23 أكتوبر، قبل ثلاثة أيام من الإصدار الذي يحتوي على request().
في هذه المختبرات، لا يزال الإرسال يُسمى TelegramWidget.sendMessage. في الإصدار 283391، لا يوجد مثل هذا الاستدعاء — يوجد request()، ويتلقى السكربت الاستدعاء خارج النقر كخطأ بسبب no-activation.
::: تفاصيل ما كان موجودًا أيضًا في الأمثلة التي أُزيلت
في مجلد widget-sandbox من الإصدار 283381، كان هناك مجموعتان من 20 ويدجت — with-profile و without-profile. كانت أسماء الملفات عبارة عن طلبات: «show me a mortgage calculator»، «make a bar chart of the top 6 programming…»، «create a pomodoro timer»، «create a flashcard widget for 8 Spanish…». يُذكر الكائن TelegramWidget في 12 ملفًا من المجموعة الأولى ولا يوجد في أي ملف من المجموعة الثانية. يبدو أنها ويدجت تم تجميعها بواسطة نموذج بناءً على نفس الطلبات مع وصف لإمكانيات بيئة الاختبار المعزولة وبدونها — هذا استنتاج بناءً على المحتوى، الإصدار نفسه لا يذكر ذلك. كلمة profile موجودة أيضًا في الكائن TelegramWidget: خاصية profile تساوي 1، و isProfileAtLeast() تتحقق من المستوى.
الباقي في المجلد — فحوصات التوافق (Chart.js، D3، three.js، WebGL، النماذج، السحب والإفلات، localStorage)، بطاقات للعرض حسب مواضيع «التسوق»، «العمل»، «الحياة»، «السفر»، واختبارات الضغط.
:::
أين توجد الويدجت أيضًا
وُصفت الويدجت في الرسائل كتنسيق للتحديث التالي 13.2 بتاريخ 25 أكتوبر. لم يتضمن هذا الوصف كيفية اتصال الويدجت بالبوت، وما تراه عن المشاهد، وأين تقع حدود الطلبات.




