我一直在搞乱实现Telegram API的C#版本,但我被困住了。我已经成功找到了如何创建授权密钥,但我不知道从哪里开始。有没有人知道创建授权密钥后的下一步?文档很难遵循。
供参考:Telegram API
注意:我没有使用Bot API。我试图使用常规API。
答案 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的this和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_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)一旦掌握了这几个步骤,您就可以尝试发送消息或获取联系人列表和消息历史记录
干杯。