Python+uiautomator2定时偷取蚂蚁森林好友能量


前言

看到网上很多教程上写的都是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连接手机
支付宝主界面
注解:

  1. 手机型号,电脑成功连接手机后,可通过电脑cmd窗口,输入“adb devices”指令获取。
  2. Connect后面有个小草图标就说明手机已连接。
  3. 需要刷新界面和手机同步时,切换到实时模式,需要分析APP界面UI内容时,切换到静态模式。
  4. 鼠标点击“蚂蚁森林”文字,查看该控件属性。
  5. 展示点击的控件UI属性。
  6. 该控件的文字索引,我们可以通过查找“text” == “蚂蚁森林”的方式来找到该控件。
  7. 该支付宝软件的代码名称,我们可以通过这个名字让代码找到支付宝软件并启动。

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、获取“可收取的能量”图标

  1. 将主界面截图,分析所有可收取的能量相同点,可收取能量和不可收取能量的不同点,由此发现可收取的能量都会出现“xxg”,而不可收取的能量是“剩余时间”,由于能量多少克是不可控的,所以我们只单独识别“g”这个图标。
  2. 用画图软件,将“g”图标保存下来可收取能量图标
  3. 利用该图标去界面查找,代码如下:
	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分析好友能量
收取好友能量
注解:

  1. 可收取能量球,由于该界面的能量球不是单一的控件,而是一整个View,所以只能通过图标识别方式查找能量球。
  2. “可收取”文字是可收取能量的一个标志。
  3. “小抓手”图标是可收取能量的一个标志,该图标比“可收取”文字识别起来更容易一点,所以选择该图标为可收取的标志。
  4. 用画图软件把“小抓手”保存下来。小抓手

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识别控件加图片识别方式,实现了定时收取自己的能量和偷取别人的蚂蚁森林绿色能量。缺点就是没能实现能量雨的收取,希望有谁能实现这个功能并留言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值