Xabarlardagi vidjetlar — bu toʻgʻridan-toʻgʻri yozishmalarda HTML, CSS va JavaScript'dan iborat interaktiv bloklar — Telegram'ning Android va iOS uchun beta-versiyalariga yetib keldi. 25-oktabr kuni ular Android 13.2.0 (7254) va iOS 13.2 (35726) versiyalarida paydo boʻldi va Android'da qoʻlda yasalgan vidjet allaqachon JavaScript'ni ijro etmoqda. 27-oktabrdagi Android 13.2.0 (7260) build'i bu qanday ishlashini koʻrsatadi: brauzer dvigatagisiz, oʻzining protsessor kvotasi boʻlgan interpretatorida, bosish haqiqiy boʻlgan-boʻlmaganini hal qiladigan alohida sudya bilan. Vidjet soʻrov yuborgan bot, bosgan foydalanuvchining ID'sini bilib oladi. Telegram Desktop va ommaviy API'da vidjetlar hali ham mavjud emas.
macOS beta-versiyasi uchun botga soʻrovlar mexanikasi 27-oktabrdagi maqolada koʻrib chiqilgan edi; bu yerda esa Android uchun build qoʻshgan narsalar haqida.
Vidjetlar qayerda mavjud
| Klient | Build | Nima koʻrinadi |
|---|---|---|
| macOS, beta | 13.1.0 | sandbox, botga soʻrovlar, test sahifalari — oktabr oʻrtalaridan beri |
| Android, beta | 13.2.0 (7254, 7260) | sxema, sandbox, interfeys matnlari; vidjetlar ishlaydi |
| iOS, beta | 13.2 (35726) | xabarlardagi vidjetlar va ularni tekshirish vositalari |
| Telegram Desktop | 7.3.3 | yoʻq: na kodda, na layer 232 sxemasida |
| Bot API | 10.3 | yoʻq |
Android beta-versiyasi rasmiy kanal va Telegram saytidan toʻgʻridan-toʻgʻri havola orqali tarqatiladi. Undagi klient protokoli — layer 233, ommaviydan bir qadam yangi.
Vidjet xabarda qanday joylashadi
Vidjet — bu messageMediaWidget nomli yangi media turi. Uning oʻz kodi (payload) va oʻlchamlaridan tashqari, ikkita maʼlumotlar toʻplami mavjud: chat_data — bu xabarning maʼlumotlari va public_data hash bilan — bot yuborilgandan keyin oʻzgartirishi mumkin boʻlgan umumiy vidjet maʼlumotlari (messages.editMessageWidgetData, updateMessageWidgetData). can_query va background_query flaglari vidjetdan botga bosish orqali va bosishsiz yozish mumkinligini bildiradi, is_copy esa qayta yuborilgan nusxani belgilaydi. Vidjet botning inline-javobi sifatida ham kelishi mumkin — botInlineMessageWidget.
Ruxsatlarni yuboruvchi oʻrnatadi. Klientning mahalliy qismidan kelgan xato xabarlarida allow_queries va fwd_allow_queries server flaglari nomi keltirilgan: birinchisisiz vidjet botga umuman yozmaydi, ikkinchisisiz uning qayta yuborilgan nusxasi jim turadi. Fon soʻrovi yana background_query talab qiladi va faqat vidjet ekranda turganida yuboriladi.
Bot nima oladi
Bosish messages.getBotWidgetQueryAnswer ga aylanadi, unda chat, xabar va data (64 baytgacha) maydonlari mavjud. Bot updateBotWidgetQuery yangilanishini oladi va messages.setBotWidgetQueryAnswer metodi bilan bitta result qatori bilan javob beradi.
Bot uchun yangilanishda user_id maydoni majburiy, flagsiz: bot har doim kim bosganini biladi. Yonida chat_type, chat_instance — oddiy inline-tugmalar bilan bir xil shaxssiz chat identifikatori — xabar raqami va widget_id keladi. Qayta yuborilgan nusxalar va inline-xabarlar uchun oʻz yangilanishlari mavjud — updateBotWidgetCopyQuery va updateInlineBotWidgetQuery.
Bu inline-tugmani callback bilan bosishga oʻxshaydi, faqat tugmani skript chizadi va maʼlumotlarni ham u yigʻadi.
Vidjet kodi qanday ijro etiladi
Android'da vidjet ostida na WebView, na Chromium mavjud emas. Kod klientning asosiy kutubxonasi ichidagi twidget mahalliy kutubxonasi tomonidan ijro etiladi — macOS beta-versiyasidagi Twidget* turlari va uning manba kodlariga ulangan yopiq repository ham xuddi shu nomga ega. Sandbox skriptlari klientda ikki marta joylashgan: manba kodi va oʻrnatilgan JavaScript interpretatori ishga tushiradigan .qbc baytkodi sifatida. Rasmni oʻzining rendereri toʻgʻridan-toʻgʻri Android oynasiga chizadi — brauzer layout'i yoʻq, uning tahlili mavjud: alohida validator paketi HTML va CSS'ni tekshiradi.
Cheklovlar ishlab chiquvchilar uchun qoidalarda emas, balki kodda yozilgan:
- protsessor — vidjetda vaqt kvotasi (
cpuQuotaMs) mavjud, uni oshirish «CPU limit exceeded» xatosi bilan yakunlanadi; - taymerlar — bir vaqtning oʻzida ishlaydiganlar soni cheklangan, ortiqchasini dvigatel rad etadi;
- tarmoq —
fetch,XMLHttpRequest,WebSocketvanavigator.sendBeaconbloklangan,navigator.onLinehar doim yolgʻon,userAgent—TelegramWidget/1.0; - saqlash joyi — har bir vidjet boʻsh holatdan boshlanadi;
- tashqariga chiqishlar —
openLinkfaqat 256 belgidan oshmaydigan https-manzilni oladi va soʻraydi: «This widget wants to open:»,copyText— 256 belgidan oshmaydigan matnni; - klientga koʻprik — ishga tushirilgandan soʻng
__host,__hostOpsva qoʻshni xizmat funksiyalari global obyektdan oʻchiriladi va vidjet kodi ularga yeta olmaydi.
Sandbox fayllarini klient manifest.txt dagi checksumlar bilan solishtiradi, nomuvofiqlik — alohida «Bundle checksum mismatch» xatosi.
Klient bosishni imitatsiyadan qanday ajratadi
Fon ruxsatisiz botga soʻrov faqat bosishni qayta ishlovchidan yuboriladi — «koʻrinadigan vidjetdagi bitta bosishga bitta chaqiruv», xato xabarida aytilganidek. Bosish boʻlgan-boʻlmaganini skript emas, balki mahalliy touch arbiter hal qiladi: arbiterDown, arbiterMove, arbiterUp va arbiterHoldDeadline funksiyalari barmoq koordinatalarini va ushlab turish vaqtini oladi. Dizayn boʻyicha, JavaScript'dan kelgan sintetik klik, taymer yoki tortish soʻrov yubormaydi.
Beta-versiyada bu chegarani tekshirish uchun vositalar ham mavjud: moslik ekrani (WidgetConformanceActivity) va hujumlar toʻplamini ishga tushirish (attackScan, WidgetAttacks). macOS uchun hujum test sahifalari toʻplami — bosishsiz xabar yuborishga yoki havolaga yoʻnaltirishga urinadigan 28 sahifa — klientning ochiq kodida joylashgan.
Foydalanuvchi nima koʻradi
Interfeys matnlari allaqachon klientning inglizcha lugʻatida mavjud: «Loading widget…», «Widget failed to load», «Widget stopped», «Preview of the widget» va «This widget can send data to its bot's server when you tap it.» ogohlantirishi.
Beta sozlamalarida vidjetlarni oʻchirib qoʻyadigan alohida tugma yoʻq — bunga testerlar eʼtibor qaratmoqda. Vidjetlarni hozircha hamma ham yubora olmaydi, Bot API'da esa ular uchun metodlar mavjud emas.




