Python 3 - Google protobuf response - декодировать без файла .proto - PullRequest
0 голосов
/ 19 марта 2019

У меня есть проблема с расшифровкой ответа google protobuf без файла .proto, реализованный с файлом proto и работающий нормально, но в этом случае файл .proto недоступен.

Использование python 3+ и оттуннель получает этот ответ

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'

Есть способ декодировать Google ptobuf без файла .proto и сделать его диктовкой?

Мой код для достижения этой цели приведен ниже:

import pika

credentials = pika.PlainCredentials('demo', 'demo')

cp = pika.ConnectionParameters(
    host='127.0.0.1',
    port=5671,
    credentials=credentials,
    ssl=False,
)

connection = pika.BlockingConnection(cp)
channel = connection.channel()

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback, queue='demo_queu', no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

необходимо достичь:

, чтобы получить тело и расшифровать его в удобочитаемом для человека виде

любая идея будет оценена

1 Ответ

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

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

РЕШЕНИЕ:

1. Сделал список со всеми дескрипторами из файла .proto

    here is .proto file generated for python 3 is too big cant paste content here

    https://ufile.io/2p2d6

    descriptors = [proto_file.descriptor_1, proto_file.descriptor_2]

2. Список бросков петли и передача по одному

for d in descriptors:
    decoded_response = proto_file._reflection.ParseMessage(d, raw_response.body)

3. Проверьте, не является ли decoded_response не пустым

   if decoded_response:
       # descriptor was found
       # response is decoded
   else:
       # no descriptor

4. После расшифрованного ответа мы идем разобрать его в dict:

from protobuf_to_dict import protobuf_to_dict

decoded_response_to_dict = protobuf_to_dict(decoded_response)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...