旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/08/wechat_jump_hack/
最近新版微信的『跳一跳』小程序着实火了一把,也把小程序这个概念再次推波助澜了一波,看来以后小程序这个入口会有大作为。
张小龙:一个好的 APP 应该是用完即走的。
这句话对用户来说是个好消息,对其他创业者来说却可能会招来恶语相向。现在这个时代的步伐越来越快,大家好像都很忙,时间越来越珍贵。如果以后微信真的把小程序这个入口做好了,我觉得对于用户来说,是件好事,当然前提是做好了,比如安全性啥的,比如不会被外挂啥的!
现在中午,吃完饭没事大家都会高呼 “来一波!来一波!”,就是微信小游戏『坦克大战』,3V3 玩得不亦乐乎!
废话不多说,看着别人微信跳一跳几百分那么高的分,感觉坐不住了,为了装逼,所以有了这篇博文!
林夕水共是我,这是目前能让好友看到的最高分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kaw92Kg2-1599141572052)(/images/bi.png)]
说明:本人的原始目的虽然是为了装逼,但其实是本着一起探讨技术、一起学习、一起 hack 的心态来折腾这些的。所以对于某些人在某宝上花钱买外挂来刷分的行为表示不齿,不要为了装逼而装逼!
其实刚开始知道有外挂刷分的时候,并且朋友圈也有转了好几篇关于微信跳一跳可以辅助刷分的文章时,我当时的表情就是,“哦,高分原来是这样”,然后一脸不屑,你是否也跟我一样的表情当时? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gb3PNTzJ-1599141572058)(/images/wechatsoso.png)]
可是,如果是你去做,哪怕按部就班的来做,你能做好吗?
这就是 “眼高手低”,其实很多时候,你看到的和你做过的是两回事。前几天翻出罗振宇2016年跨年演讲,他讲到他想做『得到』APP 的初衷就是希望做一个翰林院,可以把好的东西告诉身为皇帝的我们,因为我们不知道什么好什么不好,我们好多时候需要的是粗暴的对待,需要你直接告诉我结果,哪些是好的不就完了吗?这种有别于类似微博、今日头条这种根据你的口味来推荐的 “母爱算法”,也就是 “父爱算法”。
话没错,我也同意,但忽略了一个东西,每个人的接受能力不同,而且知识这种东西往往不是结果,更多的是过程,过程中获得的东西可能比结果更有价值和意义。用到这里,你看到了那么多篇揭秘跳一跳外挂的文章,你就懂了吗?你就可以不屑一顾了吗?
你以为不过如此,其实中间的波折可能把你弄成一个傻逼!所谓:
绝知此事要躬行
写这篇博文之前没有接触过安卓、IOS 开发,所以 Debug 移动设备上的程序(游戏、APP),相对来说会感觉困难一点。所以折腾这个跳一跳,真的还是挺折腾的!
过程中可能会有很多问题,当时也没来得及做记录,所以仅记录一些能想起来的问题吧!
首先,可以先大概看一下教你用 Python 来玩微信跳一跳 这篇文章,作者(@神器的战士)很厉害,他已经把跳一跳辅助 wechat_jump_game 传到 github 上了,话不多说,按照 Wiki 里的步骤开干。
由于我的设备是 MacOs + iPhone ,故第一步是得安装一个 WebDriverAgent,这个东西我简单理解就是一个 WebServer 驱动,可以远程控制 IOS 设备。类似于安卓里的 ADB 工具。可以参考这篇文章:iOS 真机如何安装 WebDriverAgent。
照着操作,没毛病!当然前提是你得安装好了 xcode,没有的话直接在 AppStore 里搜索 xcode 就行。然后后面就是一路的坑。
什么是证书?什么是苹果开发者账号?有没有免费的苹果开发者账号?账号和证书啥关系?免费的证书和收费的证书一样吗?…由于是 IOS 开发小白,这些概念都不懂,所以走了很多弯路,因为照着 iOS 真机如何安装 WebDriverAgent 这篇文章中的步骤操作,预料之中没有那么容易就成功。后来有网友说其实不用开发者账号,有个证书就行,某宝上买一个就行,然后就去某宝上搜索了半天,完全不懂,最后花 19 元买了一个证书,如下图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYZkNdCh-1599141572060)(/images/taobao.png)]
怀着忐忑的心,导入项目中,测试,然后果然也没通过!当然这里反复试了很多次,Google 了很多次,试过了很多能搜到的办法,依然没通过!看来是必须花 99$ 去买一个个人开发者账号了,不然这次装不了这个逼了,心中有点凉了半截了!因为我不想花几百块钱就为了装一次逼!
然后依然是 Google,偶然发现说 “其实真机调试不必花钱买个人开发者账号的,现在 xcode 已经很开放了,可以使用个人的账号(也就是你的 AppleID)升级为免费开发者账号”。没说的,低头就是干!
我使用了用来登录手机的 AppleID 做签名,然后依然是不通过,这里就不放图了。你得自己去亲自操作,自己去踩坑。到这里,心凉的差不多了!离我装逼的目标越来越远了!
感谢伟大的 Google,让我看到了这篇文章 【新功能】免99美金开发者账号真机调试测试教程,有啥说的呢?跟着干啊!
这里强烈建议重新申请一个 AppleID,单独用来做这个操作,因为后面需要用到 AppleID 的密码,为了安全,不要使用用来登录手机的那个 AppleID。我就傻逼的用了自己登录手机的 AppleID,后来要用这个 AppleID 登录软件,执行一些操作,才发现这样不安全,所以赶紧重新申请了个新的 AppleID,然后重新更改了原来 AppleID 的密码。囧!
这里要注意,只需要两个文件就行了,不用跟着做到最后。
申请ios测试证书(p12)申请ios描述文件(mobileprovision)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZNApPvS-1599141572064)(/images/p12.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mGZdFwLL-1599141572066)(/images/mobile.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D4FGdOh7-1599141572070)(/images/p12mobile.png)]
到这里,可以很开心继续之前的操作了,拿到项目中,导入进行证书签名,然后又他么失败了,GG!!
好吧,最后试了一下,需要更改 WebDriverAgentRunner Bundle Identifiler,随便加个后缀,比如我加了 “.s6”: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oNJgfXQA-1599141572073)(/images/s6.png)]
WebDriverAgentLib 的 Bundle Identifiler不用更改。
所以最终的 xocde 中关键地方有以下几处:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4WV6QEve-1599141572074)(/images/corea.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PeYqfdQy-1599141572076)(/images/core2.png)]
然后插上数据线,开始编译测试。这里可能会碰到很多问题,不过别着急,慢慢来,一个个解决。
碰到的问题现在回过头来已经没办法复现了,所以只能说,别着急,按照步骤来,碰到问题多 Google,反正最终编译安装成功后是这个样子的:
2018-01-09 00:57:01.343909+0800 WebDriverAgentRunner-Runner[858:330642] +[CATransaction synchronize] called within transaction 2018-01-09 00:57:01.367036+0800 WebDriverAgentRunner-Runner[858:330642] Running tests... 2018-01-09 00:57:02.340279+0800 WebDriverAgentRunner-Runner[858:330642] Continuing to run tests in the background with task ID 1 Test Suite 'All tests' started at 2018-01-09 00:57:03.064 Test Suite 'WebDriverAgentRunner.xctest' started at 2018-01-09 00:57:03.065 Test Suite 'UITestingUITests' started at 2018-01-09 00:57:03.066 Test Case '-[UITestingUITests testRunner]' started. t = 0.00s Start Test at 2018-01-09 00:57:03.067 t = 0.00s Set Up 2018-01-09 00:57:03.098235+0800 WebDriverAgentRunner-Runner[858:330642] Built at Jan 8 2018 17:00:55 2018-01-09 00:57:03.131709+0800 WebDriverAgentRunner-Runner[858:330642] ServerURLHere->http://192.168.0.101:8100<-ServerURLHere这是通过如下操作看到的: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pecTbikL-1599141572079)(/images/console.png)]
其中比较关键的控制台日志是:
ServerURLHere->http://192.168.0.101:8100<-ServerURLHere192.168.0.101 就是 iPhone 设备的 ip 地址了。另外,手机上会有一个 WebDriverAgent App安装上。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CtvvYoUw-1599141572081)(/images/iphoneweb.png)]
到这里基本可以证明 WebDriverAgent 安装成功了。为了进一步验证,可以参考iOS 真机如何安装 WebDriverAgent中关于端口转发一节。其中:
brew install imobiledevice可能会出现下面的问题:
# brew install imobiledevice Error: No available formula with the name "imobiledevice" ==> Searching for a previously deleted formula (in the last month)... Error: No previously deleted formula found. ==> Searching for similarly named formulae... ==> Searching local taps... This similarly named formula was found: libimobiledevice ✔ To install it, run: brew install libimobiledevice ✔ ==> Searching taps... ==> Searching taps on GitHub... Error: No formulae found in taps.按照提示来:
brew install libimobiledevice成功后,执行命令:
iproxy 8100 8100然后访问:
http://localhost:8100/status如果看到类似下面的 json 输出说明 WDA 运行成功了:
{ "value" : { "state" : "success", "os" : { "name" : "iOS", "version" : "11.2.1" }, "ios" : { "simulatorVersion" : "11.2.1", "ip" : "192.168.0.101" }, "build" : { "time" : "Jan 8 2018 17:00:58" } }, "sessionId" : "7E3A6F32-F529-4C42-9C65-3EF92FD993C6", "status" : 0 }几番波折,终于安装好了 WDA,这过程中就可能碰到很多问题,就有可能让你放弃!好在我运气还不错,走到了这里,但这离装逼还很远!
真机安装 WDA 可谓一波三折,好在现在终于可以玩游戏了。
废话不多说,当然首先下载 wechat_jump_game:
git clone https://github.com/wangshub/wechat_jump_game cd wechat_jump_game这里推荐用虚拟环境(Virtualenv && python3 )来管理,不然你会碰到很多问题:
virtualenv venv source venv/bin/active然后执行:
pip install -r requirements.txt如果这一步碰到了安装问题,解决就好。
接下来,就是见证奇迹的时刻:
确保以下事情:
WDA 运行成功启动 iproxy 8100 8100 命令手机页面到微信跳一跳开始界面 然后运行(当然前提还是跟着项目 Wiki 去做): python3 wechat_jump_auto_iOS.py你会很开心的!!!
这里要注意的事情:
config.json 中参数 “press_coefficient” 设置成 1.32 跳一跳精确度较高(only for iPhone 7Plus)可以先跑一下手动版的,再上自动版的这里有个动图可以看一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbz5jSx5-1599141572084)(http://o8fj2jbwb.bkt.clouddn.com/wechat.gif)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8sOyArS-1599141572096)(/images/bi2.png)]
轻轻松松跑到900多分后,高兴后,想向我女朋友装个逼,结果一问,她说你是 81 分啊,我一脸懵逼,然后跑到 github 上才看到,原来大家早就在讨论了,有可能被腾讯反作弊了,或者分数异常没有提交成功。好吧,后来试了一些办法,目前能成功保存到排行榜上的分数是 659 分。
总的来说,为了成功装逼,需要程序做的一件事就是尽量模拟真人,具体来说:
WDA 工具按压屏幕的点不要固定,尽量有个随机偏移具体来说是修改 jump 函数:
s.tap_hold(random.uniform(100, 400), random.uniform(100, 400), press_time) 每跳一次延时一段时间,不要固定,尽量有随机偏移具体来说,main 函数 while 循环中:
time.sleep(random.uniform(1, 2.2)) 不要连续跳,可以跳记下,停一段时间再跳具体可以参考 wechat_jump_auto.py 这个脚本,这个脚本是对于 Android 设备的。
def main(): i, next_rest, next_rest_time = (0, random.randrange(3, 10), random.randrange(5, 10)) while True: pull_screenshot() im = Image.open("/images/1.png") # 获取棋子和 board 的位置 piece_x, piece_y, board_x, board_y = find_piece_and_board(im) ts = int(time.time()) print(ts, piece_x, piece_y, board_x, board_y) if piece_x == 0: return set_button_position(im) distance = math.sqrt( (board_x - piece_x) ** 2 + (board_y - piece_y) ** 2) jump(distance) save_debug_creenshot(ts, im, piece_x, piece_y, board_x, board_y) backup_screenshot(ts) im.close() i += 1 #这里设置跳几下停几秒,防止 ban if i == next_rest: print('已经连续打了 {} 下,休息 {}s'.format(i, next_rest_time)) for j in range(next_rest_time): print("程序将在 {}s 后继续".format(next_rest_time - j)) time.sleep(1) print('\n继续') i, next_rest, next_rest_time = (0, random.randrange(10, 30), random.randrange(10, 20)) print('下一次连续跳 {} 休息,下一次将休息 {}s'.format(next_rest, next_rest_time)) # 为了保证截图的时候应落稳了,多延迟一会儿,随机值防 ban print("\n") time.sleep(random.uniform(1, 2.2)) 最好不要超过 1000 分,适可而止,逼装成功就行了跑到一段时间,小人总会掉落,而且两个棋盘越近,跳跃精确度越低,算法可以再改进…逼应该是装成功了,还是挺开心的呢!
我觉得某件事有个点能吸引到你,让你投入其中做一些探索、研究,这是一件很好的事情。因为毕竟是因为有趣吸引了你啊,事情就是因为让你感到有趣,才让你有了动力!
另外,回顾整个过程,其实也不难,甚至很简单,但简单的事情不是每个人都可以做到!告诫自己,不要眼高手低,很多事没有想像中那么让你不屑一顾!
这让我又想起了开头提到的老罗的话,确实,知识这个东西,更多的是过程中你的收获和体验,那些才是你珍贵的财富!
说到这,我想起了一个问题,怎样来定义一个人?比如你自己,假如哪天你突然失忆了,忘记了以前发生过的所有事情。那么对于你身边的人来说,你还是你吗?
这个答案估计很不一样,我觉得是:你已经不是你了,那些称之为 “你” 的符号、烙印早已消失,那是时间的雕刻啊!每个时间点上时间对你的雕刻,那些才构成了一个个你,如果抹掉所有这些雕刻,你早已不是你了。
可见,过程显得多么重要!
继续刷分,目前能让好友能看到的最高分是 659,看能不能接近 1000 分!
洗洗睡吧,现在都凌晨 02:20 了!逼不停,探索不停!