用UIAutomator2写个“手机助手”:自动抢红包、定时打卡、清理后台(Python脚本分享)
用Python玩转手机自动化UIAutomator2实战指南手机早已成为现代人不可或缺的数字器官但每天重复的点击、滑动操作是否让你感到厌倦Python开发者们现在可以用代码解放双手了UIAutomator2这个强大的Android自动化工具能让你像操控木偶一样精准控制手机——自动抢红包、定时打卡、清理后台这些只是基础操作。1. 环境搭建与基础配置工欲善其事必先利其器。在开始编写自动化脚本前我们需要完成环境搭建。不同于传统测试框架的复杂配置UIAutomator2的安装过程异常简单。首先确保你的开发环境满足以下条件Python 3.6或更高版本Android设备系统版本4.4以上已配置好ADB环境变量安装核心库只需一行命令pip install --pre uiautomator2接着在设备端安装必要的服务组件import uiautomator2 as u2 # 自动安装设备端服务 u2.init()提示如果安装过程缓慢可以添加--mirror参数使用国内镜像源加速连接设备有两种方式根据实际场景选择连接方式优点缺点适用场景USB连接稳定可靠需要数据线固定办公环境WiFi连接无线自由需同局域网移动办公场景# USB连接示例 d u2.connect(设备序列号) # WiFi连接示例 d u2.connect(192.168.1.100)安装可视化元素定位工具Weditor它能像Chrome开发者工具一样实时查看手机界面元素pip install -U weditor weditor --shortcut # 创建桌面快捷方式2. 核心操作从点击到手势掌握UIAutomator2的核心操作方法是编写自动化脚本的基础。与传统基于坐标的点击不同UIAutomator2提供了更智能的元素定位方式。2.1 六种元素定位策略文本定位d(text设置)资源ID定位d(resourceIdcom.xx.app:id/btn)描述文本定位d(description搜索按钮)类名定位d(classNameandroid.widget.Button)XPath定位d.xpath(//Button[text确定])坐标定位d.click(x, y)实际项目中推荐优先使用资源ID定位它具有最佳稳定性和性能。示例代码# 点击微信发现页的朋友圈按钮 d(resourceIdcom.tencent.mm:id/cns, text朋友圈).click()2.2 常用交互操作基础点击.click()长按操作.long_click()滑动操作.swipe(start_x, start_y, end_x, end_y)文本输入.set_text(内容)等待元素.wait(timeout10)手势操作示例# 九宫格解锁图案 d.swipe_points([(0.3,0.3), (0.6,0.3), (0.6,0.6)], duration0.2) # 双指缩放 d(text地图).pinch_in() # 缩小 d(text地图).pinch_out() # 放大注意部分手势操作需要Android 4.3以上系统支持3. 实战案例生活效率工具开发理论足够后让我们开发几个真正实用的自动化工具。这些脚本可以直接集成到Tasker等自动化应用中打造你的私人手机助手。3.1 微信自动抢红包抢红包脚本需要考虑几个关键点红包消息识别防封号策略通知栏监控import time def watch_red_packet(): while True: # 监控通知栏 if d.open_notification().text.contains(微信红包): d.click(500, 100) # 点击通知 # 进入聊天界面后识别红包 packet d(textContains微信红包) if packet.exists: packet.click() d(resourceIdcom.tencent.mm:id/c2m).click() # 开红包 d.press(back) # 返回 time.sleep(2) # 每2秒检查一次3.2 应用定时签到许多应用需要每日签到获取积分以下是一个通用签到脚本框架def daily_check_in(app_package): d.app_start(app_package) time.sleep(3) # 等待应用加载 # 尝试多种定位方式点击签到按钮 sign_btn None for locator in [ {text: 签到}, {text: 每日签到}, {description: 签到按钮}, {resourceId: f{app_package}:id/sign_in} ]: if d(**locator).exists: d(**locator).click() break d.app_stop(app_package)3.3 智能后台清理内存优化脚本可以自动关闭耗电应用保留指定应用def clean_background(whitelist[]): d.press(recent) # 打开最近任务 time.sleep(1) # 滑动清除所有非白名单应用 while True: apps d(classNameandroid.widget.FrameLayout) if not apps.exists: break current apps.info[text] if current and current not in whitelist: d.swipe(800, 400, 100, 400) # 右滑清除 else: d.swipe(500, 1200, 500, 400) # 上滑查看下一个 time.sleep(0.5)4. 高级技巧与性能优化当脚本复杂度增加时需要考虑代码结构和执行效率问题。以下是几个提升脚本质量的关键技巧。4.1 异常处理与重试机制自动化操作难免会遇到元素加载慢等情况健壮的脚本需要包含错误处理from retrying import retry retry(stop_max_attempt_number3, wait_fixed2000) def safe_click(element): if not element.exists(timeout2): raise Exception(元素未找到) element.click() # 使用示例 try: safe_click(d(text确定)) except Exception as e: print(f操作失败: {str(e)}) d.screenshot(error.jpg) # 保存错误截图4.2 图像识别辅助对于难以定位的元素可以结合OpenCV进行图像识别import cv2 import numpy as np def find_image_and_click(template_path): screen d.screenshot(formatopencv) template cv2.imread(template_path) res cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc cv2.minMaxLoc(res) if max_val 0.8: # 相似度阈值 x, y max_loc w, h template.shape[1], template.shape[0] d.click(x w//2, y h//2) # 点击中心位置 return True return False4.3 性能优化技巧减少截图操作截图传输耗时尽量避免频繁调用使用缓存定位重复使用的元素对象可以缓存合理设置等待避免固定sleep多用wait方法批量操作多个操作尽量一次脚本完成优化前后对比示例# 优化前 for _ in range(10): d(text下一页).click() time.sleep(1) # 优化后 page d(text下一页) for _ in range(10): page.wait(timeout3).click()在实际项目中我习惯将常用操作封装成独立模块。比如创建一个mobile_toolkit.py包含各种经过验证的可靠操作这样主脚本可以保持简洁同时复用核心功能。