bailuWX / MajsoulAI-fix

25 stars 2 forks source link

google.protobuf.message.DecodeError: Wrong wire type in tag. #10

Closed Pragmatism0220 closed 1 year ago

Pragmatism0220 commented 2 years ago
Traceback (most recent call last):
  File "E:\GitHub\MajsoulAI-fix\test11.py", line 170, in <module>
    MainLoop(level=level)
  File "E:\GitHub\MajsoulAI-fix\test11.py", line 155, in MainLoop
    aiWrapper.recvFromMajsoul()
  File "E:\GitHub\MajsoulAI-fix\test11.py", line 125, in recvFromMajsoul
    result = self.liqiProto.parse(flow_msg)
  File "E:\GitHub\MajsoulAI-fix\majsoul_wrapper\liqi.py", line 67, in parse
    action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)
  File "C:\Users\qiu\AppData\Local\Programs\Python\Python39\lib\site-packages\google\protobuf\internal\python_message.py", line 812, in FromString
    message.MergeFromString(s)
  File "C:\Users\qiu\AppData\Local\Programs\Python\Python39\lib\site-packages\google\protobuf\internal\python_message.py", line 1145, in MergeFromString
    if self._InternalParse(serialized, 0, length) != length:
  File "C:\Users\qiu\AppData\Local\Programs\Python\Python39\lib\site-packages\google\protobuf\internal\python_message.py", line 1198, in InternalParse
    (data, new_pos) = decoder._DecodeUnknownField(
  File "C:\Users\qiu\AppData\Local\Programs\Python\Python39\lib\site-packages\google\protobuf\internal\decoder.py", line 993, in _DecodeUnknownField
    raise _DecodeError('Wrong wire type in tag.')
google.protobuf.message.DecodeError: Wrong wire type in tag.

程序报错,关键代码段为liqi.py

msg_type = MsgType(buf[0])  # 通信报文类型
        if msg_type == MsgType.Notify:
            msg_block = fromProtobuf(buf[1:])      # 解析剩余报文结构
            method_name = msg_block[0]['data'].decode()
            """
            msg_block结构通常为
            [{'id': 1, 'type': 'string', 'data': b'.lq.ActionPrototype'},
            {'id': 2, 'type': 'string','data': b'protobuf_bytes'}]
            """
            _, lq, message_name = method_name.split('.')
            liqi_pb2_notify = getattr(pb, message_name)
            proto_obj = liqi_pb2_notify.FromString(msg_block[1]['data'])
            dict_obj = MessageToDict(proto_obj)
            if 'data' in dict_obj:
                B = base64.b64decode(dict_obj['data'])
                action_proto_obj = getattr(pb, dict_obj['name']).FromString(B) #该行报错
                action_dict_obj = MessageToDict(action_proto_obj)
                dict_obj['data'] = action_dict_obj
            msg_id = self.tot

请问是什么原因呢?

bailuWX commented 2 years ago

LIQI 三件套要版本对齐,应该就这个问题。这个要去编译一下

Pragmatism0220 commented 2 years ago

版本问题我已经注意了,但是仍然报了错。这边提供一下我的环境:

Python 3.9.7
mitmproxy 6.0.2
protobuf 3.14.0(该版本为mitmproxy==6.0.2所依赖的、自动安装的)
protoc 3.14.0

仍然出错。这个环境我确认了整整一个下午,是哪里不对吗?会和python版本有关吗?

Pragmatism0220 commented 2 years ago

LIQI 三件套要版本对齐,应该就这个问题。这个要去编译一下

其实在进入对局的时候,无论是点数、昵称还是ready信息,都是能正确解析的。但是,一旦进入对局中,接收牌局信息(如场风自风、牌等),就会报错。也就是action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)这行。请问是什么原因呢?

bailuWX commented 2 years ago

LIQI 三件套要版本对齐,应该就这个问题。这个要去编译一下

其实在进入对局的时候,无论是点数、昵称还是ready信息,都是能正确解析的。但是,一旦进入对局中,接收牌局信息(如场风自风、牌等),就会报错。也就是action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)这行。请问是什么原因呢?

是liqi三件套, 你说的这个是驱动三件套,不一样的,liqi三件套要自己去雀魂官网抓取,然后用相应的工具去编译

Pragmatism0220 commented 2 years ago

LIQI 三件套要版本对齐,应该就这个问题。这个要去编译一下

其实在进入对局的时候,无论是点数、昵称还是ready信息,都是能正确解析的。但是,一旦进入对局中,接收牌局信息(如场风自风、牌等),就会报错。也就是action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)这行。请问是什么原因呢?

是liqi三件套, 你说的这个是驱动三件套,不一样的,liqi三件套要自己去雀魂官网抓取,然后用相应的工具去编译

这个当然抓取了,驱动不就是为了编译的嘛。审查网络后抓取了liqi.json(https://game.maj-soul.net/1/v0.10.174.w/res/proto/liqi.json),之后用`pbjs -t proto3 liqi.json > liqi.proto`进行转换,得到proto文件,并使用3.14.0版本的protoc得到liqi_pb2.py。这个流程是和驱动版本完全对应的,所以编译得到的应该也是对应的..吧?

Pragmatism0220 commented 2 years ago

LIQI 三件套要版本对齐,应该就这个问题。这个要去编译一下

其实在进入对局的时候,无论是点数、昵称还是ready信息,都是能正确解析的。但是,一旦进入对局中,接收牌局信息(如场风自风、牌等),就会报错。也就是action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)这行。请问是什么原因呢?

是liqi三件套, 你说的这个是驱动三件套,不一样的,liqi三件套要自己去雀魂官网抓取,然后用相应的工具去编译

今天又调试了几次,还是不行,怀疑是雀魂的格式更新了?大佬能不能再测试一下,我想确认一下是不是代码确实有问题,谢谢!

Eric-Joker commented 1 year ago

关掉了是解决问题了嘛,能教教我吗