मैसेज विजेट — HTML, CSS और JavaScript से बने इंटरैक्टिव ब्लॉक जो सीधे चैट में दिखते हैं — Telegram के Android और iOS बीटा में आ गए हैं। 25 अक्टूबर को, वे Android 13.2.0 (7254) और iOS 13.2 (35726) में दिखाई दिए, और Android पर एक कस्टम विजेट पहले से ही JavaScript चला रहा है। 27 अक्टूबर के Android 13.2.0 (7260) बिल्ड से पता चलता है कि यह कैसे काम करता है: बिना किसी ब्राउज़र इंजन के, अपने खुद के इंटरप्रेटर पर CPU कोटा के साथ, और एक अलग टच आर्बिटर के साथ जो यह तय करता है कि टैप वास्तविक था या नहीं। जिस बॉट को विजेट ने अनुरोध भेजा, उसे टैप करने वाले का id पता चल जाता है। Telegram Desktop और सार्वजनिक Bot API में अभी भी विजेट नहीं हैं।
macOS बीटा के लिए बॉट अनुरोधों की कार्यप्रणाली पर 27 अक्टूबर के लेख में चर्चा की गई थी; यहाँ वह सब है जो Android बिल्ड जोड़ता है।
विजेट कहाँ उपलब्ध हैं
| क्लाइंट | बिल्ड | क्या दिखता है |
|---|---|---|
| macOS, बीटा | 13.1.0 | सैंडबॉक्स, बॉट अनुरोध, टेस्ट पेज — अक्टूबर के मध्य से |
| Android, बीटा | 13.2.0 (7254, 7260) | स्कीम, सैंडबॉक्स, इंटरफ़ेस टेक्स्ट; विजेट काम करते हैं |
| iOS, बीटा | 13.2 (35726) | मैसेज विजेट और उन्हें जाँचने के उपकरण |
| Telegram Desktop | 7.3.3 | नहीं: न कोड में, न लेयर 232 की स्कीम में |
| Bot API | 10.3 | नहीं |
Android बीटा आधिकारिक चैनल और Telegram वेबसाइट से सीधे लिंक के माध्यम से वितरित किया जाता है। इसमें क्लाइंट प्रोटोकॉल लेयर 233 है, जो सार्वजनिक लेयर से एक नया है।
विजेट मैसेज में कैसे रहता है
विजेट एक नया मीडिया प्रकार है, messageMediaWidget। payload (कोड) और आकार के अलावा, इसमें दो डेटा सेट होते हैं: chat_data — इस मैसेज का डेटा, और public_data हैश के साथ — विजेट का सामान्य डेटा, जिसे बॉट भेजने के बाद बदल सकता है (messages.editMessageWidgetData, updateMessageWidgetData)। can_query और background_query फ़्लैग बताते हैं कि विजेट से बॉट को टैप करने पर और बिना टैप किए भी लिखा जा सकता है या नहीं, is_copy फ़ॉरवर्ड की गई कॉपी को चिह्नित करता है। विजेट बॉट के इनलाइन-रिप्लाई के रूप में भी आ सकता है — botInlineMessageWidget।
अनुमतियाँ भेजने वाला सेट करता है। क्लाइंट के नेटिव हिस्से से आने वाले एरर मैसेज में सर्वर फ़्लैग allow_queries और fwd_allow_queries का उल्लेख किया गया है: पहले के बिना विजेट बॉट को बिल्कुल नहीं लिखता, दूसरे के बिना उसकी फ़ॉरवर्ड की गई कॉपी चुप रहती है। बैकग्राउंड अनुरोध के लिए background_query की भी आवश्यकता होती है और यह तभी जाता है जब विजेट स्क्रीन पर हो।
बॉट को क्या मिलता है
टैप messages.getBotWidgetQueryAnswer में बदल जाता है जिसमें चैट, मैसेज और data — 64 बाइट तक — फ़ील्ड होते हैं। बॉट को updateBotWidgetQuery अपडेट मिलता है और वह messages.setBotWidgetQueryAnswer मेथड से एक result स्ट्रिंग के साथ जवाब देता है।
बॉट के लिए अपडेट में user_id फ़ील्ड अनिवार्य है, बिना किसी फ़्लैग के: बॉट को हमेशा पता होता है कि किसने टैप किया। इसके साथ chat_type, chat_instance — वही अनाम चैट पहचानकर्ता जो सामान्य इनलाइन-बटन में होता है — मैसेज नंबर और widget_id आते हैं। फ़ॉरवर्ड की गई कॉपी और इनलाइन-मैसेज के लिए अपने अपडेट होते हैं — updateBotWidgetCopyQuery और updateInlineBotWidgetQuery।
यह इनलाइन-बटन के कॉलबैक टैप के समान है, बस बटन स्क्रिप्ट द्वारा बनाया जाता है, और डेटा भी उसी द्वारा एकत्र किया जाता है।
विजेट कोड कैसे निष्पादित होता है
Android में विजेट के नीचे न तो WebView है और न ही Chromium। कोड क्लाइंट की मुख्य लाइब्रेरी के अंदर नेटिव twidget लाइब्रेरी द्वारा निष्पादित होता है — macOS बीटा में Twidget* प्रकार और उसके सोर्स कोड से जुड़ी बंद रिपॉजिटरी का भी यही नाम है। सैंडबॉक्स स्क्रिप्ट क्लाइंट में दो बार होती हैं: सोर्स कोड और .qbc बाइटकोड के रूप में, जिसे बिल्ट-इन JavaScript इंटरप्रेटर चलाता है। इमेज को Android विंडो में सीधे अपना रेंडरर बनाता है — कोई ब्राउज़र लेआउट नहीं है, बल्कि उसका पार्सिंग है: एक अलग validator पैकेज HTML और CSS की जाँच करता है।
सीमाएँ कोड में लिखी गई हैं, न कि डेवलपर्स के लिए नियमों में:
- प्रोसेसर — विजेट का एक समय कोटा (
cpuQuotaMs) होता है, जिसका उल्लंघन करने पर "CPU limit exceeded" एरर आती है; - टाइमर — एक साथ चलने वाले टाइमर की संख्या सीमित है, अतिरिक्त को इंजन अस्वीकार कर देता है;
- नेटवर्क —
fetch,XMLHttpRequest,WebSocketऔरnavigator.sendBeaconको ब्लॉक कर दिया गया है,navigator.onLineहमेशा गलत होता है,userAgent—TelegramWidget/1.0; - स्टोरेज — प्रत्येक विजेट खाली से शुरू होता है;
- बाहरी आउटपुट —
openLinkकेवल 256 वर्णों तक का https-एड्रेस लेता है और पूछता है: «This widget wants to open:»,copyText— 256 वर्णों तक; - क्लाइंट से ब्रिज — लॉन्च के बाद
__host,__hostOpsऔर आस-पास के सर्विस फ़ंक्शन ग्लोबल ऑब्जेक्ट से हटा दिए जाते हैं, और विजेट कोड उन तक नहीं पहुँच पाता है।
सैंडबॉक्स फ़ाइलों को क्लाइंट manifest.txt से चेकसम के साथ सत्यापित करता है, विसंगति एक अलग एरर «Bundle checksum mismatch» है।
क्लाइंट टैप को सिमुलेशन से कैसे अलग करता है
बैकग्राउंड अनुमति के बिना बॉट को अनुरोध केवल टैप हैंडलर से जाता है — "एक दृश्यमान विजेट पर एक टैप के लिए एक कॉल", जैसा कि एरर मैसेज में कहा गया है। यह तय करने वाला कि टैप हुआ था या नहीं, स्क्रिप्ट नहीं, बल्कि नेटिव टच आर्बिटर है: फ़ंक्शन arbiterDown, arbiterMove, arbiterUp और arbiterHoldDeadline उंगली के निर्देशांक और होल्डिंग टाइम प्राप्त करते हैं। डिज़ाइन के अनुसार, JavaScript से सिंथेटिक क्लिक, टाइमर या ड्रैग अनुरोध नहीं भेजेंगे।
बीटा में इस सीमा को जाँचने के लिए उपकरण भी हैं: कंफ़ॉर्मन्स स्क्रीन (WidgetConformanceActivity) और अटैक सेट (attackScan, WidgetAttacks) का रन। macOS के लिए अटैक टेस्ट पेजों का सेट — 28 पेज, जो बिना टैप किए मैसेज भेजने या लिंक पर रीडायरेक्ट करने की कोशिश करते हैं — क्लाइंट के ओपन कोड में उपलब्ध है।
उपयोगकर्ता क्या देखता है
इंटरफ़ेस टेक्स्ट पहले से ही क्लाइंट की अंग्रेजी स्ट्रिंग डिक्शनरी में हैं: «Loading widget…», «Widget failed to load», «Widget stopped», «Preview of the widget» और चेतावनी «This widget can send data to its bot's server when you tap it.»
बीटा की सेटिंग्स में विजेट्स को अक्षम करने के लिए कोई अलग टॉगल नहीं है — परीक्षक इस पर ध्यान देते हैं। अभी सभी विजेट नहीं भेज सकते हैं, और Bot API में उनके लिए कोई मेथड नहीं हैं।




