工作路上偶尔玩下微信Jump一Jump,无奈对时间无感,实际得分一直徘徊不前,碎片之余看到了一篇python辅助Jump一Jump技术帖,按照该帖操作,可行故mark过程。
硬件说明:
- 台式计算机:ubuntu系统
- android 7.1手机:1080*1920
python版本及支持库说明:
- Python 3.6.1
- matplotlib (2.1.2):可通过pip list | grep mat -i查看
- PIL: Pillow (5.0.0)
PS: Windows系统也是可以的,相关环境的配置推荐参考:在同一台电脑上同时安装Python2和Python3
实现思路
- 通过adb截图命令截取Jump一Jump界面保存,并通过adb push命令保存到电脑端
- 用PIL打开截图图片,用matplotlib显示截图并绑定对截图的鼠标点击事件
- 记录鼠标点击的起跳起点和终点坐标,计算两点间距离
- 通过两点距离适配出需在手机屏幕上按下的时间值,然后通过adb发送按键事件
- 重复1~4步骤
实现代码
import os
import math
import matplotlib.pyplot as plt
from PIL import Image
class JumpJump:
def __init__(self):
#两点距离乘以该系统得到需按下的时间
self.coefficient = 1.36
#记录点下的次数
self.click_counts = 0
#记录点下的坐标数组,里面保存的元祖是X,Y坐标值
self.coords = []
def screenshot(self):
#截图保存到sdcard
os.system('adb shell screencap -p /sdcard/screenshot.png')
#截图图片pull到当前文件所在目录
os.system('adb pull /sdcard/screenshot.png .')
def onClick(self, event):
#保存点击x,y坐标
self.coords.append((event.xdata, event.ydata))
self.click_counts += 1
if self.click_counts == 2:
#如果点击两次,次数归零并取出两点坐标数据计算两点距离
self.click_counts = 0
next = self.coords.pop()
pre = self.coords.pop()
distance = math.sqrt((next[0] - pre[0])**2 + (next[1] - pre[1])**2)
self.jumpToNext(distance)
def jumpToNext(self, distance):
#距离乘以系数即为按下时间值
pressTime = int(distance * self.coefficient)
#发送滑动事件,滑动时间为pressTime
cmd = 'adb shell input swipe 100 100 200 200 {}'.format(pressTime)
print(cmd)
os.system(cmd)
def run(self):
while True:
self.screenshot()
self.screenshot()
#可通过dir(plt)查看该模块所有属性,通过help(plt.figure)查看方法介绍
figure = plt.figure()
figure.canvas.mpl_connect('button_press_event', self.onClick)
img = Image.open('screenshot.png')
#print(type(img))
plt.imshow(img)
plt.show()
if __name__=='__main__':
jump = JumpJump()
jump.run()
保存该JumpJump.py文件,cd到该py文件所在目录,然后python JumpJump.py, 接着会显示Jump一Jump截图,用鼠标先后点击起跳点和终点位置,点完后就自动跳到终点位置了,如果跳的距离不合理,可适配coefficient值直至合理。
总结
mark该帖主要是加深学习adb命令,同时了解matplotlib、PIL库的使用,一句话仅供学习,谨慎使用。