用 Python 玩微信小游戏加减大师拿娃娃

更新

有朋友反映过关后客服不回话。Hmmm我当初也以为只是玩玩而已,直到——我今天莫名来了个快递…

” data-size=”normal” data-rawwidth=”960″ data-rawheight=”1280″ class=”origin_image zh-lightbox-thumb lazy” width=”960″ data-original=”https://pic1.zhimg.com/v2-1657ac21b70dd426d331c89629afbebf_r.jpg” data-actualsrc=”https://www.hixianchang.com/wp-content/uploads/2018/20180720/T203021.jpg”>
一只已甚…

我当时选的龙猫,看来是龙猫没货了,就给了我一只猫…

前言

不好意思各位,又是python…而且几乎没啥技术含量…

不久前 @神奇的战士 做了一款微信跳一跳的辅助,感觉蛮有趣的。那,我也分享一个自己瞎搞的朴素版 微信小游戏-加减大师 的辅助,因为 Python 快捷,所以也还是采用 Python 实现。与前一个辅助不同的是,程序中的图像处理没用到 opencv,字符识别也没用到机器学习。因为一方面我觉得把用到这里有点大材小用,另一方面即重点是我不会opencv和机器学习啊所。因此整个的实现过程比较朴素,正好和本专栏“朴素维他命”相一致,有趣。

作为本专栏的第二篇文章,下面教程部分我就直接从 readme 文件中抄过来了 _(:з」∠)_

游戏介绍

「加减大师」是腾讯推出的一款微信小游戏,玩法极其简单,它要求玩家在指定时间内判断等式的对错,答对40道就算挑战成功,可以赢取娃娃。 游戏界面如下图

辅助效果展示

https://www.zhihu.com/video/975842081831305216

准备工作

  • 一部安卓手机并安装了最新版本的微信
  • 一台PC并安装了Python3

具体操作

  • 配置 ADB,注意 Windows 系统需另装 ADB 驱动并将可执行文件加入到环境变量 Path 中。这一步是为了后面连接电脑并投屏。
  • 下载/克隆代码到本地
    $ git clone https://github.com/clouduan/WechatGameAutoPlayer.git
  • 安装所需的包
    $ sudo pip3 install -r requirements.txt
  • ADB 传输太慢了,直接在手机上操作的话,无法对付最后几题的速度之快,于是采用投屏大法。

    .将手机调到第一题界面,用投屏软件将手机画面投到电脑上。这里推荐使用 Vysor,目前提供 Windows/MacOSX 客户端和 Chrome 应用,推荐使用 Chrome 应用。好处是跨平台而且方便。

    .先用相关软件测量包含等式的矩形区域的坐标(左上角的xy值和右下角的xy值),以及 √ 或 × 区域的坐标值,并填入 Config.py 中的相应位置。所用的工具 Windows 上推荐用系统自带画图软件,Linux 可以用 Gimp。矩形区域的选取很重要,可以参考下图标记的区域:

” data-caption=”” data-size=”normal” data-rawwidth=”1302″ data-rawheight=”768″ class=”origin_image zh-lightbox-thumb lazy” width=”1302″ data-original=”https://pic1.zhimg.com/v2-3008c731828c6490d759efd4caea3cb5_r.jpg” data-actualsrc=”https://www.hixianchang.com/wp-content/uploads/2018/20180720/T203033.jpg”>
  • 运行 AutoPlayer.py 即可。我在一加三手机上测试通过,拿到了娃娃…

特别说明:以上我只在我个人电脑和个人手机上测试过,诸位使用时可能需要自己慢慢调相关参数,而且投屏的清晰度一定要保证,否则会失败的。祝各位拿到娃娃(

实现原理

简要说下实现原理吧,很朴素(Naive)的…

  • 截图:在电脑上对手机等式区域截图,速度很快,极大减小耗时。
  • 字符识别:字符识别没有采用普遍的机器学习方法,而是采用一种叫感知哈希算法(PHA)的相似图片匹配法。详情可以看我的另一项目 CaptchaRecognizer ,有利用其识别验证码的实现,不过效果很渣,只有55%的正确率。具体做法简述如下:

    .先二值化图像,然后横向分割为两部分,再对每一部分进行纵向分割,得到单个字符。

    .分割的算法也蛮简单粗暴的,就是将像素在竖直/水平方向累加,找累加值的间断处标记分割。

    .将每个字符图片用一种特定的 hash 函数计算 hash 值,与预先储存的该字符的 hash 值比对(计算汉明距离),汉明距离最小的项所对应的即是该字符的值。

  • 判断:得到所有字符后,将其顺序连接还原为等式,用 eval() 判断对错,进行点击。
  • 点击:根据判断结果点击电脑界面的 √ 或 ×,而投屏软件竟然几乎可以和手机实现同步,不可思议…

后记

记录一下遇到的坑吧…什么这么简单的东西还有坑?确是有的。 最开始是某天晚上,室友在玩加减大师的时候突然说:“ddl,这东西可不可以弄个自动识别啊?”我一听,想了想说:“可以是可以,不过估计要费时间,我期中考完再弄或者暑假再说吧”。室友哦了一声,显然对我的回答颇感失望。

然而话是这么说,当天晚上我躺在床上就在想具体该怎么实现这个:其实只需要截屏+识别+点击就搞定了?…第二天吃完晚饭,我背了电脑就去了新图3楼,随便找了个有电源插座的地方开始做这个,闭馆前弄出了最初版本,调完 bug,正式运行的时候才发现不对劲:前面36道题顺利通过,第37题题目给的时间突然变短,程序运行比较慢,来不及反应就给我挂掉了,详情可以看我录的这个视频。我才发现 ADB 的传输速度太慢了,截屏和点击超级延迟——这是硬伤没法修复,算了开个 Issue 吧,再加个 help wanted,于是这东西被我暂时搁置起来。

过了几天,竟然有兄弟学校的学长在我 issue下面留言说他也在做这个,并且遇到了同样的问题,问我有没有解决办法。我说我要弃坑了,腾讯套路真深,而且马上准备期中考试了_(:з」∠)_。

考试的前两天,他告诉我说找到了一种可行的方法——投屏到电脑,电脑模拟点击,并且亲测成功!虽然很想马上试试,不过我还是耐着性子熬完了考试。

终于考完试了!!!我立马用他的方法,并且重构了代码,发现投屏几乎可以实时响应!于是就拿到了娃娃…

不过我一直好奇,投屏软件为什么能做到那么快,对这个问题感兴趣的可以看看我的这个提问。

最后,挂上 GitHub 地址吧,有问题欢迎交流。

我的

clouduan/WechatGameAutoPlayergithub.com

还有学长的

1033020837/WechatGameScriptgithub.com

如果觉得有趣,可以给个 赞/star … 各位玩得开心 _(:з」∠)_

相关新闻