自从微信开放了小程序制作游戏的权限以来,各种小程序扑面而来。有人预言,下一个风口将会是小程序。所以说,能不能“一夜暴富”,就看你能不能站在风口了;
当然,这里不是教大家制作小程序的,只是简单的弄了一个头脑王者的答题辅助工具,让大家快速上王者,褥一点羊毛罢了
代码已经上传到GitHub:https://github.com/stormdony/python_demo
有兴趣可以下载玩一玩
技术要点
- 用fiddler抓数据包
- 链接的拼接
- 一定的数据处理逻辑
思路分析
通过利用fiddler抓包,抓住题目和选项,保存在文件中,再从文件中提取相应的内容,进行百度搜索,通过词频统计,找出最佳结果。当然,对于那些含有“不”的取反问题,就会有点问题,但是正确率,还是可以保证的
fiddler抓包
关于手机抓包的具体设置步骤,在这里就不细说了。网上有很多的介绍
推荐这篇博客使用fiddler对手机上的程序进行抓包 ,如果有不懂的,欢迎提问
设置好fiddler之后,就可以进入正题了
1.抓请求
在答过一次排位赛后,观察fiddler中的每一条请求,查看哪些请求包含题目
由于我已经弄好了,所以这里直接给出图片
所以直接在fiddler中设置过滤规则,过滤掉其他不需要的请求
过滤完后,再次进行排位赛,就只会看到5条题目的请求了。
2.保存文件
在fiddler右侧的功能中,选择Fiddler Script
来保存题目文件,具体步骤看下图
在OnBeforeResponse
方法中添加下面的代码,其中文件存放位置可以自己设定,这里设置为 D:/quiz/response.txt
if(oSession.host == 'question-zh.hortor.net'){
oSession.utilDecodeResponse(); //Decoding HTTP request in case it's gzip
//Saving full request object (Including HTTP headers)
oSession.SaveResponse('D:\\quiz\\response.txt',true);
//Saving just body
oSession.SaveResponseBody('D:\\quiz\\body.txt');
}
获取到的body.txt
内容为(正在答题时,打开body.txt
),可以看到一个json类型的数据,这就是我们需要的信息
ps:答完题目之后,看到的不是下面的内容
{"data":
{"quiz":"满洲里位于我国的那个地区?",
"options":["东北","西北","华北","华中"],
"num":3,
"school":"理科",
"type":"地理",
"typeID":9,
"contributor":"",
"partner":2,
"endTime":1525486464,
"curTime":1525486449,
"myBuff":{"3":0},
"choose":{},
"score":{"16294982":180,"231711834":160}},
"errcode":0}
开始编程
定义一个方法,执行具体步骤,在这一个过程中,困难最大的应该是URL的拼接,因为编码方式的不同,导致试验了很久才找到解决的方法
def begin(filename):
f = open(filename, 'r', encoding='utf-8')
try:
j = json.loads(f.read())
# 判断数据文件是否有题目和选项
if 'quiz' in j['data'] and 'options' in j['data']:
num = j['data']['num']
quiz = j['data']['quiz']
print(('第' + str(num) + '题:' + quiz).center(50, '*') + '\n')
cho = j['data']['options']
#设置获取百度查询结果的前三页
pagenum = [0, 10, 20]
ans = []
#定义四个选项的词频,初始化为0
A = B = C = D = 0
for i in pagenum:
#拼接URL,
url = 'http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=' + quiz[:-1] + '&pn={}'.format(i)
wb_data = requests.get(url)
wb_data.encoding = 'utf-8'
content = wb_data.text
for index,choice in enumerate(cho):
strnum = content.count(choice)
# print(choice + " : {}".format(strnum))
ans.append(strnum)
#将前三页的词频叠加起来
for index,selection in enumerate(ans):
index = (index % 4)
if index == 0:
D += selection
elif index == 1:
C += selection
elif index == 2:
B += selection
elif index == 3:
A += selection
number = [D, C, B, A]
for name, count in zip(cho, number):
print(name, count)
#找出词频最大的选项
index = number.index(max(number))
print('\033[32;0m')
print((" 应该选第 " + str((index + 1)) + " 个 " + str(cho[index])).center(50, '*'))
print('\033[0m ')
else:
pass
print(' - '*15)
except:
pass
f.close()
定义一个入口函数
if __name__ == '__main__':
while True:
#文件位置需修改
begin('D:/quiz/body.txt')
time.sleep(1)
验证成果
运行程序之后,可以看到输出下面的内容
这样就可以根据结果选择相应的选项,正确率还是可以的。一个小时上王者
总结
通过这样一种方法,可以快速的上王者,每赛季都可以褥一下几块钱的羊毛,当然,每天的奖金赛是用不了的。
由于技术有限,不能够实现全自动,所以有其他想法,可以留言,蟹蟹
ps:教程仅供娱乐使用。