Telegram संदेशों में विजेट्स को बॉट के लिए एक रिवर्स चैनल मिल गया है। 26 अक्टूबर को जारी macOS 13.1.0 के लिए Telegram के बीटा बिल्ड में, विजेट स्क्रिप्ट में एक request() कॉल जोड़ा गया है: टैप करने पर, यह बॉट को 64 बाइट तक डेटा भेजता है और 1,024 बाइट तक के जवाब का इंतजार करता है। बिना टैप किए, अनुरोध केवल बॉट के साथ निजी चैट में जाता है, यदि बॉट ने ऐसे अनुरोधों की अनुमति दी है, जब तक विजेट स्क्रीन पर है और हर पांच सेकंड में एक बार से अधिक नहीं। वहीं, विजेट अब जानता है कि इसे किसने खोला है — आईडी, नाम, यूज़रनेम और Premium की उपलब्धता — और यह किस प्रकार की चैट में है। विजेट्स खुद iOS, macOS और Android के बीटा में देखे गए हैं, लेकिन यह मैकेनिज़्म अभी केवल macOS बिल्ड में दिखाई दे रहा है; सार्वजनिक API स्कीम और Bot API में विजेट्स नहीं हैं।

The post on Telegram — @gramnews
मैसेज-विजेट कैसे होंगे

25 और 26 अक्टूबर के बीच क्या बदला

macOS बीटा अपडेट फ़ीड के माध्यम से वितरित किया जाता है, प्रत्येक बिल्ड ऐप के साथ एक ज़िप फ़ाइल है। तुलना के लिए 25 अक्टूबर का 13.1.0.283381 और 26 अक्टूबर का 13.1.0.283391 लिया गया है।

विजेट स्क्रिप्ट क्लाइंट के साथ ग्लोबल ऑब्जेक्ट 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 और वर्कर सैंडबॉक्स में स्टब्स से बदल दिए गए हैं, जो त्रुटि लौटाते हैं। डेटा बॉट के माध्यम से या विजेट द्वारा खोले गए लिंक के माध्यम से बाहर जाता है (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 कारण के साथ त्रुटि के रूप में प्राप्त करती है।

हटाए गए उदाहरणों में और क्या था

283381 बिल्ड के widget-sandbox फ़ोल्डर में 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 अक्टूबर को वर्णित किया गया था। विजेट बॉट से कैसे संपर्क करता है, वह दर्शक के बारे में क्या देखता है और अनुरोधों की सीमाएँ कहाँ हैं, इस विवरण में नहीं था।