旧博文,搬到 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 的密码。囧!
这里要注意,只需要两个文件就行了,不用跟着做到最后。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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<-ServerURLHere
192.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
如果这一步碰到了安装问题,解决就好。
接下来,就是见证奇迹的时刻:
确保以下事情:
python3 wechat_jump_auto_iOS.py
你会很开心的!!!
这里要注意的事情:
这里有个动图可以看一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbz5jSx5-1599141572084)(http://o8fj2jbwb.bkt.clouddn.com/wechat.gif)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8sOyArS-1599141572096)(/images/bi2.png)]
轻轻松松跑到900多分后,高兴后,想向我女朋友装个逼,结果一问,她说你是 81 分啊,我一脸懵逼,然后跑到 github 上才看到,原来大家早就在讨论了,有可能被腾讯反作弊了,或者分数异常没有提交成功。好吧,后来试了一些办法,目前能成功保存到排行榜上的分数是 659 分。
总的来说,为了成功装逼,需要程序做的一件事就是尽量模拟真人,具体来说:
具体来说是修改 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))
逼应该是装成功了,还是挺开心的呢!
我觉得某件事有个点能吸引到你,让你投入其中做一些探索、研究,这是一件很好的事情。因为毕竟是因为有趣吸引了你啊,事情就是因为让你感到有趣,才让你有了动力!
另外,回顾整个过程,其实也不难,甚至很简单,但简单的事情不是每个人都可以做到!告诫自己,不要眼高手低,很多事没有想像中那么让你不屑一顾!
这让我又想起了开头提到的老罗的话,确实,知识这个东西,更多的是过程中你的收获和体验,那些才是你珍贵的财富!
说到这,我想起了一个问题,怎样来定义一个人?比如你自己,假如哪天你突然失忆了,忘记了以前发生过的所有事情。那么对于你身边的人来说,你还是你吗?
这个答案估计很不一样,我觉得是:你已经不是你了,那些称之为 “你” 的符号、烙印早已消失,那是时间的雕刻啊!每个时间点上时间对你的雕刻,那些才构成了一个个你,如果抹掉所有这些雕刻,你早已不是你了。
可见,过程显得多么重要!
继续刷分,目前能让好友能看到的最高分是 659,看能不能接近 1000 分!
洗洗睡吧,现在都凌晨 02:20 了!逼不停,探索不停!