火了两个月的直播答题随着一纸通知终于落下了帷幕,我也终于可以抽出点时间来分享下我开发这个辅助软件的小小历程了。(不想看的直接拉到下方有源码地址)
我注意到直播答题是一个午休,几个同事在一块激情讨论但是俩眼直勾盯着手机,我忍不住内心的躁动去围观了一下下,原来是盯着映客的芝士超人在答题。说答对12道题,就能分得多少多少钱。我观察了一会儿,想着为什么不开发个软件在题目出来的同时直接给出百度搜索结果呢,这样成功的概率岂不是高了很多。
想法有了之后,就看怎么去获取题目和答案内容了,当时有三种思路。
- 接口抓取:当时想的接口肯定都是加密的,获取会有一定的难度,不具有通用型,暂时pass
- adb截图,ocr识别:当时好像很多人都是这种思路,但是耗时实在太长,总共10秒的时间,光这个就耗时5,6秒,根本没有时间看百度的搜索结果
- 通过Android的无障碍模式,就是AccessibilityService类:这种方式估计对于做Android开发的人应该不会很陌生,前两年大火的微信抢红包采取的就是这种方式。通过Android Device Monitor工具中的Dump View Hierarchy for UI Automator工具获取View的树状结构,然后通过ID找到题目和答案的节点,进而获取题目和答案的内容。
这个软件用的就是Android的无障碍模式,这种方式获取题目的速度简直就是神速,几乎就是和题目出来的时间同步。
思路也有了,说干就干吧,感觉前途一片光明啊,马上就靠答题日进斗金了。但是现实是残酷的,通过Dump View Hierarchy for UI Automator获取View的树状结构时,老是报错。
这个错误折磨了我大概一天多的时间,弄的我差点都准备放弃了。后来才知道原来是直播页面的下方评论区,一直处于刷新状态,uiautomator在获取界面状态信息时,首先要等界面处于idle空闲状态才会做dump操作,这就是uiautomator死活拿不到动态界面信息的原因。找到原因了,但是怎么解决呢?我看网上有人说用root手机可以解决此问题,由于没有root手机,我自己也没有尝试,有root手机的可以试一下看行不行。最后我是用了一种特别讨巧的方式把View给dump下来的,就是进入直播页面并且题目出来的瞬间立即关闭网络,这时候评论还没有出来,时机一定要好。自己也试了n次才成功,真心不容易。
下面是我dump下来的截图,今日头条的已经找不到了,幸好抖音还有,缺映客的芝士超人。
获取到View的层次结构就好说了,下一步就是找到题目和答案对应的ID,然后获取其内容即可。是不是超级简单啊。这就是我一直没有开源的其中一个原因,确实是太简单了,我害怕把我伟岸的形象毁了
但是还是有几个点比较麻烦的。
- 今日头条或者西瓜视频的节点ID不是固定的,所以需要随着它们版本的更新而更新。后面遇到更大的问题就是新版本发布之后,辅助服务死活捕捉不了事件了,其实现在也没有解决,不知道今日头条和西瓜视频做了什么操作,如果大家有谁了解的,可以告诉我
- 花椒用的是WebView,节点ID不存在,而且层次结构老是变。这个最麻烦,尝试了很多种方式,也遇到了很多坑。最后通过找到一个固定节点ID,然后递归它的子节点寻找content-desc不为空实现的
- 冲顶的只取得了题目,答案获取不了,因为它的节点text一直为空
- 芝士超人最简单,直接通过ID就能获取到题目和答案
之后就是把题目和内容通过接口的方式传给服务端,服务端存入缓存,前端页面通过轮询实时获取题目和答案,然后通过百度搜索出结果,这部分比较简单就不详细说了。
到这按说就大功告成了,只是刚开始的几天可把我累死了。因为数据来自于手机,所以手机必须打开相应的直播页面才行,还得防止程序被后台杀死,那时候我一个人拿着好几个手机,来回切换直播平台,真把自己搞崩溃了。不过速度确实比较快,于是我就在v2ex上发了一个帖子,说是史上最快的答题辅助工具,真不是吹,那时候搜狗和百度速度都很慢,所以我建的QQ群在很短的时间内就满员了,因为这个我还买了平生第一个QQ会员,就为了把群人数上限提高,花了我120,我还有点小心疼呢。
不过有一个问题就是不太稳定,原因就是我一个人真是切换不过来四个平台啊,而且花椒差不多半小时一场,我什么都干不了就盯着直播的时间然后打开应用,所以那时候QQ群里面老是有人问,怎么冲顶又不出来答案了,怎么花椒又不出来答案了。那是我实在忙不过来啊。很多人在群里面问我,答题是不是赚了好些钱,我说真是没有时间啊,我都忙着给你们提供数据呢。所以后来我才把apk包分享出来,只有大家都装上都用,数据才会稳定。但是这时的apk只是一个小型分布式数据提供者,别的没什么意义。
这中间还遇到今日头条、花椒频繁升级,造成节点ID一直发生变化,所以新版本发布之后,题目和答案都获取不了了。所以那段时间真是比较忙。因为我还要紧跟着它们进行版本迭代。
本来后续还想把百度的搜索结果优化一下,像答案高亮,优化搜索词等等,结果遇到产品紧急迭代,一下子没有时间了。差不多耽误了两个星期的时间,一直没有更新。两个星期的时间答题辅助工具真是发生了翻天覆地的变化,先后出现了UC,百度,搜狗。它们确实厉害,直接给出具体的答案,而且正确率颇高。瞬间感觉自己落伍了,但是后来注意到它们都有一个缺点就是都需要两个手机,而且我发现好多人都是同时开着uc,baidu,sougou进行比对。后来稍微邪恶一点点的想法就有了,为什么不通过获取接口的方式把三个答案汇总到一起,并且通过悬浮窗展示出来呢?这样一个手机就能安全搞定了!
于是就有了奥莱答题助手的更新版,直接显示上述三家的答案结果,并通过悬浮窗展现出来。不过我没有挨个调用三家的接口,因为有人已经帮我做了汇总了,那就是搜狐。所以我就直接渔翁得利了,直接调用搜狐的接口就能获取这三家的数据了。前端网页顺便也加入了三家的答案结果。果然不负众望,我先后建了6个群,几乎都满员了,人数达到了4000人,感觉自己立马高大上了,一下子管理着4000多人,这感觉好像当上了CEO,走向了人生巅峰。其中一个2000人的群,有人出一万买,我都没卖,怎么可能为五斗米折腰(其实我现在有点后悔)
很多人问我写这个软件也不收费,免费给人家用,目的是什么?我能说我真的没有任何目的嘛,刚开始就是好奇好玩,后来感觉是一件很有成就感的事情,本来还想着大年三十那天,再发一个新版本,加入更多直播平台,然后加入我们公司的广告(百年奥莱),毕竟网页版和小程序版本都用的是我们公司的服务器。可惜当天直播平台一夜之间全下架了,哎,最后一点小愿望和小目的也没有实现。可惜可惜!!
不过让我稍微欣慰点的就是,网页版每天的UV都在一万以上,app版本的日活固定在5000以上,虽然没有达到我的预期,但也算不错了,毕竟app版本没有上任何应用商店,也没有加入分享的功能,完全就是通过我在QQ群的传播。(当然后来我知道很多人都是在淘宝上买的,5块10块20的都有,佩服干淘宝的人真会挣钱,真是空手套白狼啊,也感慨自己挣钱的敏感度真低啊,不但没有挣钱,而且还亏了300多的会员费。)
好了,就说到这里,希望以后能开发出更多大家喜欢的辅助类工具。另外最近一段时间要全新投入到区块链开发中去了,如果大家有好的资料推荐的话,欢迎留言,提前谢谢大家!!
最后附上源码地址,供大家参考。时间紧促、能力有限,代码质量不高,大家担待!!有任何问题,可以进入技术交流群探讨 QQ:721481202
https://github.com/duanyuGit/AoLaiDaTi
答题交流请加这个群:595107194,上面那个群是技术探讨