Các widget trong tin nhắn Telegram đã có một kênh phản hồi đến bot. Trong các bản dựng beta của Telegram dành cho macOS 13.1.0 từ ngày 26 tháng 10, script của widget đã có một lời gọi request(): khi chạm vào, nó gửi đến bot tối đa 64 byte và chờ phản hồi tối đa 1.024 byte. Nếu không chạm, yêu cầu chỉ được gửi trong cuộc trò chuyện riêng với bot, nếu bot cho phép các yêu cầu đó, miễn là widget đang hiển thị trên màn hình và không quá một lần mỗi năm giây. Tại đó, widget giờ đây cũng biết ai đã mở nó — ID, tên, username và trạng thái Premium, — cũng như loại cuộc trò chuyện mà nó đang nằm trong. Bản thân các widget đã được phát hiện trong các bản beta của iOS, macOS và Android, nhưng cơ chế này hiện chỉ thấy rõ trong bản dựng dành cho macOS; trong lược đồ API công khai và Bot API không có widget.
Những thay đổi giữa ngày 25 và 26 tháng 10
Bản beta macOS được phân phối qua nguồn cấp dữ liệu cập nhật, mỗi bản dựng là một tệp zip chứa ứng dụng. Để so sánh, chúng tôi đã sử dụng bản 13.1.0.283381 từ ngày 25 tháng 10 và bản 13.1.0.283391 từ ngày 26 tháng 10.
Script của widget giao tiếp với client thông qua đối tượng toàn cục TelegramWidget. Mã của nó nằm trong gói WidgetSandbox bên trong ứng dụng, trong tệp sandbox-bundle.js. Trong bản 283381, đối tượng này có thể làm một vài việc: trả về chủ đề, đăng ký sự kiện, mở liên kết và bật rung. Trong bản 283391, các chức năng sau đã được thêm vào:
| Gì | Làm gì |
|---|---|
request(data) | gửi một chuỗi từ 1 đến 64 byte đến bot và trả về phản hồi của bot |
viewer | ID, tên, họ, username và dấu hiệu Premium của người xem |
chatType | loại cuộc trò chuyện: riêng tư, nhóm, siêu nhóm hoặc kênh |
chatData | dữ liệu gắn liền với tin nhắn trong cuộc trò chuyện này, tối đa 1.024 byte |
publicData | dữ liệu của chính tin nhắn, tối đa 1.024 byte |
watchPublicData() | đăng ký theo dõi các thay đổi của publicData |
isForward và isPreview | đây có phải là bản sao được chuyển tiếp và có phải là bản xem trước của kết quả inline chưa được gửi hay không |
copyText(text) | đặt tối đa 256 ký tự vào bộ nhớ tạm |
setResizeAnchor | cạnh mà từ đó widget mở rộng khi thay đổi chiều cao — trên cùng hoặc dưới cùng |
Ngoài ba sự kiện trước đây — thay đổi chủ đề, kích hoạt và hủy kích hoạt — đã có thêm chatDataChanged và publicDataChanged.
Đồng thời, tất cả các nội dung demo đã bị xóa khỏi gói HTMLBubbles: mười ba cuộc trò chuyện demo đã được đề cập trong bài viết ngày 13 tháng 10, thư mục ported với các thẻ đã được chuyển đổi, trò chơi nhiều người chơi voxel-clash và thư mục widget-sandbox với các ví dụ. Chỉ còn lại một thư viện three.js trong gói.
Khi nào widget có thể gửi tin nhắn cho bot
Các quy tắc được ghi lại trong cùng một sandbox, dưới dạng văn bản lỗi mà script nhận được, và trong các chuỗi ứng dụng:
- yêu cầu được gửi từ trình xử lý chạm vào widget, một lời gọi cho mỗi lần chạm;
- nếu không chạm — chỉ trong cuộc trò chuyện riêng với bot, chỉ khi tin nhắn được phép gửi yêu cầu nền (cờ
background_query), chỉ khi widget đang hiển thị trên màn hình và không quá một lần mỗi năm giây; - trong khi chờ phản hồi từ yêu cầu trước, yêu cầu mới sẽ không được gửi;
- bản xem trước của kết quả inline chưa được gửi vào cuộc trò chuyện sẽ không hỏi bot;
- các yêu cầu bị tắt nếu bot không cho phép chúng cho tin nhắn này — bản sao được chuyển tiếp có quyền riêng;
- phản hồi của bot — chỉ là văn bản và không dài quá 1.024 byte, nếu không script sẽ nhận lỗi
INVALID_ANSWER; nếu không trả lời kịp thời —TIMEOUT.
Đối với bản sao được chuyển tiếp, chatData trống, còn publicData vẫn giữ nguyên.
Trong các chuỗi ứng dụng, bên cạnh mã của bong bóng HTML, xuất hiện cụm từ «A tap may send data to the bot» — «một lần chạm có thể gửi dữ liệu đến bot». Bản dựng không cho thấy chính xác client hiển thị cụm từ này ở đâu.
Nên làm gì
- Các widget hiện chỉ có trong các bản beta, và không thể gửi chúng từ bot: trong Bot API không có phương thức nào để gửi widget.
- Khi chạm vào widget, hãy lưu ý rằng mỗi lần chạm có thể trở thành một yêu cầu đến bot. Script có thể thấy ID, tên, username và trạng thái Premium của bạn, và ID có thể dài tới 16 chữ số — nó vừa vặn trong yêu cầu 64 byte.
- Bản thân widget, nếu không chạm, chỉ gửi tin nhắn cho bot trong cuộc trò chuyện riêng với bot đó. Đối với các nhóm và kênh, sandbox không hỗ trợ các yêu cầu nền.
- Widget không có mạng:
fetch,XMLHttpRequest,WebSocketvà các worker trong sandbox đã được thay thế bằng các hàm giả trả về lỗi. Dữ liệu được gửi ra ngoài thông qua bot hoặc thông qua một liên kết mà widget mở (openLinkchỉ chấp nhận https và không dài quá 256 ký tự) — điều này cũng đúng trong bản dựng ngày 25 tháng 10.
Cách máy chủ gửi widget
Trong tệp nhị phân 283391, xuất hiện các tên kiểu lược đồ không có trong bản 283381. Trong lược đồ công khai của layer 232 — cả Telegram Desktop lẫn Telegram Web A — đều không có chúng, cũng không có widget trong tài liệu Bot API. Cấu trúc được đọc qua các tên, vì vậy tiếp theo là cách hiểu, không phải mô tả:
botInlineMessageWidget,inputBotInlineMessageWidgetvàinputBotInlineMessageWidgetId— bot, dường như, trả về widget dưới dạng kết quả inline, toàn bộ hoặc theo ID;inputMediaWidgetId— widget dưới dạng tệp đính kèm tin nhắn theo ID;updateBotWidgetQuery,updateInlineBotWidgetQueryvàupdateBotWidgetCopyQuery— các yêu cầu đến bot từ widget trong tin nhắn thông thường, trong tin nhắn được gửi qua chế độ inline và, theo tên, trong bản sao được chuyển tiếp; phản hồi —botWidgetQueryAnswer;updateMessageWidgetDatavàwidgetPublicData— máy chủ gửi dữ liệu mới của widget đã được gửi, và trong sandbox có sự kiệnpublicDataChangedcho điều này;- các lỗi máy chủ
WIDGET_QUERY_NOT_ALLOWEDvàWIDGET_RESPONSE_TIMEOUTtrông giống như một cặp với các lỗi scriptNOT_ALLOWEDvàTIMEOUT.
Các chuỗi client cũng gọi tên các cờ quyền: allow_queries cho tin nhắn, fwd_allow_queries cho các bản sao được chuyển tiếp của nó và background_query cho các yêu cầu không cần chạm. Bản dựng không cho thấy chính xác bot nhận được gì cùng với yêu cầu — ID của người chạm, như với các nút dưới tin nhắn, hay không.
Những gì các phòng thí nghiệm trong mã nguồn mở đang kiểm tra
Trong kho lưu trữ client mã nguồn mở, công cụ widget được kết nối dưới dạng submodule twidget; theo liên kết submodule, GitHub trả về 404 — kho lưu trữ đã bị đóng hoặc xóa. Bên cạnh đó là các phòng thí nghiệm để đo lường, và trong thư mục tools/perflab/TwidgetLab/widgets/attack — có 28 widget cố gắng hoạt động mà không cần chạm thực sự. Mười sáu trong số đó gửi dữ liệu đến bot: theo bộ hẹn giờ cứ sau 50 ms, bằng cách nhấp chuột tổng hợp, gọi trì hoãn sau khi nhấp, thông qua nhãn trường biểu mẫu (label), kéo thả. Mười hai widget thử mở liên kết hoặc rời khỏi trang mà không cần chạm — bằng liên kết trên nút, gửi biểu mẫu, tự động làm mới trang. Thư mục này xuất hiện trong kho lưu trữ với commit ngày 23 tháng 10, ba ngày trước bản dựng có request().
Trong các phòng thí nghiệm này, việc gửi vẫn được gọi là TelegramWidget.sendMessage. Trong bản dựng 283391, không có lời gọi như vậy — có request(), và script nhận lời gọi ngoài chạm dưới dạng lỗi với lý do no-activation.
Những gì khác có trong các ví dụ đã bị xóa
Trong thư mục widget-sandbox của bản dựng 283381 có hai bộ 20 widget — with-profile và without-profile. Tên tệp là các yêu cầu: «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…». Đối tượng TelegramWidget được đề cập trong 12 tệp của bộ đầu tiên và không có tệp nào của bộ thứ hai. Có vẻ như đây là các widget được tạo bởi một mô hình theo cùng các yêu cầu có và không có mô tả khả năng của sandbox — đây là kết luận dựa trên nội dung, bản dựng không nói rõ điều này. Từ profile cũng có trong đối tượng TelegramWidget: thuộc tính profile bằng 1, và isProfileAtLeast() kiểm tra cấp độ.
Phần còn lại trong thư mục là các kiểm tra tương thích (Chart.js, D3, three.js, WebGL, biểu mẫu, kéo thả, localStorage), các thẻ cho cửa hàng theo chủ đề «mua sắm», «công việc», «cuộc sống», «du lịch» và các bài kiểm tra căng thẳng.
Widget còn ở đâu nữa
Các widget trong tin nhắn dưới dạng định dạng của bản cập nhật 13.2 tiếp theo đã được mô tả vào ngày 25 tháng 10. Cách widget giao tiếp với bot, những gì nó thấy về người xem và giới hạn của các yêu cầu không được đề cập trong mô tả này.




