c# - 为 Telegram API 创建授权 key 后的步骤

标签 c# api telegram

我一直在努力实现 Telegram API 的 C# 版本,但我被卡住了。我已经成功找到了创建授权 key 的方法,但我不知道该从哪里开始。有谁知道创建授权 key 后的下一步?文档很难理解。

供引用: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 规范。特别是thisthis来自 Webogram 的文件对于生成您自己的 TL 解析器非常有用。当前层版本为45

3) 因此,当您发送 init + nearestDc 请求时,这很可能是您的第一条 MTproto 加密消息,因此您需要创建一个新的随机 64 位数字作为 session key ,但您还需要一个有效的 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 指向 Telegram 数据中心 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 , 授权(您的)手机号码使用您的新 Telegram 客户端访问 Telegram

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

9) 请注意,盐通常只能保存 24 小时。服务器将向您发送新的盐,您可以用它来替换过期的盐。 session_id 通常是长期存在的。

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

干杯。

关于c# - 为 Telegram API 创建授权 key 后的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34045353/

相关文章:

python - 在 python telethon 中加入 channel 的最简单方法

python - 马拉松。如何创建公共(public)/私有(private) channel ?

C# 从构造函数中调用事件

C# SMTP 套接字问题

c# - 如何从 SQL Server 加载图像到图片框?

php - Symfony 和 API 平台 - 通过 slug 或 userToken 或任何其他不同于 ID 的字段检索数据

api - 用于 future 30 天数据预测的天气 API

c# - 保留顺序的 HashSet

javascript - 按键/值合并对象数组

python - 如何使用电视马拉松获取特定私有(private) channel 的更新?