- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
引用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 层同步。
几个问题:
这是我的 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/
引用How to implement authorization using a Telegram API?这是我尚未找到的最好的 Telegram 文档!谢谢你。 我正在尝试创建一个 Python
我是一名优秀的程序员,十分优秀!