编辑
2020-11-19
实用笔记
00
请注意,本文编写于 1264 天前,最后修改于 444 天前,其中某些信息可能已经过时。

目录

mitmproxy抓包工具
原理
代码实现
环境
运行方式
运行效果
代码

最近和女票玩头脑王者2打发时间,因为比较菜被鄙视了,就想着如何才能用技术来搜索答案。经过查阅资料发现,头脑王者2通过WebSocket通信中会在题目出现前直接发送客户端答案和题目,所以我们只要通过监控数据包提取数据就可以提前知道答案了。

mitmproxy抓包工具

mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,并且可以通过python调用来编程实现特定的功能,非常好用。

使用方法参考:App爬虫神器mitmproxy和mitmdump的使用

注意:在电脑上可能因为是本机,在我的win10系统上抓取微信pc客户端小程序的WebSocket通讯失败了,经过测试,在ios系统上添加证书可以正常抓取https,wss等数据,在android系统上,无论是否大于7.0,添加根证书root信任之后也没法正确抓取wss但是https可以,而网上流传的用老版本微信因为微信会提示更新用不了所以也无法使用了,最后只能用我的ios14iphone11抓包。

原理

  1. mitmweb抓取微信小程序的数据流
  2. 分析判断数据流,抓取需要的题目和答案数据
  3. 输出到屏幕上并调用win10的语音朗读读出答案

代码实现

环境

python3.8 mitmproxy (我用pip安装的) msgpack (用来解码序列数据) win32com (调用朗读人)

运行方式

python
mitmweb --set http2=false -s run.py # 为了抓取成功避免错误需要加上http2=false参数

运行效果

另外一说这个游戏会给你匹配电脑来玩,到最后冲榜一的时候,和我一起的小伙伴根本就没在玩,电脑虚拟了它的数据变成了我的队友,这种情况还有很多,我就觉得不可能玩家啥时候都能匹配到啊,所以这个游戏随便玩玩就好了,不要太认真,非要冲榜请写个自动化操作的,不要自己肝,不值得

代码

python
from 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()]
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:mereith

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!