导言
如果你刚开始接触 Telegram 机器人的开发,对以下三个名词一定不会陌生:Bot API, MTProto 和 TDLib。我也曾经纠结于它们的区别和优劣,最近查找了一些资料,遂尝试撰写此文,希望能给予准备上手或者正在寻找好用的库的你一些帮助。
概念
MTProto API
MTProto API,一般简称 MTProto,是用于 Telegram 客户端和服务端之间加密通信的协议。它规定了一些基本方法,如将 API 查询和响应数据转换为二进制的方法、加密消息的方法和通过现有网络协议传输消息的方法等。它使用 TL(Type Language,类型语言)描述类型、构造函数等,大概长这样:
decryptedMessage#1f814f1f random_id:long random_bytes:bytes message:string media:DecryptedMessageMedia = DecryptedMessage;
decryptedMessageService#aa48327d random_id:long random_bytes:bytes action:DecryptedMessageAction = DecryptedMessage;
decryptedMessageMediaEmpty#89f5c4a = DecryptedMessageMedia;
decryptedMessageMediaPhoto#32798a8c thumb:bytes thumb_w:int thumb_h:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
decryptedMessageMediaVideo#4cee6ef3 thumb:bytes thumb_w:int thumb_h:int duration:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
decryptedMessageMediaGeoPoint#35480a59 lat:double long:double = DecryptedMessageMedia;
decryptedMessageMediaContact#588a0a97 phone_number:string first_name:string last_name:string user_id:int = DecryptedMessageMedia;
decryptedMessageActionSetMessageTTL#a1733aec ttl_seconds:int = DecryptedMessageAction;
decryptedMessageMediaDocument#b095434b thumb:bytes thumb_w:int thumb_h:int file_name:string mime_type:string size:int key:bytes iv:bytes = DecryptedMessageMedia;
decryptedMessageMediaAudio#6080758f duration:int size:int key:bytes iv:bytes = DecryptedMessageMedia;
decryptedMessageActionReadMessages#c4f40be random_ids:Vector<long> = DecryptedMessageAction;
decryptedMessageActionDeleteMessages#65614304 random_ids:Vector<long> = DecryptedMessageAction;
decryptedMessageActionScreenshotMessages#8ac1f475 random_ids:Vector<long> = DecryptedMessageAction;
decryptedMessageActionFlushHistory#6719e45c = DecryptedMessageAction;
MTProto 提供了基本的框架,开发者可自行封装,以优化不同语言平台上的表现。不过它本身较为复杂晦涩,对客户端开发者不那么友好。以下列出部分较为著名的 MTProto 库,排名不分先后:
- Python
- Telethon
- Pyrogram
- JavaScript (Node.js)
- GramJS
- @mtproto/core
- PHP
- MadelineProto
TDLib
TDLib,全称 Telegram Database Library,可以简单理解为官方提供的 MTProto 封装,在诞生之初就以异步、跨平台、跨语言、高性能为目标。使用 C++ 编写,因此性能出色,且可以和大部分主流编程语言绑定。
TDLib 支持使用正常账户和机器人账号登录。较为出名的 TDLib 客户端有 Android 的官方客户端 Telegram X(和 Telegram Android 不同),以及 Windows 平台的 UWP 应用 Unigram。TDLib 同时还被用作 Bot API 的后端(根据官方描述,每个 TDLib 实例托管超过 24000 个机器人)。
如前所述,使用 C++ 开发使得 TDLib 可以绑定其它语言。GitHub 库中列出支持的语言有 Python、JavaScript、Go、Java、Kotlin、C#、Swift、Objective-C、Object Pascal、Dart、Rust、PHP、Lua、Ruby 等一共 26+ 语言。
Bot API
MTProto 和 TDLib 较为复杂,有一定的上手门槛,因此 Telegram 还提供了基于 HTTP(S),简化过的 Bot API,专门用于机器人的开发。Bot API 支持机器人的大部分操作,方法比较容易理解。此外,Bot API 支持自托管,以突破官方 API 的一些限制。
以下列出部分较为出名的库,排名不分先后:
- JavaScript (Node.js)
- Telegraf.js
- node-telegram-bot-api
差异
TDLib VS MTProto
TDLib 和其它基于 MTProto 实现的库,通信效率都很高,并且原生支持 Telegram 的所有特性。在效率方面,通常来说二者相差不会很大,只需选择文档详尽、熟悉的库即可。不过二者还是有一点区别:
- 第三方基于 MTProto 实现的库不会受官方的版本控制限制。只要开发者发现了新的可用的 TL 模式,就可以在库中实现,而不必等待官方公布更新。举一个例子,Telethon 时常会在 TDesktop 的 dev 分支出现新 TL 之后就更新。
- TDLib 作为官方库,更新频率显然更低,并且你还需要等待对应库的开发者更新绑定。
TDLib / MTProto VS Bot API
TDLib / MTProto 和 Bot API 的差异就较大了。
- 首先,由于通讯方式的不同,TDLib 和 MTProto 的效率比 Bot API 高很多。同服务器托管的情况下,我使用 Telegraf API (Bot API) 写的机器人,纯文本的响应速度比 GramJS API (MTProto) 写的机器人要慢接近 50%(仅个人观察结果)。
- 另外,Bot API 的限制相对较多。随便举两个例子:
- 只能下载最大 5 MB 的图片 / 20 MB 的文件,和上传最大 50 MB 的文件;
- 不能删除发送超过 48 小时的消息(实际上,所有的机器人都有这个限制,不论 API)。
- 不过 Bot API 也有它的好处——易于理解和上手,开发难度低。GitHub 有着庞大的第三方库规模,足够开发所需。
结语
希望以上的一点碎碎念能对你的开发有所帮助。本人水平有限,如有纰漏请不吝指出。
参考资料
- Bots: An introduction for developers
- TDLib - Build Your Own Telegram
- MTProto Mobile Protocol
- [GitHub Issue] Why Airgram not using MTProto?
转载本文请注明出处,谢谢合作。