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

时间:2015-12-02 14:34:08

标签: c# api telegram

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

供参考:Telegram API

注意:我没有使用Bot API。我试图使用常规API。

1 个答案:

答案 0 :(得分:5)

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

2)电报不时更新其API版本,但其网站上的版本已过时。您可以轻松获取其官方开源项目的最新API规范。特别是来自Webogram的thisthis对于生成自己的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_ids指向电报数据中心IP地址列表['149.154.175.50', '149.154.167.51', '149.154.175.100', '149.154.167.91', '149.154.171.5']

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

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

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

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

干杯。