gpt4 book ai didi

python - Telegram.org API : calling method invokeWithLayer in Python

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:22 29 4
gpt4 key购买 nike

引用How to implement authorization using a Telegram API?这是我尚未找到的最好的 Telegram 文档!谢谢你。

我正在尝试创建一个 Python 库来调用 telegram.org。我可以按照上面链接中的描述进行身份验证,但遇到了以仅在上一层中找到的格式返回的方法响应的问题。换句话说,我的客户端正在从 api 的一层调用方法,但服务器正在使用较旧的 api 层的数据格式进行响应。我通过在较旧的 api 层文件中搜索返回 id 来确认这一点。

{
"id": "571849917",
"params": [
{
"name": "phone_registered",
"type": "Bool"
},
{
"name": "phone_code_hash",
"type": "string"
}
],
"predicate": "auth.sentCode",
"type": "auth.SentCode"
},

我的客户期望的格式是这样的:

{
"id": "-269659687",
"params": [
{
"name": "phone_registered",
"type": "Bool"
},
{
"name": "phone_code_hash",
"type": "string"
},
{
"name": "send_call_timeout",
"type": "int"
},
{
"name": "is_password",
"type": "Bool"
}
],
"predicate": "auth.sentCode",
"type": "auth.SentCode"
},

所以,我在 Telegram 文档中阅读了我需要调用 invokeWithLayer确保客户端和服务器的 api 层同步。

几个问题:

  1. 给定一个 telegram api 模式文件,有没有办法从模式确定它是哪一层?或者你只是“只是必须知道”?
  2. 调用 invokeWithLayer 时,如何格式化“query”参数?是否必须先序列化查询?

这是我的 initConnection 代码,我在将每个方法用作参数之前对其进行序列化。不幸的是, react 并不乐观。第一个回复是:

('initConnection - msg: ', {u'messages': [{u'body': {u'first_msg_id': 6312441942040617984L, u'unique_id': 986871592203578887L, u'server_salt': 7658270006181864880L}, u'seqno': 1, u'msg_id': 6312441944354392065L, u'bytes': 28}, {u'body': {u'msg_ids': [6312441942040617984L]}, u'seqno': 2, u'msg_id': 6312441944354450433L, u'bytes': 20}]})

第二个响应是:

{u'req_msg_id': 6312441942040617984L, u'result': {u'error_message': 'INPUT_METHOD_INVALID', u'error_code': 400}})

...以及代码:

 def initConnection(self, config):
'''Set the API layer and initialize the connection'''

# get the required config data
api_layer = config.getint('App data', 'api_layer')
api_id = config.getint('App data', 'api_id')
version = config.get('App data', 'version')
print
print('----------------------------------------------')
print('initConnection - api_layer: ', api_layer)
print('initConnection - api_id: ', api_id)
print('initConnection - version: ', version)

# serialize a candidate method as a parameter. It doesn't
# matter what it is so we will use something simple like get_future_salts.
simpleQuery=TL.tl_serialize_method('get_future_salts', num=3)

# serialize the initConnection method
initConnectionQuery = TL.api_serialize_method('initConnection', api_id=api_id,
device_model='Unknown UserAgent',
system_version='Unknown Platform',
app_version=version,
lang_code='en-US',
query=simpleQuery)

# perform the initialization
msg = self.method_call('invokeWithLayer', layer=api_layer, query=initConnectionQuery)
print('initConnection - msg: ', msg)

谢谢!

最佳答案

1)我从这里获取最新的 Telegram 模式: https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/Resources/scheme.tl

您可以构建自己的 TL 解析器库,它也可以按照您想要的方式工作,并随着版本的变化轻松将其更新到最新版本。

2) 要发送 X 查询参数,您只需序列化并附加到层查询调用的末尾即可。

示例:(来 self 的 Telegram Elixir 库)

 msg = TL.invokewithlayer(layer, TL.initconnection(app_id, device_model, system_version, app_version, lang_code, TL.help_getconfig))

您可以看到相关Telegram schema的定义:

initConnection#69796de9 {X:Type} api_id:int device_model:string system_version:string app_version:string lang_code:string query:!X = X;
invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X;

关于python - Telegram.org API : calling method invokeWithLayer in Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644901/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com