cTrader 从报告 API 事件(隧道)中解码 protobuf 消息
cTrader decode protobuf message from Report API Events (tunnel)
我正在处理 cTrader 交易平台。
我的项目是在 python 3 on tornado 上写的。
并且在从报告 API 事件中解码 prtobuf 消息时遇到问题。
下面将列出我所取得的一切以及哪里有问题。
- 第一个 cTrader 有休息 API 的报告
- 所以我得到了 .proto 文件并为 python 3
生成了它
- 原始文件被调用:cTraderReportingMessages5_9_pb2
- 来自 rest Report API 获取 protobuf 消息并能够按以下方式解码,因为我知道要传递哪个描述符进行解码
from models import cTraderReportingMessages5_9_pb2
from protobuf_to_dict import protobuf_to_dict
raw_response = yield async_client.fetch(base_url, method=method, body=form_data, headers=headers)
decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(descriptors[endpoint]['decode'], raw_response.body)
描述符[端点]['decode'] = 我的描述符确切地知道要传递哪个描述符来解码我的消息
我的内容来自 cTraderReportingMessages5_9_pb2
# here is .proto file generated for python 3 is too big cant paste content here
https://ufile.io/2p2d6
所以直到这里使用 rest api 并确切知道要传递哪个描述符,我能够解码 protobuf 消息并继续前进。
2。现在我面临的问题
正在与 python 3 连接到 127.0.0.:5672 上的隧道
我正在侦听事件并收到此类数据
b'\x08\x00\x12\x88\x01\x08\xda\xc9\x06\x10\xb6\xc9\x03\x18\xa1\x8b\xb8\x01 \x00*\x00:\x00B\x00J\x00R\x00Z\x00b\x00j\x00r\x00z\x00\x80\x01\xe9\x9b\x8c\xb5\x99-\x90\x01d\x98\x01\xea\x9b\x8c\xb5\x99-\xa2\x01\x00\xaa\x01\x00\xb0\x01\x00\xb8\x01\x01\xc0\x0
1\x00\xd1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xea\x01\x00\xf0\x01\x01\xf8\x01\x00\x80\x02\x00\x88\x02\x00\x90\x02\x00\x98\x02\x00\xa8\x02\x00\xb0\x02\x00\xb8\x02\x90N\xc0\x02\x00\xc8\x0
2\x00
作为我得到的建议,我需要使用我在步骤 1 中为 python 生成的相同 .proto 文件并解码消息但没有任何成功,因为我不知道描述符需要通过。
所以在 1 个步骤中就是这样做和工作的完美
decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(descriptors[endpoint]['decode'], raw_response.body)
但在第二步中无法以相同的方式解码消息,我缺少什么或如何使用相同的 .proto 文件解码消息?
我终于找到了一个解决方法,也许是一种原始的方法,但只有这个对我有用。
根据供应商的回答,两种情况都需要使用相同的 .proto 文件
解决方案:
1.是否列出了 .proto 文件中的所有描述符
here is .proto file generated for python 3 is too big cant paste content here
https://ufile.io/2p2d6
descriptors = [cTraderReportingMessages5_9_pb2.descriptor_1, cTraderReportingMessages5_9_pb2.descriptor_2]
2。循环抛出列表并逐一传递
for d in descriptors:
decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(d, raw_response.body)
3。检查decoded_response是否为空
if decoded_response:
# descriptor was found
# response is decoded
else:
# no descriptor
4.解码响应后,我们将其解析为字典:
from protobuf_to_dict import protobuf_to_dict
decoded_response_to_dict = protobuf_to_dict(decoded_response)
这个花费了数周时间的解决方案终于奏效了。
我正在处理 cTrader 交易平台。 我的项目是在 python 3 on tornado 上写的。
并且在从报告 API 事件中解码 prtobuf 消息时遇到问题。
下面将列出我所取得的一切以及哪里有问题。
- 第一个 cTrader 有休息 API 的报告
- 所以我得到了 .proto 文件并为 python 3 生成了它
- 原始文件被调用:cTraderReportingMessages5_9_pb2
- 来自 rest Report API 获取 protobuf 消息并能够按以下方式解码,因为我知道要传递哪个描述符进行解码
from models import cTraderReportingMessages5_9_pb2
from protobuf_to_dict import protobuf_to_dict
raw_response = yield async_client.fetch(base_url, method=method, body=form_data, headers=headers)
decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(descriptors[endpoint]['decode'], raw_response.body)
描述符[端点]['decode'] = 我的描述符确切地知道要传递哪个描述符来解码我的消息
我的内容来自 cTraderReportingMessages5_9_pb2
# here is .proto file generated for python 3 is too big cant paste content here
https://ufile.io/2p2d6
所以直到这里使用 rest api 并确切知道要传递哪个描述符,我能够解码 protobuf 消息并继续前进。
2。现在我面临的问题
正在与 python 3 连接到 127.0.0.:5672 上的隧道
我正在侦听事件并收到此类数据
b'\x08\x00\x12\x88\x01\x08\xda\xc9\x06\x10\xb6\xc9\x03\x18\xa1\x8b\xb8\x01 \x00*\x00:\x00B\x00J\x00R\x00Z\x00b\x00j\x00r\x00z\x00\x80\x01\xe9\x9b\x8c\xb5\x99-\x90\x01d\x98\x01\xea\x9b\x8c\xb5\x99-\xa2\x01\x00\xaa\x01\x00\xb0\x01\x00\xb8\x01\x01\xc0\x0
1\x00\xd1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xea\x01\x00\xf0\x01\x01\xf8\x01\x00\x80\x02\x00\x88\x02\x00\x90\x02\x00\x98\x02\x00\xa8\x02\x00\xb0\x02\x00\xb8\x02\x90N\xc0\x02\x00\xc8\x0
2\x00
作为我得到的建议,我需要使用我在步骤 1 中为 python 生成的相同 .proto 文件并解码消息但没有任何成功,因为我不知道描述符需要通过。
所以在 1 个步骤中就是这样做和工作的完美
decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(descriptors[endpoint]['decode'], raw_response.body)
但在第二步中无法以相同的方式解码消息,我缺少什么或如何使用相同的 .proto 文件解码消息?
我终于找到了一个解决方法,也许是一种原始的方法,但只有这个对我有用。
根据供应商的回答,两种情况都需要使用相同的 .proto 文件
解决方案:
1.是否列出了 .proto 文件中的所有描述符
here is .proto file generated for python 3 is too big cant paste content here
https://ufile.io/2p2d6
descriptors = [cTraderReportingMessages5_9_pb2.descriptor_1, cTraderReportingMessages5_9_pb2.descriptor_2]
2。循环抛出列表并逐一传递
for d in descriptors:
decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(d, raw_response.body)
3。检查decoded_response是否为空
if decoded_response:
# descriptor was found
# response is decoded
else:
# no descriptor
4.解码响应后,我们将其解析为字典:
from protobuf_to_dict import protobuf_to_dict
decoded_response_to_dict = protobuf_to_dict(decoded_response)
这个花费了数周时间的解决方案终于奏效了。