为电报创建授权密钥后的步骤 API

Steps after creating Authorization Key for Telegram API

我一直在努力实现 Telegram 的 C# 版本 API,但我被卡住了。我已经成功找到了创建授权密钥的方法,但我不知道该从哪里开始。有谁知道创建授权密钥后的下一步?文档很难理解。

供参考:Telegram API

注意:我没有使用 Bot API。我正在尝试使用常规 API.

创建 Auth_key 后,我发现最简单的方法是在继续之前确保连接到离我最近的数据中心。此外,您还应该发送 InitConnection 命令以及您的代码将使用的当前层(API 版本)。

这是我发送的示例:

msg = TL.invokewithlayer(@layer, TL.initconnection(@app_id, @device_model, @system_version, @app_version, @lang_code, TL.help_getnearestdc))

现在,在您发送此信息之前,这里有更多背景信息:

1) Telegram 服务器在 TL 中进行通信,它基本上是一种定制开发的编码方案,Telegram 使用它来表达一切:从命令到它的所有类型。您需要自己构建一个解码器和编码器,用于将原始字节转换为 TL,反之亦然。

2) Telegram 会不时更新其 API 版本,但其网站上的版本已过时。您可以轻松获得其官方开源项目的最新 API 规范。特别是来自 Webogram 的 this and this 对于生成您自己的 TL 解析器非常有用。当前图层版本为45

3) 因此,当您发送 init + nearestDc 请求时,这很可能是您的第一条 MTproto 加密消息,因此您需要创建一个新的随机 64 位数字作为会话密钥,但您还需要一个有效 server_salt...

4) 你可能在创建你的 Auth_Key 时跳过了这个,但是你可以从这个创建一个有效的初始 server_salt:

server_salt = substr(new_nonce, 0, 8) XOR substr(server_nonce, 0, 8)

you can look that up here: STEP 9) DH key exchange complete

5) 您现在有了 server_salt,一个新的随机 64 位 session_id,您想要发送以下内容:

msg = TL.invokewithlayer(@layer, TL.initconnection(@app_id, @device_model, @system_version, @app_version, @lang_code, TL.help_getnearestdc))

MTProto格式为:auth_id + msg_key + enc_payload

enc_payload = AES_IGE_enc(有效载荷)

payload = salt + session_id + msg_id + seq_no + len(msg) + msg + padding

您可以从 here

获取以上内容

6) 现在你期望一个结果告诉你最近的 dc_id,如果这与 dc_id = 2 不同(通常 dc_id = 2 是你开始的默认值) 那么您需要断开连接并启动与新 dc_id 的新连接,并重新生成与此新 dc 连接的 auth_key。您的 dc_id 指向 Telegram 数据中心 IP 地址列表 ['149.154.175.50', '149.154.167.51', '149.154.175.100', '149.154.167.91', '149.154.171.5']

7) 连接到正确的 "nearest dc" 后,您现在可以执行 User Authorization,授权(您的)手机号码使用新的 Telegram 客户端访问电报

8) 您发送到 Telegram 的所有后续消息都将使用相同的 session_id 和盐发送,并像之前一样遵循 MTProto 加密步骤

9) 请注意,盐通常只能保存 24 小时。服务器将向您发送新的盐,您可以用它来替换过期的盐。 session_id通常是长寿的。

10) 一旦掌握了这几个步骤,您就可以尝试发送消息或获取联系人列表和消息历史记录

干杯。