最近迷上了微信跳一跳小游戏,正好也看到知乎上有大神分享了技术贴,我也参考了好多资料,原理就是通过abd命令截取图片,python计算两个点距离,然后转化按压时间,让电脑来完成游戏。我花了很长时间才把程序跑起来,作为一名技术小白我谈谈自己的认识,尽量让大家少走弯路。
先贴上大神的github地址:https://github.com/wangshub/wechat_jump_game
准备工具
- abd驱动
- 安卓手机
- 打开手机调试模式
- usb线连接好手机与电脑
实现原理
- 获取手机实时截图
- 点击起始位置与落地位置
- 计算两个点距离
- 计算按压时间
- 发送按压指令
- 重新刷新手机截图
我用的python版本是 3.6 开发环境是pycharm,首先下载abd驱动,在pc上通过命令模式操作手机。
下载好后配置环境变量,右键此电脑-高级系统设置-环境变量-Path
或者直接在abd所在的文件夹shift右键打开cmd
在cmd窗口中输入abd
然后有一些库需要提前下载好:matplotlib, PIL, numpy
我之前下载的anaconda自带这些库
获取手机截图:
os.system('adb shell screencap -p /sdcard/screen.png')#手机获取实时截图 os.system('adb pull /sdcard/screen.png')#PC端获取截图
通过numpy转化成多维数组进行图片绘制:
numpy.array(PIL.Image.open('screen.png'))
贴一份完整代码
1 # -*- coding: utf-8 -*- 2 import os 3 import time 4 import numpy,PIL 5 import matplotlib.pyplot as plt 6 from matplotlib.animation import FuncAnimation 7 8 need_update = True 9 10 def get_screen_image(): 11 os.system('adb shell screencap -p /sdcard/screen.png') 12 os.system('adb pull /sdcard/screen.png') 13 return numpy.array(PIL.Image.open('screen.png')) 14 15 def jump(point1, point2): 16 x1, y1 = point1; x2, y2 = point2 17 dis = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5 18 os.system('adb shell input swipe 320 410 320 410 {}'.format(int(dis * 1.35)))#抓包获取(坐标、1.35是单位按压时间) 19 20 def on_click(event, coor = []):#点击事件的坐标位置 21 coor.append((event.xdata, event.ydata)) 22 if len(coor) == 2:#单击2次开始计算 23 jump(coor.pop(), coor.pop()) 24 need_update = True 25 26 def update_screen(frame): 27 global need_update 28 if need_update: 29 time.sleep(1) 30 axes_image.set_array(get_screen_image())#更新图片 31 need_ipdate = False 32 return axes_image, 33 34 figure = plt.figure()#创建空白对象 35 axes_image = plt.imshow(get_screen_image(), animated = True)#把获取的图片画在坐标轴 36 figure.canvas.mpl_connect('button_press_event', on_click)#单击回调函数(传递的是对象不是参数!!) 37 ani = FuncAnimation(figure, update_screen, interval = 50, blit = True) #刷新图片、时间50ms 38 plt.show()
手机连接pc一定要打开usb调试!!!!一加5t 关于手机-狂点版本号 在开发者选项中打开usb调试,什么?你说其他手机打开方式?百度吧!
最后贴几张图 ( ͡° ͜ʖ ͡°)✧
无奈分数如果太高是会上传失败的,谁有解决办法可一定要告诉我啊~