创建 Telegram API 授权密钥后的步骤

3
我一直在尝试实现Telegram API的C#版本,但是卡住了。我成功地找出如何创建授权密钥,但我不知道下一步该怎么做。有人知道创建授权密钥后的下一步是什么吗?文档非常难以理解。
参考链接:Telegram API 注意:我不使用Bot API,而是尝试使用常规API。

1
我在这里记录了步骤 https://dev59.com/al0a5IYBdhLWcg3wJVzv#34929980 - Charles Okwuagwu
1个回答

7
创建您的Auth_key之后,我发现在进行操作之前确保连接到最近的DataCenter是最容易的。此外,您应该发送一个带有当前层(API版本)的InitConnection命令,以便您的代码可以正常工作。
以下是我发送的示例:
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的非常有用,可用于生成自己的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)

您可以在此查看:第9步)DH密钥交换完成

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)

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

您可以从此处获取以上内容

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

7) 连接到正确的“最近的dc”后,您现在可以执行用户授权,以授权(您的)手机号码使用您的新Telegram客户端访问telegram

8) 您发送到Telegram的所有后续消息都将使用相同的session_id和salt发送,并按照之前的MTProto加密步骤进行

9) 请注意,salt通常只有24小时的有效期。服务器将向您发送一个新的salt,您可以使用它来替换过期的salt。 session_id通常具有较长的生命周期。

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

干杯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接