学python之微信跳一跳手动工具版

此工具只用于学习交流使用,侵权删。

利用python写一个脚本,精确控制跳的距离。

用到的模块:

import os
import time
import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from PIL import Image

os用于执行adb命令,来控制手机

time用于延时

random生成随机数,用来随机生成触摸的坐标

numpy是数学库,用来处理图像数组

matplotlib用来画图

PIL是python的图片库,用来处理图片

def get_phone_info():
	print ('check devices')
	print (os.popen("adb devices").read())
	print ('screen:')
	print (os.popen('adb shell wm size').read())
	print ('density:')
	print (os.popen('adb shell wm density').read())
	print ('ddetail:')
	print (os.popen('adb shell getprop ro.product.device').read())
	print ('os:')
	print (os.popen('adb shell getprop ro.build.version.release').read())

os.popen会创建一个管道,其参数是平台的命令,这里用到了adb命令。调用read方法可以将命令执行的结果读出。这里读取了手机的设备信息、屏幕尺寸、像素密度、版本号等。

def pull_screenshot():
	print ('screencap')
	os.system('adb shell screencap -p /sdcard/autojump.png')
	print('get png')
	os.system('adb pull /sdcard/autojump.png .')

os.system与popen功能类似,但是不会返回执行的信息,仅仅用来调用执行平台的命令。这里执行了截屏和上传图片的命令,这两个命令我们不关心执行的返回信息,所以用os.system比较合适。

def jump(distance):
    press_time = distance * 1.35
    press_time = int(press_time)
    x1=740+random.randint(-20,20)
    y1=1500+random.randint(-20,20)
    x2=750+random.randint(-20,20)
    y2=1510+random.randint(-20,20)
    cmd = 'adb shell input swipe {} {} {} {} '.format(x1,y1,x2,y2) + str(press_time)
    print(cmd)
    os.system(cmd)	

这个函数用来计算触摸坐标和触摸时间。触摸时间与距离相关,这个玩过跳一跳的都知道,大概是时间(ms)是距离(像素)的1.35倍。使用random.randint(a,b)生成一个随机的整数,这个整数的范围是a到b,这样最终得到的坐标就是随机的(目的是不要老是按同一个地方,不符合人的行为)。adb shell input swipe是长按滑动命令,5个参数分别是起始x、y,终点x、y已经按压时间。之后调用os.system将命令发下去。

下面的三个函数都相当于回调函数,对应不同的事件执行不同的任务。

update = True
def updatefig(*args):
	global update
	global im
	if update:
		pull_screenshot()
		img=np.array(Image.open('autojump.png'))
		im = plt.imshow(img, animated=True)
		update = False
	return im,

update用来确认是否更新显示。图片是动态刷新的,此函数执行定期被执行一次,如果update是False,则依旧显示上一次的图片,如果是True,则调用pull_screenshot()获取新的图片。Image.open(path)打开图片,参数是图片的路径;np.array(a)将a数组化,plt.imshow(img)将数组化的图片放到显示缓冲区,下一次刷新就可以将图片显示出来。

cord=[]
def on_click(event):
	global cord
	global update
	cor = (event.xdata,event.ydata)
	cord.append(cor)
	if len(cord)==2:
		cord1=cord.pop()
		cord2=cord.pop()
		distance = ((cord1[0]-cord2[0])**2+(cord1[1]-cord2[1])**2)**0.5
		print (distance)
		jump(distance)
		time.sleep(0.5)
		update=True

此函数是鼠标点击回调函数,鼠标点击后将坐标保存在cord中,如果cord中有两个坐标,就计算出两个点之间的距离,之后调用jump执行跳跃。执行完跳跃后需要等一会,至少等0.5s,否则新的图片还没准备好。此时需要新的图片,所以update置位True。

def on_key_press(event):
	global update
	print ('get key {}'.format(event.key))
	cord.clear()
	if event.key == 'r':
		update=True

此函数是键盘点击回调函数,目前主要是清除坐标和更新图片,按任意键清除坐标,按r更新图片。(matsplot有内置的命令,比如q会退出,所以这些命令不能用)

if __name__=='__main__':
    get_phone_info()
    fig = plt.figure()
    fig.canvas.mpl_connect('button_press_event', on_click)
    fig.canvas.mpl_connect('key_press_event', on_key_press)
    ani = animation.FuncAnimation(fig, updatefig, interval=50, blit=True)
    plt.show()

脚本主函数,首先获得手机信息,创建一个figure,fig.canvas.mpl_connect()用来关联事件和回调函数,事件如下所示。 animation.FuncAnimation创建动画,fig是显示的figure,updatefig是回调函数,interval是帧间隔,blit选择更新所有点,还是仅更新产生变化的点,应选择True。plt.show()显示,会block,底层调用的是tkinter库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值