浅谈 MTProto, TDLib 和 Bot API 的区别

浅谈 MTProto, TDLib 和 Bot API 的区别

Anotia 110 2022-03-23

导言

如果你刚开始接触 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 有着庞大的第三方库规模,足够开发所需。

结语

希望以上的一点碎碎念能对你的开发有所帮助。本人水平有限,如有纰漏请不吝指出。

参考资料

转载本文请注明出处,谢谢合作。


# Telegram