文章目录
- 前言
- 一、系统环境
- 二、使用步骤
- 1.引入库
- 2.电脑连接手机并打开支付宝软件
- 3.aircv图片识别
- 4.收取自己的能量
- 5.跳转到好友能量
- 6.收取好友能量
- 7.能量雨代码求助
- 三、完整代码
- 四、总结
前言
看到网上很多教程上写的都是Python + Appium,但是安装Appium特别麻烦,还需版本匹配,我当初找了很多教程和资料,费了九牛二虎之力才搞定,而且每次要运行代码,还得先运行"Appium"这个软件,使用起来十分的繁琐。
今天我要介绍的控制方式是python库 : uiautomator2,该库安装简单,也能基本实现对手机的控制。缺点就是需要在手机上安装一个软件,不过该软件是代码运行时自动安装的,也不麻烦。
资料参考:
uiautomator2安装,连接手机,weditor手机界面元素分析教程
一、系统环境
python3.7
Windows10 x64
所需python库:
pip install time
pip install aircv
pip install uiautomator2
二、使用步骤
1.引入库
代码如下:
import uiautomator2 as u2
import time
import aircv as ac
"""
华为手机接入说明:
1、在手机拨号界面,输入字符:*#*#2846579#*#*-》选择后台设置-》USB端口设置-》生产模式
2、手机启动USB调试
3、电脑打开cmd窗口,输入“adb devices”,返回“8KE0219628016134 device”,表示电脑和手机链接成功
"""
2.电脑连接手机并打开支付宝软件
1、没用过uiautomator2 这个库,不会使用手机界面UI分析工具“weditor”的朋友可以参考以下连接资料
uiautomator2安装,连接手机,weditor手机界面元素分析教程 2、weditor连接手机
注解:
- 手机型号,电脑成功连接手机后,可通过电脑cmd窗口,输入“adb devices”指令获取。
- Connect后面有个小草图标就说明手机已连接。
- 需要刷新界面和手机同步时,切换到实时模式,需要分析APP界面UI内容时,切换到静态模式。
- 鼠标点击“蚂蚁森林”文字,查看该控件属性。
- 展示点击的控件UI属性。
- 该控件的文字索引,我们可以通过查找“text” == “蚂蚁森林”的方式来找到该控件。
- 该支付宝软件的代码名称,我们可以通过这个名字让代码找到支付宝软件并启动。
3、代码如下:
phone_client = u2.connect() # 有线连接,手机需要插电脑上,第一次需要有线连接,会在手机上安装ATX软件
# phone_client = u2.connect("8KE0219628016134") # 通过无线连接,电脑和手机需要在同一个局域网内(手机上IP可通过ATX软件进行查看),
# 并且需要先用有线的方式做过初始化
print("打开支付宝")
phone_client.app_start("com.eg.android.AlipayGphone")
time.sleep(3) ## 休眠2s等待支付宝完全启动
print("打开蚂蚁森林,等待2s……")
phone_client(text="蚂蚁森林").click() # 支付宝中需要将蚂蚁森林加入到支付宝首页
time.sleep(3) ## 可以等待几秒钟,进入蚂蚁森林后还需要几秒钟才能完全加载完
3.aircv图片识别
代码如下:
import aircv as ac
'''
图像查找,
imgsrc:原始图像
imgobj:需要查找的图像
confidencevalue:查找的最低匹配相似度,默认值为0.5,该值可能会导致很大的匹配错误,建议0.8~0.9
返回值:如果成功找到,则返回需要查找的图片在原始图片中的中心坐标,如果没有找到,则返回空,
'''
def matchImg(imgsrc, imgobj, confidencevalue=0.5): # imgsrc=原始图像,imgobj=待查找的图片
imsrc = ac.imread(imgsrc)
imobj = ac.imread(imgobj)
# 图像查找,如果成功找到,则返回在原始图片中的信息,如果没有找到,则返回空
match_result = ac.find_template(imsrc, imobj,
confidencevalue) # {'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)}
# if match_result is not None:
# 获取需要查找的图片在原始图片中的中心坐标
# match_result['shape'] = (imsrc.shape[1], imsrc.shape[0]) # 0为高,1为宽
return match_result
# 查找图片,查找成功,返回坐标,查找失败返回0,0
def find_view(imgfile, find_imgfile):
confidencevalue = 0.6 # 定义查找的相似度
position = matchImg(imgfile, find_imgfile, confidencevalue) # 用第一步的方法,实际就是find_template()方法
if position != None:
x, y = position['result']
# print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print("能量坐标", x, ' : ', y)
return x, y
return 0, 0
4.收取自己的能量
1、用weditor分析软件界面
注解:
该界面的能量球无法识别出独立的控件,它整个区域是一个View控件
这个时候就需要用图片识别的方式
2、获取“可收取的能量”图标
- 将主界面截图,分析所有可收取的能量相同点,可收取能量和不可收取能量的不同点,由此发现可收取的能量都会出现“xxg”,而不可收取的能量是“剩余时间”,由于能量多少克是不可控的,所以我们只单独识别“g”这个图标。
- 用画图软件,将“g”图标保存下来
- 利用该图标去界面查找,代码如下:
imgfile_main = 'main.png'
# “g”图标
imgfile_g = 'g_button.png'
# 将当前界面截图,并保存到imgfile_main
phone_client.screenshot().save(imgfile_main)
# 在当前界面查找可收取的能量图标
x, y = find_view(imgfile_main, imgfile_g)
# 在能量可能出现的地方点击,画一个可点击范围
if 1000 > x > 50 and 950 > y > 480:
# 点击可收取的能量收取
phone_client.click(x, y)
time.sleep(0.2)
5.跳转到好友能量
1、用weditor分析找能量
注解:
4. 找能量无法通过之前的文本方式查找,它一整块都是View控件,
5. 该控件的UI属性。
6. 该控件在该界面的xpth路径,我们可以通过该路径找到这个控件,并获取相关信息
分析:我们可以通过xpath找到该View控件,并获取该控件的右下角坐标,因为“找能量”按键在该控件右下角附近,所以通过简单计算就可以准确点击“找能量”按键。
2、代码如下:
ant_forest = phone_client.xpath("//*[@resource-id='J_tree_dialog_wrap']").get().bounds
phone_client.click(1000, ant_forest[3] - 80) # 找能量按钮的坐标
6.收取好友能量
1、用weditor分析好友能量
注解:
- 可收取能量球,由于该界面的能量球不是单一的控件,而是一整个View,所以只能通过图标识别方式查找能量球。
- “可收取”文字是可收取能量的一个标志。
- “小抓手”图标是可收取能量的一个标志,该图标比“可收取”文字识别起来更容易一点,所以选择该图标为可收取的标志。
- 用画图软件把“小抓手”保存下来。
2、代码如下:
imgfile_main = 'main.png'
# 抓手图标
imgfile_ok = 'ok_button.png'
# 将当前界面截图,并保存到imgfile_main
phone_client.screenshot().save(imgfile_main)
# 如果是别人的能量树,则识别“抓手”
x, y = find_view(imgfile_main, imgfile_ok)
# 在能量可能出现的地方点击,画一个可点击范围
if 1000 > x > 50 and 950 > y > 480:
# 因为我们识别的抓手图标在能量球的右下方,所以要计算一下能量球中心点
phone_client.click(x - 60, y - 80)
time.sleep(0.2)
7.能量雨代码求助
1、用weditor分析开启能量雨
注解:由图中可以看出,可以通过“text” == “立即开启”识别当前是否要开启能量雨。
2、代码如下:
if phone_client(text="立即开启"):
phone_client(text="立即开启").click()
print("green_power_rain start")
3、用weditor分析能量雨收取
能量雨由于下降速度过快,数量较多所以不管是图片识别能量图标,或者是划定一块区域,快速点击,都无法实现该功能。只能留遗憾在这里了,希望有朋友能做出这个功能,把方法写在评论区,感谢了。
三、完整代码
import uiautomator2 as u2
import time
import aircv as ac
"""
华为手机接入说明:
1、在手机拨号界面,输入字符:*#*#2846579#*#*-》选择后台设置-》USB端口设置-》生产模式
2、手机启动USB调试
3、电脑打开cmd窗口,输入“adb devices”,返回“8KE0219628016134 device”,表示链接成功
"""
'''
图像查找,
imgsrc:原始图像
imgobj:需要查找的图像
confidencevalue:查找的最低匹配相似度,默认值为0.5,该值可能会导致很大的匹配错误,建议0.8~0.9
返回值:如果成功找到,则返回需要查找的图片在原始图片中的中心坐标,如果没有找到,则返回空,
'''
def matchImg(imgsrc, imgobj, confidencevalue=0.5): # imgsrc=原始图像,imgobj=待查找的图片
imsrc = ac.imread(imgsrc)
imobj = ac.imread(imgobj)
# 图像查找,如果成功找到,则返回在原始图片中的信息,如果没有找到,则返回空
match_result = ac.find_template(imsrc, imobj,
confidencevalue) # {'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)}
# if match_result is not None:
# 获取需要查找的图片在原始图片中的中心坐标
# match_result['shape'] = (imsrc.shape[1], imsrc.shape[0]) # 0为高,1为宽
return match_result
# 查找图片,查找成功,返回坐标,查找失败返回0,0
def find_view(imgfile, find_imgfile):
confidencevalue = 0.6 # 定义查找的相似度
position = matchImg(imgfile, find_imgfile, confidencevalue) # 用第一步的方法,实际就是find_template()方法
if position != None:
x, y = position['result']
# print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print("能量坐标", x, ' : ', y)
return x, y
return 0, 0
def zfbAntforest():
phone_client = u2.connect() # 有线连接,手机需要插电脑上,第一次需要有线连接,会在手机上安装ATX软件
# phone_client = u2.connect("8KE0219628016134") # 通过无线连接,电脑和手机需要在同一个局域网内(手机上IP可通过ATX软件进行查看),
# 并且需要先用有线的方式做过初始化
print("打开支付宝")
phone_client.app_start("com.eg.android.AlipayGphone")
time.sleep(3) ## 休眠2s等待支付宝完全启动
print("打开蚂蚁森林,等待2s……")
phone_client(text="蚂蚁森林").click() # 支付宝中需要将蚂蚁森林加入到支付宝首页
time.sleep(3) ## 可以等待几秒钟,进入蚂蚁森林后还需要几秒钟才能完全加载完
# 能量雨处理
def green_power_rain():
imgfile_main = 'main.png'
# 抓手图标
imgfile_green_button = 'green_button.png'
while True:
if 0:
# 开始扫描点击有能力出现的区域
y = 1500
for x in range(50, 1050, 150):
phone_client.click(x, y)
# 如果页面出现了“恭喜获得”说明已经没有能量可偷了,结束
if phone_client(text="恭喜获得"):
print("恭喜获得")
return
else:
phone_client.screenshot().save(imgfile_main)
x, y = find_view(imgfile_main, imgfile_green_button)
if x != 0 and y != 0:
phone_client.click(x, y + 100)
else:
# 如果页面出现了“恭喜获得”说明已经没有能量可偷了,结束
if phone_client(text="恭喜获得"):
print("恭喜获得")
return
# 已成熟能量识别并收取
def collectEnergy(cnt):
print("开始第{}次偷能量!".format(cnt))
imgfile_main = 'main.png'
# 抓手图标
imgfile_ok = 'ok_button.png'
# “g”图标
imgfile_g = 'g_button.png'
count_out = 20
while True:
phone_client.screenshot().save(imgfile_main)
if cnt == 1:
# 如果是第一次进来,是自己的能量树,则识别“g”,因为这个界面没有“抓手”
x, y = find_view(imgfile_main, imgfile_g)
else:
# 如果是别人的能量树,则识别“抓手”
x, y = find_view(imgfile_main, imgfile_ok)
# 在能量可能出现的地方点击,画一个可点击范围
if 1000 > x > 50 and 950 > y > 480:
if cnt == 1:
phone_client.click(x, y)
else:
# 因为我们识别的抓手图标在能量球的右下方,所以要计算一下能量球中心点
phone_client.click(x - 60, y - 80)
time.sleep(0.2)
else:
break
# 最多20次,避免卡死,死循环在里面
count_out -= 1
if count_out == 0:
break
cnt = 1
while True:
collectEnergy(cnt)
ant_forest = phone_client.xpath("//*[@resource-id='J_tree_dialog_wrap']").get().bounds
phone_client.click(1000, ant_forest[3] - 80) # 找能量按钮的坐标
## 如果页面出现了“返回我的森林”说明已经没有能量可偷了,结束
if phone_client(text="返回我的森林"):
phone_client(text="返回我的森林").click()
break
# 检测到能量雨开启提示
if phone_client(text="立即开启"):
if 0:
# 能量雨代码,无法使用
phone_client(text="立即开启").click()
print("green_power_rain start")
green_power_rain()
break
else:
break
cnt += 1
print("###结束,本次共偷取 ", cnt, " 位好友的能量###")
phone_client.app_stop("com.eg.android.AlipayGphone") # 退出支付宝
if __name__ == '__main__':
while True:
try:
zfbAntforest()
except Exception as e:
print("Error:{}".format(e))
# 休眠一个小时,继续偷取能量
time.sleep(3600)
四、总结
该代码通过uiautomator2识别控件加图片识别方式,实现了定时收取自己的能量和偷取别人的蚂蚁森林绿色能量。缺点就是没能实现能量雨的收取,希望有谁能实现这个功能并留言。