微信跳一跳高分辅助踩坑

最近挺火的微信跳一跳

最近新版微信的『跳一跳』小程序着实火了一把,也把小程序这个概念再次推波助澜了一波,看来以后小程序这个入口会有大作为。

张小龙:一个好的 APP 应该是用完即走的。

这句话对用户来说是个好消息,对其他创业者来说却可能会招来恶语相向。现在这个时代的步伐越来越快,大家好像都很忙,时间越来越珍贵。如果以后微信真的把小程序这个入口做好了,我觉得对于用户来说,是件好事,当然前提是做好了,比如安全性啥的,比如不会被外挂啥的!

现在中午,吃完饭没事大家都会高呼 “来一波!来一波!”,就是微信小游戏『坦克大战』,3V3 玩得不亦乐乎!

废话不多说,看着别人微信跳一跳几百分那么高的分,感觉坐不住了,为了装逼,所以有了这篇博文!

林夕水共是我,这是目前能让好友看到的最高分

踩完所有坑写的一个简单的说明

说明一

说明:本人的原始目的虽然是为了装逼,但其实是本着一起探讨技术、一起学习、一起 hack 的心态来折腾这些的。所以对于某些人在某宝上花钱买外挂来刷分的行为表示不齿,不要为了装逼而装逼!

其实刚开始知道有外挂刷分的时候,并且朋友圈也有转了好几篇关于微信跳一跳可以辅助刷分的文章时,我当时的表情就是,”哦,高分原来是这样”,然后一脸不屑,你是否也跟我一样的表情当时?

可是,如果是你去做,哪怕按部就班的来做,你能做好吗?

这就是 “眼高手低”,其实很多时候,你看到的和你做过的是两回事。前几天翻出罗振宇2016年跨年演讲,他讲到他想做『得到』APP 的初衷就是希望做一个翰林院,可以把好的东西告诉身为皇帝的我们,因为我们不知道什么好什么不好,我们好多时候需要的是粗暴的对待,需要你直接告诉我结果,哪些是好的不就完了吗?这种有别于类似微博、今日头条这种根据你的口味来推荐的 “母爱算法”,也就是 “父爱算法”。

话没错,我也同意,但忽略了一个东西,每个人的接受能力不同,而且知识这种东西往往不是结果,更多的是过程,过程中获得的东西可能比结果更有价值和意义。用到这里,你看到了那么多篇揭秘跳一跳外挂的文章,你就懂了吗?你就可以不屑一顾了吗?

你以为不过如此,其实中间的波折可能把你弄成一个傻逼!所谓:

绝知此事要躬行

说明二

  • 我的技能:C++、Python等
  • 我的设备:Mac Pro && iPhone 7Plus

写这篇博文之前没有接触过安卓、IOS 开发,所以 Debug 移动设备上的程序(游戏、APP),相对来说会感觉困难一点。所以折腾这个跳一跳,真的还是挺折腾的!

开始吧

过程中可能会有很多问题,当时也没来得及做记录,所以仅记录一些能想起来的问题吧!

安装 WDA

首先,可以先大概看一下教你用 Python 来玩微信跳一跳 这篇文章,作者(@神器的战士)很厉害,他已经把跳一跳辅助 wechat_jump_game 传到 github 上了,话不多说,按照 Wiki 里的步骤开干。

由于我的设备是 MacOs + iPhone ,故第一步是得安装一个 WebDriverAgent,这个东西我简单理解就是一个 WebServer 驱动,可以远程控制 IOS 设备。类似于安卓里的 ADB 工具。可以参考这篇文章:iOS 真机如何安装 WebDriverAgent

照着操作,没毛病!当然前提是你得安装好了 xcode,没有的话直接在 AppStore 里搜索 xcode 就行。然后后面就是一路的坑。

  • 什么是证书?
  • 什么是苹果开发者账号?
  • 有没有免费的苹果开发者账号?
  • 账号和证书啥关系?
  • 免费的证书和收费的证书一样吗?

由于是 IOS 开发小白,这些概念都不懂,所以走了很多弯路,因为照着 iOS 真机如何安装 WebDriverAgent 这篇文章中的步骤操作,预料之中没有那么容易就成功。后来有网友说其实不用开发者账号,有个证书就行,某宝上买一个就行,然后就去某宝上搜索了半天,完全不懂,最后花 19 元买了一个证书,如下图:

怀着忐忑的心,导入项目中,测试,然后果然也没通过!当然这里反复试了很多次,Google 了很多次,试过了很多能搜到的办法,依然没通过!看来是必须花 99$ 去买一个个人开发者账号了,不然这次装不了这个逼了,心中有点凉了半截了!因为我不想花几百块钱就为了装一次逼!

然后依然是 Google,偶然发现说 “其实真机调试不必花钱买个人开发者账号的,现在 xcode 已经很开放了,可以使用个人的账号(也就是你的 AppleID)升级为免费开发者账号”。没说的,低头就是干!

我使用了用来登录手机的 AppleID 做签名,然后依然是不通过,这里就不放图了。你得自己去亲自操作,自己去踩坑。到这里,心凉的差不多了!离我装逼的目标越来越远了!

感谢伟大的 Google,让我看到了这篇文章 【新功能】免99美金开发者账号真机调试测试教程,有啥说的呢?跟着干啊!

这里强烈建议重新申请一个 AppleID,单独用来做这个操作,因为后面需要用到 AppleID 的密码,为了安全,不要使用用来登录手机的那个 AppleID。我就傻逼的用了自己登录手机的 AppleID,后来要用这个 AppleID 登录软件,执行一些操作,才发现这样不安全,所以赶紧重新申请了个新的 AppleID,然后重新更改了原来 AppleID 的密码。囧!

这里要注意,只需要两个文件就行了,不用跟着做到最后。

  • 申请ios测试证书(p12)
  • 申请ios描述文件(mobileprovision)



到这里,可以很开心继续之前的操作了,拿到项目中,导入进行证书签名,然后又他么失败了,GG!!

好吧,最后试了一下,需要更改 WebDriverAgentRunner Bundle Identifiler,随便加个后缀,比如我加了 “.s6”:

WebDriverAgentLib 的 Bundle Identifiler不用更改。

所以最终的 xocde 中关键地方有以下几处:


然后插上数据线,开始编译测试。这里可能会碰到很多问题,不过别着急,慢慢来,一个个解决。

碰到的问题现在回过头来已经没办法复现了,所以只能说,别着急,按照步骤来,碰到问题多 Google,反正最终编译安装成功后是这个样子的:

1
2
3
4
5
6
7
8
9
10
11
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

这是通过如下操作看到的:

其中比较关键的控制台日志是:

1
ServerURLHere->http://192.168.0.101:8100<-ServerURLHere

192.168.0.101 就是 iPhone 设备的 ip 地址了。另外,手机上会有一个 WebDriverAgent App安装上。

到这里基本可以证明 WebDriverAgent 安装成功了。为了进一步验证,可以参考iOS 真机如何安装 WebDriverAgent中关于端口转发一节。其中:

1
brew install imobiledevice

可能会出现下面的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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.

按照提示来:

1
brew install libimobiledevice

成功后,执行命令:

1
iproxy 8100 8100

然后访问:

1
http://localhost:8100/status

如果看到类似下面的 json 输出说明 WDA 运行成功了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"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

1
2
git clone https://github.com/wangshub/wechat_jump_game 
cd wechat_jump_game

这里推荐用虚拟环境(Virtualenv && python3 )来管理,不然你会碰到很多问题:

1
2
virtualenv venv
source venv/bin/active

然后执行:

1
pip install -r requirements.txt

如果这一步碰到了安装问题,解决就好。

接下来,就是见证奇迹的时刻:

确保以下事情:

  • WDA 运行成功
  • 启动 iproxy 8100 8100 命令
  • 手机页面到微信跳一跳开始界面
    然后运行(当然前提还是跟着项目 Wiki 去做):
1
python3 wechat_jump_auto_iOS.py

你会很开心的!!!

这里要注意的事情:

  • config.json 中参数 “press_coefficient” 设置成 1.32 跳一跳精确度较高(only for iPhone 7Plus)
  • 可以先跑一下手动版的,再上自动版的

这里有个动图可以看一下


后续

轻轻松松跑到900多分后,高兴后,想向我女朋友装个逼,结果一问,她说你是 81 分啊,我一脸懵逼,然后跑到 github 上才看到,原来大家早就在讨论了,有可能被腾讯反作弊了,或者分数异常没有提交成功。好吧,后来试了一些办法,目前能成功保存到排行榜上的分数是 659 分。

总的来说,为了成功装逼,需要程序做的一件事就是尽量模拟真人,具体来说:

  • WDA 工具按压屏幕的点不要固定,尽量有个随机偏移

具体来说是修改 jump 函数:

1
s.tap_hold(random.uniform(100, 400), random.uniform(100, 400), press_time)
  • 每跳一次延时一段时间,不要固定,尽量有随机偏移

具体来说,main 函数 while 循环中:

1
time.sleep(random.uniform(1, 2.2))
  • 不要连续跳,可以跳记下,停一段时间再跳

具体可以参考 wechat_jump_auto.py 这个脚本,这个脚本是对于 Android 设备的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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 了!逼不停,探索不停!

参考

buy me a cola!

欢迎关注我的其它发布渠道