Telegram mesajlarındaki widget'lar bota geri kanal kazandı. 26 Ekim tarihli macOS 13.1.0 için Telegram beta yapılarında, widget betiği bir request() çağrısına sahip oldu: bir dokunuşla bota 64 bayta kadar veri gönderiyor ve 1.024 bayta kadar yanıt bekliyor. Dokunma olmadan, istek yalnızca botla olan özel sohbette, bot bu tür isteklere izin vermişse, widget ekrandayken ve beş saniyede birden fazla olmamak kaydıyla gönderilir. Aynı yerde, widget artık onu kimin açtığını — kimlik, ad, kullanıcı adı ve Premium üyeliği — ve hangi sohbet türünde bulunduğunu biliyor. Widget'ların kendileri iOS, macOS ve Android betalarında görüldü, ancak bu mekanizma şimdilik sadece macOS yapısında görülebiliyor; genel API şemasında ve Bot API'de widget'lar bulunmuyor.
25 ve 26 Ekim Arasında Neler Değişti
macOS betası güncelleme akışı üzerinden dağıtılıyor, her yapı bir uygulama içeren bir zip dosyasıdır. Karşılaştırma için 25 Ekim tarihli 13.1.0.283381 ve 26 Ekim tarihli 13.1.0.283391 sürümleri kullanıldı.
Widget betiği, istemciyle global TelegramWidget nesnesi aracılığıyla iletişim kurar. Kodu, uygulamanın içindeki WidgetSandbox paketinde, sandbox-bundle.js dosyasında bulunur. 283381 sürümünde nesne az şey yapabiliyordu: tema vermek, olaylara abone olmak, bağlantı açmak ve titreşimi etkinleştirmek. 283391 sürümünde bunlara şunlar eklendi:
| Ne | Ne yapar |
|---|---|
request(data) | bota 1 ila 64 bayt arasında bir dize gönderir ve yanıtını döndürür |
viewer | izleyenin kimliği, adı, soyadı, kullanıcı adı ve Premium özelliği |
chatType | sohbet türü: özel, grup, süper grup veya kanal |
chatData | bu sohbetteki mesaja bağlı veriler, 1.024 bayta kadar |
publicData | mesajın kendi verileri, 1.024 bayta kadar |
watchPublicData() | publicData değişikliklerine abone olma |
isForward ve isPreview | bu bir iletilmiş kopya mı ve henüz gönderilmemiş bir inline sonucun önizlemesi mi |
copyText(text) | panoya 256 karaktere kadar metin kopyalar |
setResizeAnchor | widget'ın yükseklik değiştiğinde büyüdüğü kenar — üst veya alt |
Önceki üç olaya — tema değişikliği, etkinleştirme ve devre dışı bırakma — chatDataChanged ve publicDataChanged eklendi.
Aynı zamanda, HTMLBubbles paketinden tüm tanıtım içeriği kaldırıldı: 13 Ekim tarihli makalede bahsedilen on üç demo sohbeti, taşınmış kartları içeren ported klasörü, çok oyunculu voxel-clash oyunu ve örnekleri içeren widget-sandbox klasörü. Pakette sadece three.js kütüphanesi kaldı.
Widget Bota Ne Zaman Yazabilir
Kurallar aynı sandbox'ta, betiğin aldığı hata metinlerinde ve uygulama dizelerinde yazılıdır:
- İstek, widget'a yapılan dokunuşun işleyicisinden gönderilir, her dokunuş için bir çağrı;
- Dokunma olmadan — sadece botla olan özel sohbette, sadece mesaja arka plan isteklerine izin verilmişse (
background_querybayrağı), sadece widget ekrandayken ve beş saniyede birden fazla olmamak kaydıyla; - Önceki isteğin yanıtı beklenirken, yeni bir istek gönderilmez;
- Henüz sohbete gönderilmemiş bir inline sonucun önizlemesi bota soru sormaz;
- Bot bu mesaja izin vermediyse istekler kapalıdır — iletilmiş kopyanın ayrı bir izni vardır;
- Botun yanıtı sadece metin olmalı ve 1.024 bayttan uzun olmamalıdır, aksi takdirde betik
INVALID_ANSWERhatası alır; zamanında yanıt vermezse —TIMEOUT.
İletilmiş kopyada chatData boş, ancak publicData kalır.
Uygulama dizelerinde, HTML-baloncuğu kodunun yanında "A tap may send data to the bot" — "dokunuş bota veri gönderebilir" ifadesi belirdi. İstemcinin bunu tam olarak nerede gösterdiği yapıdan anlaşılamıyor.
Ne Yapmalı
- Widget'lar şimdilik sadece betalarda yaşıyor ve botlardan gönderilemiyor: Bot API'de widget gönderecek bir yöntem yok.
- Widget'a dokunurken, her dokunuşun bota bir istek olabileceğini unutmayın. Betik sizin kimliğinizi, adınızı, kullanıcı adınızı ve Premium üyeliğinizi görür ve kimlik 16 haneye kadar yer kaplar — 64 baytlık bir isteğe sığar.
- Kendi başına, dokunma olmadan, widget bota sadece o botla olan özel sohbette yazar. Gruplar ve kanallar için sandbox arka plan istekleri sağlamaz.
- Widget'ın ağı yoktur:
fetch,XMLHttpRequest,WebSocketve worker'lar sandbox'ta hata döndüren sahte işlevlerle değiştirilmiştir. Veriler dışarıya bot aracılığıyla veya widget'ın açtığı bir bağlantı aracılığıyla (openLinksadece https kabul eder ve 256 karakterden uzun olamaz) gider — bu, 25 Ekim yapısında da böyleydi.
Sunucu Widget'ı Nasıl Teslim Eder
283391 ikili dosyasında, 283381'de olmayan şema türlerinin adları belirdi. Katman 232'nin genel şemasında — ne Telegram Desktop ne de Telegram Web A — bunlar yok, widget'lar Bot API belgelerinde de yok. Yapılandırma adlardan okunur, bu nedenle aşağıda bir açıklama değil, bir yorumlama bulunmaktadır:
botInlineMessageWidget,inputBotInlineMessageWidgetveinputBotInlineMessageWidgetId— bot, görünüşe göre, widget'ı bir inline sonuç olarak, tamamen veya kimliğe göre döndürür;inputMediaWidgetId— kimliğe göre bir mesaj eki olarak widget;updateBotWidgetQuery,updateInlineBotWidgetQueryveupdateBotWidgetCopyQuery— widget'tan bota gelen istekler, sıradan bir mesajda, inline mod aracılığıyla gönderilen bir mesajda ve adına bakılırsa, iletilmiş bir kopyada; yanıt —botWidgetQueryAnswer;updateMessageWidgetDatavewidgetPublicData— sunucu zaten gönderilmiş widget'ın yeni verilerini gönderir ve sandbox'ta bunun içinpublicDataChangedolayı vardır;- Sunucu hataları
WIDGET_QUERY_NOT_ALLOWEDveWIDGET_RESPONSE_TIMEOUT, betik hatalarıNOT_ALLOWEDveTIMEOUTile eşleşiyor gibi görünüyor.
İstemci dizeleri izin bayraklarını da adlandırır: mesaj için allow_queries, iletilmiş kopyaları için fwd_allow_queries ve dokunma olmadan yapılan istekler için background_query. Botun istekle birlikte tam olarak ne aldığı — mesajın altındaki düğmelerde olduğu gibi dokunanın kimliği mi, yoksa değil mi — yapıdan anlaşılamıyor.
Açık Kodda Benchmark Laboratuvarları Neyi Kontrol Ediyor
Açık istemci deposunda widget motoru twidget alt modülü olarak bağlanmıştır; alt modül bağlantısında GitHub 404 yanıtı verir — depo kapalı veya silinmiş. Yanında benchmark laboratuvarları bulunur ve tools/perflab/TwidgetLab/widgets/attack klasöründe, gerçek bir dokunuş olmadan işlem yapmaya çalışan 28 widget vardır. Bunlardan on altısı bota veri gönderir: her 50 ms'de bir zamanlayıcıyla, sentetik bir tıklamayla, tıklamadan sonra gecikmeli bir çağrıyla, form alanı etiketi (label) aracılığıyla, sürükle ve bırak ile. On ikisi dokunma olmadan bir bağlantı açmaya veya sayfadan ayrılmaya çalışır — bir düğmenin üzerindeki bağlantıyla, form gönderimiyle, sayfa otomatik yenilemesiyle. Klasör, 23 Ekim'de, request() içeren yapıdan üç gün önce commit ile depoya eklendi.
Bu benchmark'larda gönderme hala TelegramWidget.sendMessage olarak adlandırılır. 283391 yapısında böyle bir çağrı yoktur — request() vardır ve dokunma dışındaki çağrıyı betik no-activation nedeni ile bir hata olarak alır.
Widget'lar Başka Nerede
Mesajlardaki widget'lar, 13.2 güncellemesinin bir sonraki formatı olarak 25 Ekim'de açıklanmıştı. Widget'ın bota nasıl başvurduğu, izleyici hakkında ne gördüğü ve isteklerin sınırlarının nerede olduğu bu açıklamada yer almıyordu.




