为电报创建授权密钥后的步骤 API
Steps after creating Authorization Key for Telegram API
我一直在努力实现 Telegram 的 C# 版本 API,但我被卡住了。我已经成功找到了创建授权密钥的方法,但我不知道该从哪里开始。有谁知道创建授权密钥后的下一步?文档很难理解。
供参考: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 and 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_id 指向 Telegram 数据中心 IP 地址列表 ['149.154.175.50', '149.154.167.51', '149.154.175.100', '149.154.167.91', '149.154.171.5']
7) 连接到正确的 "nearest dc" 后,您现在可以执行 User Authorization,授权(您的)手机号码使用新的 Telegram 客户端访问电报
8) 您发送到 Telegram 的所有后续消息都将使用相同的 session_id 和盐发送,并像之前一样遵循 MTProto 加密步骤
9) 请注意,盐通常只能保存 24 小时。服务器将向您发送新的盐,您可以用它来替换过期的盐。 session_id通常是长寿的。
10) 一旦掌握了这几个步骤,您就可以尝试发送消息或获取联系人列表和消息历史记录
干杯。
我一直在努力实现 Telegram 的 C# 版本 API,但我被卡住了。我已经成功找到了创建授权密钥的方法,但我不知道该从哪里开始。有谁知道创建授权密钥后的下一步?文档很难理解。
供参考: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 and 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_id 指向 Telegram 数据中心 IP 地址列表 ['149.154.175.50', '149.154.167.51', '149.154.175.100', '149.154.167.91', '149.154.171.5']
7) 连接到正确的 "nearest dc" 后,您现在可以执行 User Authorization,授权(您的)手机号码使用新的 Telegram 客户端访问电报
8) 您发送到 Telegram 的所有后续消息都将使用相同的 session_id 和盐发送,并像之前一样遵循 MTProto 加密步骤
9) 请注意,盐通常只能保存 24 小时。服务器将向您发送新的盐,您可以用它来替换过期的盐。 session_id通常是长寿的。
10) 一旦掌握了这几个步骤,您就可以尝试发送消息或获取联系人列表和消息历史记录
干杯。