我一直在困扰于实现Telegram API的C#版本,但是我陷入了困境。我已经成功地弄清楚了如何创建授权密钥,但是我不知道从哪里可以找到。创建授权密钥后,有人知道下一步吗?该文档是如此难以遵循。
供参考: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和this对于生成自己的TL分析器非常有用。当前图层版本为45
3)因此,当您发送init +最近的请求时,这很可能是您的第一个MTproto加密消息,因此您需要创建一个新的随机64位数字作为会话密钥,但是您还需要一个有效的server_salt ...
4)您在创建Auth_Key时可能已跳过此步骤,但是您可以从此创建有效的初始server_salt:
server_salt = substr(new_nonce, 0, 8) XOR substr(server_nonce, 0, 8)
您可以在此处查找:STEP 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(有效载荷)
有效负载=盐+ session_id + msg_id + seq_no + len(msg)+ msg +填充
你可以从这里得到以上
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)您发送给电报的所有后续消息将使用相同的session_id和salt发送,并按照之前的MTProto加密步骤进行发送
9)请注意,盐通常只持续24小时就可以了。服务器将向您发送新的盐,您可以用它来替换过期的盐。session_id通常是长期存在的。
10)一旦掌握了这几个步骤,就可以尝试发送消息或获取联系人列表和消息历史记录
干杯。