cTrader расшифровывает сообщение protobuf из Report API Events (туннель) - PullRequest
3 голосов
/ 20 марта 2019

Я имею дело с платформой cTrader Trading.Мой проект написан на Python 3 на торнадо.

И возникли проблемы при декодировании сообщения prtobuf из отчетов API Events.

Ниже будет перечислено все, чего я достиг и где возникла проблема.

  1. Первый cTrader имеетAPI отдыха для отчета
    • , поэтому я получил файл .proto и сгенерировал его для файла python 3
    • . Прото-файл называется: cTraderReportingMessages5_9_pb2
    • из 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)

descriptors [конечная точка] ['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

в качестве рекомендации, которую я получил, мне нужно использовать тот же файл .proto, сгенерированный для python, который я сделал на шаге 1, и декодировать сообщение, но безуспешно, потому что я не знаю, нужно ли передавать дескриптор.

так что в 1 шаге все делалось и отлично работало таким образом

decoded_response = cTraderReportingMessages5_9_pb2._reflection.ParseMessage(descriptors[endpoint]['decode'], raw_response.body)

но на втором шаге не удалось декодировать сообщение, используя таким же образом, что яотсутствует или как декодировать сообщение, используя тот же файл .proto?

1 Ответ

3 голосов
/ 21 марта 2019

Наконец-то нашёл обходной путь, возможно, это примитивный способ, но только это сработало для меня.

При ответе, полученном от провайдеров, необходимо использовать один и тот же файл .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)

Это решение, которое потратило на это недели, наконец-то сработало.

...