最近和女票玩头脑王者2打发时间,因为比较菜被鄙视了,就想着如何才能用技术来搜索答案。经过查阅资料发现,头脑王者2通过WebSocket
通信中会在题目出现前
直接发送客户端答案和题目,所以我们只要通过监控数据包提取数据就可以提前知道答案了。
mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,并且可以通过python调用来编程实现特定的功能,非常好用。
使用方法参考:App爬虫神器mitmproxy和mitmdump的使用
注意:在电脑上可能因为是本机,在我的win10系统上抓取微信pc客户端小程序的WebSocket
通讯失败了,经过测试,在ios
系统上添加证书可以正常抓取https,wss
等数据,在android
系统上,无论是否大于7.0,添加根证书root信任之后也没法正确抓取wss
但是https
可以,而网上流传的用老版本微信因为微信会提示更新用不了所以也无法使用了,最后只能用我的ios14
的iphone11
抓包。
python3.8 mitmproxy (我用pip安装的) msgpack (用来解码序列数据) win32com (调用朗读人)
pythonmitmweb --set http2=false -s run.py
# 为了抓取成功避免错误需要加上http2=false参数
另外一说这个游戏会给你匹配电脑来玩,到最后冲榜一的时候,和我一起的小伙伴根本就没在玩,电脑虚拟了它的数据变成了我的队友,这种情况还有很多,我就觉得不可能玩家啥时候都能匹配到啊,所以这个游戏随便玩玩就好了,不要太认真,非要冲榜请写个自动化操作的,不要自己肝,不值得
pythonfrom mitmproxy import ctx
import mitmproxy.websocket
import msgpack
import gzip
import win32com.client
import asyncio
games = 0
class ShowAnswers:
games = 0
async def say(self,texts):
speaker.Speak(texts)
def websocket_message(self, flow: mitmproxy.websocket.WebSocketFlow):
ctx.log.warn("收到了wss信息。")
message = flow.messages[-1]
content = message.content
if content !=b'\x00'and len(str(content)) >= 10:
#排除空的或者无法识别的信息
content = gzip.decompress(content)
msg = msgpack.loads(content)
try:
body = msgpack.loads(msg['body'],strict_map_key=False)
msg['body'] = body
except:
pass
#解压读取信息
cmd = msg['cmd']
if cmd == 'Resp_Sync':
#处理信息
self.deal_resp_sync(msg)
if cmd == "Push_MatchStared":
#speaker.Speak("比赛开始啦,么么哒")
self.games = self.games +1
def deal_resp_sync(self,msg):
body = msg['body']
try:
battleInfo = body['battleInfo']
if 'className' in str(battleInfo) and 'province' not in str(battleInfo):
#找到正确的包含答案的信息
quizMap = battleInfo['quizMap']
for num,data in quizMap.items():
#获得题目编号和数据
quiz=data['quiz']
className = data['className']
categoryName = data['categoryName']
answers = {}
for index in data['answers']:
answers[index+1] = data['options'][index]
#把答案序号存入answers字典
ctx.log.warn("{}.{}: {}".format(className,categoryName,quiz))
the_answer = ""
for index,op in answers.items():
ctx.log.warn("[{}] {}".format(index,op))
the_answer = the_answer+str(index)+'、'
#遍历answers字典输出答案
asyncio.get_event_loop().create_task(self.say("第"+the_answer[0:-1]+"个"))
ctx.log.info("\n\n")
except:
pass
speaker = win32com.client.Dispatch("SAPI.SpVoice")
addons = [ShowAnswers()]
本文作者:mereith
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!