初始身份验证:发送 `auth.sendCode` 并接收 `msg_container` 而不是 python 中的 `auth.SentCode`
Initial authentication: sending `auth.sendCode` and receiving `msg_container` instead of `auth.SentCode` in python
我已经下载了 Telegram 的 CLI 版本 (https://telegram.org/)。该 CLI 界面的不完整版本是从以下位置下载的:
https://github.com/griganton/telepy
现在身份验证一切正常,但实际功能为 0。
所以我稍微更改了 JASON-Scheme 并添加了初始身份验证所需的功能
{'id': '1988976461',
'method': 'sendCode',
'params': [{'name': 'phone_number', 'type': 'string'},
{'name': 'sms_type', 'type': 'int'},
{'name': 'api_id', 'type': 'int'},
{'name': 'api_hash', 'type': 'string'},
{'name': 'lang_code', 'type': 'string'}],
'type': 'SentCode'}
如文档中所写
https://core.telegram.org/method/auth.sendCode
现在,在我没有这样做之后,根据文档,似乎在发送一条请求 SMS 代码的消息后,我应该收到 auth.SentCode
,在数据包的开头带有十六进制代码 0xEFED51D9
,但我从服务器收到的响应是 msg_container73f1f8dc
类型的东西,它似乎与我的请求没有任何联系。
总而言之,这一切看起来非常烦人和奇怪,我不知道是什么原因导致我一直遵循文档并尝试按照要求实施。
我发送的数据包看起来很好,我实际上收到了我的 Phone 的 SmsCode。但是我得到的响应很糟糕\由于某种原因不清楚。
我正在这样调用 JSON 中实现的函数:
auth = Session.method_call('sendCode', phone_number=PHONE_NUMBER, sms_type=0, api_id=MY_API_ID, api_hash=MY_API_HASH, lang_code="en")
所以它正在运行..但我需要
phone_code_hash
。请注意,出于某种原因,Telegram 本身的文档也很奇怪。查看他们给出的查询示例,数字与文档所说的不匹配(从他们的文档中引用):
查询示例:
(auth.sendCode "79991234567" 1 32 "test-hash" "en")
=
(auth.sentCode
phone_registered:(boolFalse)
phone_code_hash:"2dc02d2cda9e615c84"
)
d16ff372 3939370b 33323139 37363534 00000001 00000020 73657409 61682d74 00006873 e77e812d
=
2215bcbd bc799737 63643212 32643230 39616463 35313665 00343863 e12b7901
取自此处:https://core.telegram.org/method/auth.sendCode
每个部分预期的第一个 DWORD 应该不同..
例如:768d5f4d
而不是 d16ff372
..
所以我错过了什么?
一些参考(出于某种原因,如果我不把它作为代码部分,它不会让我 post 这个)
https://core.telegram.org/constructor/auth.sentCode
https://core.telegram.org/mtproto/service_messages
https://core.telegram.org/method/auth.sendCode
嗯,问题是套接字处理不当。服务器刚刚发送了两个数据包。
第一个包是一些Message_Service
,第二个包是我真正想要的数据..
这很奇怪,因为它没有在文档中说明这些消息的任何内容
Telegram 大多数时候会将消息打包成 msg_container。
例如,您可能会收到之前消息的 Msg_acks 以及上一条消息的预期回复。
最好的办法是设置代码来处理接收容器的情况,检查容器中项目的数量,然后遍历接收的消息,将不同的消息类型传递给适当的处理程序。
另请注意,您可能会收到一个 rpc_response,其中包含一条 gzipped 消息,在这种情况下,您需要解压缩,然后处理您的消息内容,其中还可能包含消息集合
干杯
我已经下载了 Telegram 的 CLI 版本 (https://telegram.org/)。该 CLI 界面的不完整版本是从以下位置下载的: https://github.com/griganton/telepy
现在身份验证一切正常,但实际功能为 0。
所以我稍微更改了 JASON-Scheme 并添加了初始身份验证所需的功能
{'id': '1988976461',
'method': 'sendCode',
'params': [{'name': 'phone_number', 'type': 'string'},
{'name': 'sms_type', 'type': 'int'},
{'name': 'api_id', 'type': 'int'},
{'name': 'api_hash', 'type': 'string'},
{'name': 'lang_code', 'type': 'string'}],
'type': 'SentCode'}
如文档中所写 https://core.telegram.org/method/auth.sendCode
现在,在我没有这样做之后,根据文档,似乎在发送一条请求 SMS 代码的消息后,我应该收到 auth.SentCode
,在数据包的开头带有十六进制代码 0xEFED51D9
,但我从服务器收到的响应是 msg_container73f1f8dc
类型的东西,它似乎与我的请求没有任何联系。
总而言之,这一切看起来非常烦人和奇怪,我不知道是什么原因导致我一直遵循文档并尝试按照要求实施。
我发送的数据包看起来很好,我实际上收到了我的 Phone 的 SmsCode。但是我得到的响应很糟糕\由于某种原因不清楚。
我正在这样调用 JSON 中实现的函数:
auth = Session.method_call('sendCode', phone_number=PHONE_NUMBER, sms_type=0, api_id=MY_API_ID, api_hash=MY_API_HASH, lang_code="en")
所以它正在运行..但我需要
phone_code_hash
。请注意,出于某种原因,Telegram 本身的文档也很奇怪。查看他们给出的查询示例,数字与文档所说的不匹配(从他们的文档中引用):
查询示例:
(auth.sendCode "79991234567" 1 32 "test-hash" "en")
=
(auth.sentCode
phone_registered:(boolFalse)
phone_code_hash:"2dc02d2cda9e615c84"
)
d16ff372 3939370b 33323139 37363534 00000001 00000020 73657409 61682d74 00006873 e77e812d
=
2215bcbd bc799737 63643212 32643230 39616463 35313665 00343863 e12b7901
取自此处:https://core.telegram.org/method/auth.sendCode
每个部分预期的第一个 DWORD 应该不同..
例如:768d5f4d
而不是 d16ff372
..
所以我错过了什么?
一些参考(出于某种原因,如果我不把它作为代码部分,它不会让我 post 这个)
https://core.telegram.org/constructor/auth.sentCode
https://core.telegram.org/mtproto/service_messages
https://core.telegram.org/method/auth.sendCode
嗯,问题是套接字处理不当。服务器刚刚发送了两个数据包。
第一个包是一些Message_Service
,第二个包是我真正想要的数据..
这很奇怪,因为它没有在文档中说明这些消息的任何内容
Telegram 大多数时候会将消息打包成 msg_container。
例如,您可能会收到之前消息的 Msg_acks 以及上一条消息的预期回复。
最好的办法是设置代码来处理接收容器的情况,检查容器中项目的数量,然后遍历接收的消息,将不同的消息类型传递给适当的处理程序。
另请注意,您可能会收到一个 rpc_response,其中包含一条 gzipped 消息,在这种情况下,您需要解压缩,然后处理您的消息内容,其中还可能包含消息集合
干杯