使用技巧

Telegram 小程序(TMA)架构:WebApp SDK 与视口

本文从使用者与开发者两个角度讲解 Telegram 小程序:它只是聊天上方的一个网页面板,能获取你的账号身份却读不到聊天记录;支付必须走 Telegram 自己的付款界面,任何索要助记词或验证码的页面都是骗局。

内容导读

本文从使用者与开发者两个角度讲解 Telegram 小程序:它只是聊天上方的一个网页面板,能获取你的账号身份却读不到聊天记录;支付必须走 Telegram 自己的付款界面,任何索要助记词或验证码的页面都是骗局。

Telegram 小程序(TMA)架构:WebApp SDK 与视口主题插画

小程序是一个网页,会在你聊天窗口上方的面板中打开。无需下载、无需账号、无需密码——你点一下,就已经进入一个可用的应用,而且已经被识别了。

这正是它全部的吸引力,仔细读来,也正是它全部的风险。通常让人停下来想一想的那道阻力——安装、注册、设置密码——已经被去掉了,而另一头仍然是别人的网站,由你从未见过的人运营。

完成这一步后你将能够

  • 准确说出小程序在你的账号上能触及什么、不能触及什么。
  • 读懂它周围的那圈边框,并在边框消失时察觉。
  • 应用一条能覆盖所有小程序骗局的规则。
  • 判断你想做的东西是否适合这种形态。
互动

围绕同一个面板的四种立场

答案会因你是打开它、担心它、开发它,还是在它里面付款而截然不同。

打开一个

它能看见什么

构建一个

在其中支付

它是一个网页,而那圈边框是最诚实的部分

小程序打开时是一个面板,上方是 Telegram 自己的标题栏:你所在应用的名称,以及关闭它的方式。那个标题栏是屏幕上唯一由 Telegram 编写的部分。它下方的一切都由运营该应用的人编写,包括任何看起来像官方通知、警告或系统对话框的内容。

最小化不等于关闭。应用会继续运行,你输入的内容仍然留在里面——这对游戏来说很方便,但对商店或钱包来说是不该留下的状态。重要的应用要主动关闭。

有两个习惯从前面的步骤延续下来。你进来的那扇门就是信号:从机器人自己的菜单进入的应用,是你主动去找的;而从转发消息里的链接进入的应用,是别人摆到你面前的。而一个能占满整个屏幕的应用,已经移除了告诉你身在何处的标题栏——要在把屏幕交给它之前决定是否信任它,而不是之后。

把小程序当作浏览器标签页来对待,而不是当作已安装的应用。里面没有一样东西是你的,唯一可信的像素就是顶部那些。

它能拿到什么,拿不到什么

它能拿到 Telegram 识别出的你的身份——你的账号、显示名称、用户名和头像(如果你设置了的话)——以及你在它里面所做的一切。这是基线,页面一打开就自动送达。

它拿不到你的聊天、你的联系人、你的消息或你的手机号。没有任何机制能让那个面板里的页面读取你的对话,任何看起来知道对话内容的应用,要么是在猜,要么是你自己告诉它的。

任何更进一步的东西都是需要你另行回答的单独请求:在聊天中给你发消息、你的位置、你的手机号、访问运动传感器、在你的主屏幕上添加图标。每一项都是一个带名字的提示,每一项都是一个决定。最值得慢慢考虑的是位置,因为一次读取就是一个地址。

给正在做决定的人一句诚实的总结:暴露面是有限的,而这个限度就是“一个陌生人知道这个账号用过他们的应用”。对大多数应用来说这没什么大不了。但对于一个与你不愿被关联的事物有关的应用,这就是需要权衡的地方。

你的对话是够不着的。你的身份不是——而且它在你打开的那一刻就被交出去了,早于你做出任何决定。

一个有两处不同的网站

如果你在开发一个,你已知的几乎所有东西都适用:它是 HTML,运行在浏览器引擎中,由你自己的主机提供服务。有两件事确实不同,两件都值得围绕它们做设计。

用户已经被识别,而且身份是带签名送达的。Telegram 会把一个描述谁打开了它的数据包交给页面,附带一个你的服务器可以用机器人的密钥验证的签名。由此得出的规则正是人们常搞错的那条:永远不要相信页面告诉你的身份——在你的服务器上验证它。页面可以声称自己是任何人;正确校验过的签名不能。

这个界面是手机上可以被划走的一个面板。它打开时是部分展开的,可以放大,键盘会把它缩小,向下滑动的手势可能把它整个关闭。任何带表单、进行中的游戏或未发送订单的东西都需要扛住这一点——要么在关闭前询问,要么边操作边保存。关于小程序最常见的抱怨,就是用户不知道那是个手势,结果工作丢失了。

有一点可以利用:面板会继承读者的浅色或深色主题。尊重它就是让应用感觉像客户端一部分、还是明显像装在盒子里的网站之间的区别,而读者会把这种区别记作可信度,无论他们能否说出个所以然。

在服务器上验证,并为一种可能说到一半就消失的界面做设计。这两个决定区分了小程序和装在边框里的网站。

钱被允许在哪里流动

这是带规则而非建议的那一栏。付款发生在 Telegram 自己的付款界面中,它出现在应用上方;它不会发生在页面内部绘制的表单里。如果应用要求你在它自己的布局里输入卡号信息,停下——不是因为它一定是欺诈,而是因为你无从判断,而正当途径的存在恰恰是为了让你不必去判断。

同样的逻辑,对任何与钱包相关的东西更严格:一个索要助记词、私钥或 Telegram 登录验证码的小程序,每一次都是攻击,没有例外,也没有无害的版本。第 089 步讲了为什么助记词尤其会让对话到此为止。

而第 077 步的规则在这里依然成立。正当的交易是你发起的——通过打开某个东西并选择购买。一个还没给你看任何东西就弹出付款提示、连接请求或领取界面的应用,是在告诉你它是干什么用的。

要么用 Telegram 的付款界面,要么什么都不用。页面内任何索要机密的输入框就是整个骗局,无论页面做得多好。

为什么会有这种形态

小程序有意思的地方不在技术,技术很普通。而在于去掉安装步骤之后,会对“谁会来试一试”产生什么影响。

一件需要下载应用、创建账号、设置密码的事,会流失掉绝大多数只是有点兴趣的人。一件在对话里别人刚提到、两下点击就能打开的事,几乎不会流失任何人。这就是为什么这种形态在游戏、小工具、商店和票务上取得了成功,也是为什么它在那些通不过应用商店审核的东西上同样成功。

对任何开发者的设计启示:你被交给了一群没有耐心、也没有承诺的受众。第一个屏幕必须无需解释就能用,因为没有人会坐下来走完引导流程,也没有已安装的图标可以回来。从网站移植过来的小程序几乎总是仅凭这一点就失败。

而对任何使用者的启示:没有阻力并不等于安全。没有人审核过它,没有任何东西审查过它,而让你进来的那两下点击,对好的和坏的都是同样的两下。

现在就试试——五分钟

四个步骤,两个用于使用,两个用于开发。

  1. 打开一个小程序,只看标题栏 读一读顶部的名称。那一行,以及它旁边的关闭控件,是屏幕上唯一由 Telegram 负责的部分。
  2. 把它最小化再回来 注意你输入的一切都还在,会话从未结束。现在决定你用的哪些应用应该被正确关闭。
  3. 如果你在开发:在键盘打开的状态下测试 键盘出现时面板会缩小,在桌面浏览器上设计的布局恰恰在这里出问题。
  4. 如果你在开发:试着在填表途中把它划走 发生什么,你的用户就会遇到什么。如果工作丢失了,那就是要修的第一个 bug。

什么时候小程序是错误答案

三种情况,而它们全都会被做出来。

当答案是一句话的时候。一个用你所要的东西回复你的机器人更快、在所有设备上都能用、事后可搜索,并在聊天中留下记录。把它包进一个带加载转圈的面板里,在每个维度上都更糟。如果交互是问进去、答出来,那这个交互就是一段对话。

当人们在 Telegram 之外也需要它的时候。小程序只存在于一个应用里。如果同一个工具还需要从桌面浏览器、邮件链接或不用 Telegram 的同事那里使用,那你就是在把东西做两遍,而小程序是会落后的那一份。

当它是一个严肃、反复、长时间使用的工具的时候。面板很小、可被关闭、容易丢失。任何有人每天要在里面工作半小时的东西,都想要一个真正的窗口。这种形态的最佳适用场景是短小、自成一体、偶发性的——买张票、查个余额、玩一局、填个表——离这个越远,你就越是在和这个界面较劲。

这个阶段的常见问题

小程序能读我的消息吗?

不能。它运行在一个面板里,无法访问你的对话、联系人或消息历史,也没有任何权限能授予它这些。它知道的是打开它的那个账号,以及你在它里面做的一切。如果某个应用看起来知道你的聊天内容,那是被告诉的——被你,或被你在别处授予了权限的机器人——而那是另一个值得追查的问题。

关闭面板会让我退出登录吗?

不会以你希望的方式。应用自己的会话表现得像网站一样:重新打开通常会把你带回原来的位置,因为页面一加载就再次认出了这个账号。没有通用的“退出这个小程序”控件,这是一个真实的缺口。对于任何持有金钱或订单的应用,就把它当作始终处于登录状态,并据此行事。

Telegram 自己列表里的应用比来自链接的更安全吗?

稍微安全一点,但不足以让你关掉判断力。列表是目录而非保证,那里的热度衡量的是推广而非质量——花钱让人使用的应用排名会很高。更有用的信号来自第 087 步邻近的领域:是你主动去找的,还是别人摆到你面前的。列表里的任何东西都改变不了关于机密的规则。

“添加到主屏幕”到底做了什么?

它在你的设备上放一个直接打开该应用的快捷方式。没有安装任何东西,也没有授予任何新权限,但你现在的主屏幕上多了一扇通往已登录服务的门,而移除图标并不会断开任何连接。把它给你每天主动打开的应用,而不要给那个因为添加而给你好处的东西——那个好处是分发手段,而不是便利。

我可以不用机器人就开发一个吗?

不能。小程序依附于一个机器人:机器人是它被启动的来源,而机器人的密钥是身份校验得以实现的原因。这意味着第 086 步里的一切同样适用于你——令牌就是凭据,它绝不能进入页面的代码,而创建机器人的账号掌控着它的未来。把令牌放进小程序的前端,是这个领域里最常见的一个严重错误。

小程序在桌面端和浏览器里能用吗?

通常能用,而且它们的行为差异大到在其中一个上测试不算测试。在桌面客户端上,面板是一个有鼠标、空间充裕的窗口;在手机上,它是一张与键盘共享屏幕、可能被意外关闭的底部面板。在笔记本上做好、没经过手机测试就发布出去的布局,正是那么多小程序都有一个在首屏之下、谁也够不到的按钮的原因。

← 返回 TG知识库