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

我一直在搞乱实现Telegram API的C#版本,但我被困住了。 我已成功找到如何创建授权密钥,但我不知道从何处开始。 有没有人知道创建授权密钥后的下一步? 文档很难遵循。

供参考: Telegram API

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

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

这是我发送的一个例子:

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

在你发送之前,这里有更多背景知识:

1)Telegram Server在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 = 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指向电报数据中心IP地址列表['149.154.175.50', '149.154.167.51', '149.154.175.100', '149.154.167.91', '149.154.171.5']

7)一旦连接到正确的“最近的直流”,您现在可以执行用户授权 ,授权(您的)手机号码使用您的新电报客户端访问电报

8)您发送给Telegram的所有后续消息将使用相同的session_id和salt发送,并遵循之前的MTProto加密步骤

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

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

干杯。