入门
Pabal 简介
Pabal 是什么、如何构成,以及目前哪些功能可用、哪些尚不可用。
什么是 Pabal
摆拨(파발,擺撥)是朝鲜时代换马接力、传递紧急消息的驿传制度。Pabal.me 是以此命名的即时通讯工具,是由组织或社区在自己的服务器上运营的 Telegram 兼容通讯工具。
- 自行运营服务器。账号、对话和照片全部保存在运营方的服务器和数据库(PostgreSQL)中。服务器程序的名称是 HunsTelegram(Java 21)。
- 直接使用 Telegram 的“语言”。应用与服务器之间使用与 Telegram 相同的 MTProto 2.0(Layer 216),机器人与服务器之间使用与 Telegram 相同的 HTTP Bot API。因此,为 Telegram 开发的应用、库和机器人只需更换地址就能连接 Pabal。
- 这是一个与 Telegram 互不相通的独立世界。Pabal 账号只存在于 Pabal 服务器上,无法与 Telegram 用户互发消息。
整体构成
图示说明
- 三个区域:左侧是在服务器外运行的部分(应用、机器人程序、浏览器),中间是服务器的两个入口,右侧是服务器内部。机器人程序同样在服务器之外——在运营方或开发者的电脑上——运行。
- 入口只有两个:应用直接连接 MTProto 端口(8443)(MTProto 自带加密,因此不需要 HTTPS),网站和 Bot API 则通过 HTTPS(443) 进入。
- 机器人可以通过两条路之一连接:通常走 HTTPS 的 Bot API(实线),也可以选择与应用相同的 MTProto(蓝色虚线)。无论哪条路,都是同一个机器人账号、同一个消息箱。
- 红色虚线是唯一方向相反的箭头:机器人设置 Webhook 后,服务器会把新的更新发送到机器人程序的 HTTPS 地址。其余全部是从外部进入服务器的请求。
- 记录只在一处:所有变更都经由服务层写入 PostgreSQL 的事件存储,只有照片原图以文件形式保存。从应用发送的消息和机器人发送的消息走的是同一条路径,因此推送、对话列表、重新连接后的恢复对所有人都同样适用。
目前可用与尚不可用的功能
| 功能 | 状态 | 备注 |
|---|---|---|
| 注册、登录(手机号码 + 验证码) | 可用 | 验证码通过短信、电子邮件或管理员转交之一发送,由运营方选择 |
| 一对一聊天、实时接收、多台设备 | 可用 | 之前关着的设备重新开机后,会补上错过的内容 |
| 修改、删除消息 | 可用 | 对方屏幕上也会立即更新 |
| 普通群组(创建、添加成员、移除成员、名称) | 可用 | 成员需要在群组信息中直接添加 |
| 发送照片、头像 | 可用 | 只保存一种尺寸的原图 |
| 机器人 — @BotFather、HTTP Bot API、Webhook、MTProto 机器人 | 可用 | 按钮、回调、命令菜单、照片、群组 |
| 管理页面、运营设置 | 可用 | 只在服务器的 127.0.0.1 上开放 |
| 10 种语言的网站、用户名和邀请链接页面 | 可用 | 开发者文档也提供 10 种语言 |
| 频道、超级群组 | 尚未 | 在应用中可能无法正常显示 |
| 文件、视频、语音文件、相册 | 尚未 | 发送时会以 MEDIA_INVALID 拒绝 |
带格式的文字(粗体、斜体)、机器人的 parse_mode | 尚未 | 按原样发送文字。命令、提及、链接、话题标签会自动显示 |
| 语音和视频通话、私密聊天 | 尚未 | |
| 两步验证(云密码) | 尚未 | 即使尝试设置也会被拒绝 |
| 手机应用、推送通知 | 尚未 | 目前只有 macOS 桌面应用 |
| 通过邀请链接加入群组 | 尚未 | 可以生成链接,但点击后不会成为成员 |
内联模式(@机器人 搜索词)、支付、游戏 | 尚未 |
与 Telegram 的关系
Pabal 是遵循 Telegram 公开协议的独立服务器。它与 Telegram 公司没有任何关系,也不会连接 Telegram 的服务器。
- 兼容的部分:MTProto 2.0(4 种传输方式、握手、临时密钥绑定),Layer 216 的请求和响应格式,HTTP Bot API 的地址格式以及请求、响应和错误格式。已验证官方 Telegram Desktop 6.2.6 无需修改(只更换服务器地址和公钥)即可连接。
- 不同的部分:账号和数据在每台服务器上各自独立。用户 ID、消息 ID、文件 ID 只在这台服务器内有意义。在 Telegram 上使用的机器人令牌无法使用,需要从 Pabal 的 @BotFather 重新获取。
链接格式
应用和服务器使用 https://pabal.me/ 生成链接。在浏览器中打开时,会出现一个用来打开应用的小页面。
| 链接 | 含义 | 在应用中打开的地址 |
|---|---|---|
pabal.me/<用户名> | 打开与某人或机器人的对话 | tg://resolve?domain=<用户名> |
pabal.me/+<邀请码> | 群组邀请链接(会打开应用,但暂时不能通过链接加入) | tg://join?invite=<邀请码> |
pabal.me/joinchat/<邀请码> | 旧格式的邀请链接(含义相同) | tg://join?invite=<邀请码> |
用户名由 5~32 个英文字母、数字和下划线组成,并以英文字母开头(机器人的用户名以 bot 结尾)。与 docs、admin、health 等网站自身使用的路径同名的用户名,无法通过链接打开。
安全模型
- 应用 ↔ 服务器:使用 MTProto 2.0 加密。应用在构建时内置了服务器的 RSA 公钥,因此其他服务器无法冒充 Pabal 服务器。对话与 Telegram 的“云聊天”相同,服务器能够读取内容(并非端到端加密)。这正是服务器必须由值得信任的人来运营的原因。
- 机器人 ↔ 服务器:Bot API 只通过 HTTPS 公开。机器人令牌就是机器人的密码——如果泄露了,请在 @BotFather 中用
/revoke更换。旧令牌以及用旧令牌建立的连接会立即失效并断开。 - 服务器 → Webhook:服务器只向使用 HTTPS 且位于公网地址的 Webhook 发送请求。私有网络、回环地址、云元数据等内部地址会被拒绝。机器人可以通过
secret_token确认请求确实来自 Pabal 服务器。 - 管理:管理页面只在服务器本机(127.0.0.1)上开放,必须持有令牌才能查看数据。运营方通过 SSH 隧道访问。
- 存储:授权密钥需要被服务器用于解密,因此以原样存放在数据库中。数据库和备份需要像服务器的 RSA 私钥一样严加保护。
术语
| 术语 | 含义 |
|---|---|
| MTProto | 由 Telegram 设计、用于应用与服务器之间的加密协议。Pabal 使用 2.0 版。 |
| Layer(层) | 在 MTProto 之上往来的请求和响应格式的版本。Pabal 使用的是 216。 |
| 授权密钥(auth key) | 应用首次连接时与服务器共同生成的 2048 位密钥。登录状态绑定在这个密钥上。 |
| DC | Telegram 的数据中心编号。在 Pabal 中,一台服务器同时承担 DC 1~5。 |
| 更新、pts | 新消息、修改、删除之类的变化。pts 是每个用户的变化序号,让断开过的设备知道自己错过了什么。 |
| 对端(peer) | 对话的对象——人、机器人或群组。 |
| 机器人令牌 | <机器人 ID>:<密钥> 形式的字符串。放进 Bot API 地址中,用来证明机器人的身份。 |
| Webhook | 不是由机器人主动来取新的更新,而是由服务器把更新发送到机器人 HTTPS 地址的方式。 |