我要做什么:
近期最火的在风口上飞起来的项目大概就是“全民答题赚钱”了。各个直播平台巨头争相恐后的在这个战场厮杀,惨烈程度可以看下图(最近的烧钱更加惨烈):
我们这些吃瓜群众自然是开心的不行,毕竟有钱拿的事情谁都乐意参与,何况是通过自己的智力赚取财力,贼骄傲贼自豪。
然而,在天朝,有游戏的地方就有外挂,毕竟看着白花花的银子大家都眼红啊。民间程序猿大神们开始动起来自己的双手开工赚钱,有号称写了三个小时程序的Python程序猿的外挂:
更夸张的是,这次不仅民间的码农们出击,竟然都有了官方外挂,比较有代表性的是百度的简单搜索,支持语音+拍照题目搜索;搜狗则更夸张,直接在一个Webview页面上更新答案:
我是怎么做的
明确需求
正所谓,做人处事一定要有风骨,玩游戏怎么能靠外挂呢?要用外挂就得用自己的!
说干就干,首先明确下我的需求是什么,很简单,答对题目赢钱。所以我就有了两个很明确的需求,题目和答案,确定了外挂的基本框架:
乍一看框架特别简单,然而为了满足答题游戏的规则:10s中给出正确答案,再对外挂提出以下要求:
- 结合竞品情况,题目准确率不一定要100%,但要达到60%以上;
- 一定要快,一定要快,一定要快!重要的事情说三遍,除了10s的限制,因为答案不一定准确还要人脑做一个判断,故效率应该在7s左右;
明确了需求,话不多说开始干活。
外挂1.0
外挂形式:
思前想后,作为一个测试开发工程师,在技术深度上还欠缺火候,理了一下自己的技术栈:
- 语言:Python Java JS
- 平台知识储备:SQL Network
-
... ....
实在是有点惨不忍睹,所以我的外挂一定要简单,那就来最简单的Python吧。
获取题目:
第一个想到的就是文字识别,这也是多数外挂应用的方法。百度用了成熟的图片识别和语音识别,而搜狗搜索也用了自己的OCR识别技术。但想到自己单兵作战精力有限,不想再搞一套文字识别算法。想到上面那位花了三个小时的工程师的程序,我定睛一看,"alicloudapi",这不我司阿里云的API嘛。有现成的API不用再撸一套实在费心啊,还是用兄弟BU的产品吧,刚好遇到五折活动,下单下单(API地址)。
代码的逻辑比较暴力,adb截图,API获取到文字和位置信息,拿到json,解析出来题目:
在做了上面的微小工作之后我花了不到1s的时间获取到了题目信息,给我们阿里云的API点个赞:
搜索答案:
成功获取了题目,如何搜索到满意的答案呢? 毕竟百度和搜狗两家都是做搜索的,有着成熟的搜索技术和配置牛逼的引擎,再加上百万平方米的机房,而我,只有刚换的新的13 mbp,比不起比不起啊。那我该怎么办呢?综上考虑,机器学习来不及了,我这单机10s内跑不完,海量搜索也做不了,数据哪里来......那就用现成的技术吧:
回想了之前的项目经历,我决定拿出以前研究过的东西来,WebDriver +htmlUnit,既然是搜答案,那就直接上百度,既然原生浏览器速度太慢太耗时间,那就来虚拟的。话不多说撸了代码:
这里也挺简单,开一个selenium remote server,模拟一个虚拟的browser,然后打开百度首页,input题目,搜索,把产生的结果download下来,找到答案可能附着的element作为知识库,比较三个选项在知识库里出现的次数,次数最多的就是最终答案。
运行结果:
开挂了开挂了,模拟一次答题的经历如下:
虽然程序准确输出了答案,但是在没有截图的步骤下时间达到了6s钟,加上截图保存的时间,耗费时间实在太长。
外挂2.0
速度提升自动化优化
通过运行脚本,发现外挂1.0的弊端实在太明显:
- 速度慢
- 自动化程度低,截图过程时间长、需要把握时机
然后1.0受到了女神的鄙视:
为了吃到曲奇,我决定从下面两方面做优化:
- 干掉截图的方法,截请求拿题目
- 通过API的方式获得百度搜索方法
经过两天的试验,我到现在都没有获得下发题目的日志(以“芝士超人”为例),所以截获请求拿题目的想法暂时毙掉。想到很多人拿Python用来爬虫,原理也就是download页面数据而已。果断查询了百度请求的参数,得到下面的结果:
- http://www.baidu.com/s?wd=关键字,wd(Keyword):查询的关键词;
- http://www.baidu.com/s?wd=关键字&cl=3,cl(Class):搜索类型,cl=3为网页搜索,cl=2为图片搜索;
- http://video.baidu.com/v?rn=20&pn=0,pn(Page Number):显示结果的页数;
- ... ...
剩下的参数感兴趣的同学可以百度,这些已经够我用了哈哈:
key = question # 题目
count_search = 3 # 搜索结果的页数
for i in range(1, count_search):
urlsearch = "http://www.baidu.com.cn/s?wd=" + key.decode('utf-8') + "&cl=3&pn=" + str(i) + "0"
# print(urlsearch)
response_search = urllib2.urlopen(urlsearch.decode('utf-8'))
html = response_search.read() + html
然后最后一步是从html中分析答案就好了,目前的做法就直接统计了选项出现的概率,最后的结果如下图:
从截图到给出答案的时间稳定在4s左右。终于得到了女神的夸奖哈哈:
到底能不能用呢?
到现在我的外挂也没有投入到生产中去,现在还用着百度的“简单搜索”,处在放弃的边缘。总结起来致命的缺点有以下几个:
- 截图的时机不好把握,往往无法最快的速度截图
- 仅仅计算答案出现的概率对付填空题类型的题干还可以,计算性选择性的题干错误率贼高
总结起来就是又慢又不准!
不过本身这个外挂也没用上什么高端的技术,也没有像公众号那位大哥花费3小时之久,能够用极其简单的成本做出来个小产品挺有成就感的。
但是我到底能不能吃上女神的法丽兹抹茶曲奇呢?还请各位大神在评论区里献言献策,一起提升我们的外挂实力啊!