747929791 / majsoul_wrapper Goto Github PK
View Code? Open in Web Editor NEW自动化雀魂AI的SDK,实时解析雀魂对局信息,并模拟鼠标动作出牌
License: MIT License
自动化雀魂AI的SDK,实时解析雀魂对局信息,并模拟鼠标动作出牌
License: MIT License
% pbjs -t proto3 liqi.json > liqi.proto
/usr/local/lib/node_modules/pbjs/node_modules/protocol-buffers-schema/parse.js:600
throw new Error('Unexpected token: ' + tokens[0])
^
Error: Unexpected token: {
at Function.parse (/usr/local/lib/node_modules/pbjs/node_modules/protocol-buffers-schema/parse.js:600:15)
at exports.parseSchema (/usr/local/lib/node_modules/pbjs/index.js:6:23)
at Object. (/usr/local/lib/node_modules/pbjs/cli.js:21:20)
at Module._compile (node:internal/modules/cjs/loader:1469:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
at Module.load (node:internal/modules/cjs/loader:1288:32)
at Module._load (node:internal/modules/cjs/loader:1104:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
at node:internal/main/run_main_module:28:49
Node.js v20.17.0
不知如何解决
在运行mitmproxy
时报错:ImportError: cannot import name 'soft_unicode' from 'markupsafe'
而markupsafe:2.1.0
中移除了soft_unicode
。
为了解决这个问题我尝试了几个其他版本的Jinja2
,但是仍然有版本不兼容的问题。
希望能提供一下requirements.txt文件以供参考,谢谢!
addons.py中:
if name=='main':
#回放websocket流量
replay_path=os.path.join(os.path.dirname(file), 'websocket_frames.pkl')
history_msg = pickle.load(open(replay_path, 'rb'))
activated_flows = ['fake_id']
messages_dict = {'fake_id':history_msg}
其中的websocket_frames.pkl文件丢失
In addons.py:
if name=='main':
#回放websocket流量
replay_path=os.path.join(os.path.dirname(file), 'websocket_frames.pkl')
history_msg = pickle.load(open(replay_path, 'rb'))
activated_flows = ['fake_id']
messages_dict = {'fake_id':history_msg}
websocket_frames.pkl missing
在Selenium的最新版本中,webdriver.Chrome()构造函数不再接受chrome_options参数,而是改为使用options参数。
需要修改以下代码行:
browser = webdriver.Chrome(chrome_options=chrome_options)
改为:
browser = webdriver.Chrome(options=chrome_options)
我是个小白,因为是用anaconda安装的python,所以很多包都是在conda的目录下,导致cmd运行时找不到包。所以我想试试您说的第二种方法:作为第三方package使用。
但是我查了一下相关教程,要么是用“python setup.py install”安装的,要么是用“pip install some_package.whl”的方式安装的,在您的包里我既没有找到setup.py也没找到以whl结尾的文件,请问我该如何操作呢?
即使成功的部署了所有环境,都会在这最后一步卡死:
Traceback (most recent call last):
File "main.py", line 744, in
MainLoop(level=level)
File "main.py", line 724, in MainLoop
aiWrapper.recvFromMajsoul()
File "main.py", line 124, in recvFromMajsoul
result = self.liqiProto.parse(flow_msg)
File "C:***\MajsoulAI-master\majsoul_wrapper\liqi.py", line 66, in parse
action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)
google.protobuf.message.DecodeError: Error parsing message
*已使用3.10.0编译最新的liqi.json文件。
首当其冲的是in script addons.py: No module named 'mitmproxy.connections'
尝试用import mitmproxy.connection解决之(乐)
接着是in script addons.py: No module named 'mitmproxy.proxy.protocol'
尝试用
import mitmproxy.tls
import mitmproxy.proxy
import mitmproxy.flow
等解决之
然后重量级的来了in script addons.py: module 'mitmproxy.websocket' has no attribute 'WebSocketFlow'
这没办法了,只能待会儿install一个旧版本的mitmproxy看看情况
liqi.py 65-68:
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
日志:
Wrong wire type in tag.
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\decoder.py", line 972, in _DecodeUnknownField
raise _DecodeError('Wrong wire type in tag.')
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\python_message.py", line 1178, in InternalParse
(data, new_pos) = decoder._DecodeUnknownField(
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\python_message.py", line 1127, in MergeFromString
if self._InternalParse(serialized, 0, length) != length:
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\python_message.py", line 794, in FromString
message.MergeFromString(s)
File "C:\Users\12772\Desktop\MajsoulAI-master\majsoul_wrapper\liqi.py", line 67, in parse
action_dict_obj = MessageToDict(action_proto_obj)
File "C:\Users\12772\Desktop\MajsoulAI-master\main.py", line 124, in recvFromMajsoul
result = self.liqiProto.parse(flow_msg)
File "C:\Users\12772\Desktop\MajsoulAI-master\main.py", line 724, in MainLoop
aiWrapper.recvFromMajsoul()
File "C:\Users\12772\Desktop\MajsoulAI-master\main.py", line 744, in
MainLoop(level=level)
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\runpy.py", line 194, in _run_module_as_main (Current frame)
return _run_code(code, main_globals, None,
google.protobuf.message.DecodeError: Wrong wire type in tag.
将上述代码第二行getattr()添加默认值""可以略过第一次报错(ActionMJStart)
{'step': 0, 'name': 'ActionMJStart', 'data': ''}
但是进入新的回合后data的值不为空时无法解码
{'step': 1, 'name': 'ActionNewRound', 'data': 'H/b75PhO8hTmKQEaJGBZ/3ppU1JxThiqHgATnE8BSWXnJL9c/dm9mqNxpsi8i/XO/bINs8/LBwbIiNxQdufk+vInt9iIo5ITP14LTCqWW0wPmL/jGxfTVc9U7tudwMQk8L2oMdTv5atY3WbxUiBvRY5o3kKJYjc0VyufGCUihW4bWF7H'}
修改后删除上述代码后两行会报另一个错:Unexpected end-group tag.
已经更换为最新版(v0.10.194.w)的最新liqi.json并进行proto→py转义
因为使用的是edge,protobuf需要3.14.0
使用protoc版本为3.14.0 使用protobufjs版本为v7.2.1(当前最新版) py3.8
proto模块解码分析wire_type为7
这个命令报错..
╰─❯ mitmdump -s addons.py
Traceback (most recent call last):
File "/opt/homebrew/bin/mitmdump", line 8, in <module>
sys.exit(mitmdump())
File "/opt/homebrew/lib/python3.9/site-packages/mitmproxy/tools/_main.py", line 164, in mitmdump
m = run(dump.DumpMaster, cmdline.mitmdump, args, extra)
File "/opt/homebrew/lib/python3.9/site-packages/mitmproxy/tools/_main.py", line 71, in run
opts = options.Options()
File "/opt/homebrew/lib/python3.9/site-packages/mitmproxy/options.py", line 50, in __init__
self.add_option(
File "/opt/homebrew/lib/python3.9/site-packages/mitmproxy/optmanager.py", line 109, in add_option
self._options[name] = _Option(name, typespec, default, help, choices)
File "/opt/homebrew/lib/python3.9/site-packages/mitmproxy/optmanager.py", line 34, in __init__
typecheck.check_option_type(name, default, typespec)
File "/opt/homebrew/lib/python3.9/site-packages/mitmproxy/utils/typecheck.py", line 73, in check_option_type
elif not isinstance(value, typeinfo):
File "/opt/homebrew/Cellar/[email protected]/3.9.13_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/typing.py", line 720, in __instancecheck__
return self.__subclasscheck__(type(obj))
File "/opt/homebrew/Cellar/[email protected]/3.9.13_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/typing.py", line 723, in __subclasscheck__
raise TypeError("Subscripted generics cannot be used with"
TypeError: Subscripted generics cannot be used with class and instance checks```
在使用pip安装依赖的时候,如果先安装mitmproxy,再安装protobuf。
由于mitmproxy依赖于protobuf,会自动安装依赖版本的protobuf。但是mitmproxy依赖的protobuf版本号为3.11.3
,并非最后版本(issue提交时为3.13.0
)。若以此版本的protobuf运行项目,会给出以下报错信息:
module 'google.protobuf.descriptor' has no attribute '_internal_create_key'
此时使用pip更新protobuf,可以正常更新,但是pip给出警告信息:
mitmproxy 5.2 requires protobuf<3.12,>=3.6.0, but you'll have protobuf 3.13.0 which is incompatible.
(另注: 此信息其实是ERROR级的,但是是pip新特性,将在Oct.2020之后生效。所以此处仍然成功更新了)
更新后,代码可以正常运行。
python版本:3.7.2(非anaconda)
pip版本:20.2.3
参考了其他issues, 使用了3.7的python和5.0.0的mitmproxy
pip show mitmproxy
Name: mitmproxy
Version: 5.0.0
Summary: An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets.
Home-page: http://mitmproxy.org
Author: Aldo Cortesi
Author-email: [email protected]
License: MIT
Location: c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages
Requires: pyOpenSSL, hyperframe, h2, protobuf, ruamel.yaml, passlib, ldap3, urwid, blinker, publicsuffix2, pyasn1, click, wsproto, flask, sortedcontainers, tornado, kaitaistruct, pyperclip, certifi, cryptography, pydivert, Brotli, zstandard, pyparsing
Required-by:
python --version
Python 3.7.9
运行mitmdump -s addons.py时报错
Traceback (most recent call last):
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\runpy.py", line 193, in run_module_as_main
"main", mod_spec)
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\runpy.py", line 85, in run_code
exec(code, run_globals)
File "C:\Users\cczhao\AppData\Local\Programs\Python\Python37\Scripts\mitmdump.exe_main.py", line 7, in
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\mitmproxy\tools_main.py", line 152, in mitmdump
from mitmproxy.tools import dump
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\mitmproxy\tools\dump.py", line 1, in
from mitmproxy import addons
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\mitmproxy\addons_init.py", line 12, in
from mitmproxy.addons import onboarding
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\mitmproxy\addons\onboarding.py", line 2, in
from mitmproxy.addons.onboardingapp import app
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\mitmproxy\addons\onboardingapp_init_.py", line 3, in
from flask import Flask, render_template
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\flask_init_.py", line 14, in
from jinja2 import escape
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\jinja2_init_.py", line 12, in
from .environment import Environment
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\jinja2\environment.py", line 25, in
from .defaults import BLOCK_END_STRING
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\jinja2\defaults.py", line 3, in
from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401
File "c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\jinja2\filters.py", line 13, in
from markupsafe import soft_unicode
ImportError: cannot import name 'soft_unicode' from 'markupsafe' (c:\users\cczhao\appdata\local\programs\python\python37\lib\site-packages\markupsafe_init_.py)
rt。
具体是卡在登陆之后的 loading 界面,显示 “您的链接状况不太好,请检查网络代理设置,请耐心重试一下,可尝试在登陆界面切换线路”
liqi.py里面第65~66行
B = base64.b64decode(dict_obj['data'])
action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)
即获取对局信息,该部分即使使用最新的liqi.json解析也会报错:
google.protobuf.message.DecodeError: Wrong wire type in tag.
我的环境为
Python 3.9.7
mitmproxy 6.0.2
protobuf 3.14.0(该版本为mitmproxy==6.0.2所依赖的、自动安装的)
protoc 3.14.0
目前的雀魂版本为 https://game.maj-soul.net/1/v0.10.174.w/res/proto/liqi.json
在liqi.py的第39行 OS X系统运行会报错
源代码:
open(os.path.join(os.path.dirname(file), 'proto\liqi.json'), 'r'))
修改后:
open(os.path.join(os.path.dirname(file), 'proto/liqi.json'), 'r'))
可正常运行
mitmproxy已经下载好了
will parse buf:010a132e6c712e416374696f6e50726f746f74797065122508021211416374696f6e4469736361726454696c651a0e957c636850ae4e9c75ca999edf93
msg block:[{'id': 1, 'type': 'string', 'data': b'.lq.ActionPrototype', 'begin': 0}, {'id': 2, 'type': 'string', 'data': b'\x08\x02\x12\x11ActionDiscardTile\x1a\x0e\x95|chP\xaeN\x9cu\xca\x99\x9e\xdf\x93', 'begin': 21}]
method name:.lq.ActionPrototype, message name:ActionPrototype
dict obj:{'step': 2, 'name': 'ActionDiscardTile', 'data': 'lXxjaFCuTpx1ypme35M='}
B:b'\x95|chP\xaeN\x9cu\xca\x99\x9e\xdf\x93', name:ActionDiscardTile
Failed to parse message: Wrong wire type in tag.
Message content: 010a132e6c712e416374696f6e50726f746f74797065122508021211416374696f6e4469736361726454696c651a0e957c636850ae4e9c75ca999edf93
None
类似这样,解到ActionDiscardTile这一层,base64解码后解不出protobuf
按步骤,重新生成了liqi_pb2.py,但是运行时还是报错
File "C:\Users\scYil\Desktop\MajsoulAI\majsoul_wrapper\liqi.py", line 85, in parse
liqi_pb2_req = getattr(pb, proto_domain['requestType'])
AttributeError: module 'majsoul_wrapper.proto.liqi_pb2' has no attribute 'ReqHeatBeat'
可以更新一下吗 🙇
用 https://github.com/747929791/MajsoulAI 的AI运行majsoul_wrapper的时候会报KeyError: 'fetchLastPrivacy'
具体信息如下:
(venv) D:\MajsoulAI-master>python main.py
waiting to calibrate the browser location
Number of good matches: 642
Homography Matrix: [[ 6.48872443e-01 -1.81677678e-04 6.75356641e+02]
[ 5.29145342e-04 6.48279953e-01 2.50010905e+02]
[ 5.38194002e-07 -1.41332255e-07 1.00000000e+00]]
Similarity: 0.9973840146991272
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection: <class 'socket.socket'> <socket.socket fd=1628, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 60383)> ('127.0.0.1', 60383)
waiting for the game to start
Traceback (most recent call last):
File "main.py", line 744, in <module>
MainLoop(level=level)
File "main.py", line 705, in MainLoop
while not aiWrapper.isPlaying():
File "main.py", line 107, in isPlaying
result = liqiProto.parse(flow_msg)
File "D:\MajsoulAI-master\majsoul_wrapper\liqi.py", line 84, in parse
proto_domain = self.jsonProto['nested'][lq]['nested'][service]['methods'][rpc]
KeyError: 'fetchLastPrivacy'
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.