用u2写一个实况足球图像识别自动化脚本(3)

在之前的代码中,主要注重了项目内容和功能的迭代,而忽视了对计算机算力及内存的消耗,并且可能出现长时间运转后无法响应的问题,最新版代码为v4.0版本,v3.0主要为ui的更新,并未在CSDN上同步。

代码未经允许不可私自分享,最终所有权归作者所有!


目录

一、项目概述

二、核心架构

三、设备管理模块 (device.py)

四、图像识别模块 (scanner.py)

五、任务执行模块 (tasks.py)

六、工具函数模块 (utils.py)

七、GUI界面模块

八、关键技术点总结

九、运行效果展示

总结


一、项目概述

本项目是一个基于uiautomator2Android 自动化游戏脚本,主要用于 Efootball(实况足球)游戏的日常任务自动化。

项目版本:v4.0,重构版,相比v3.0的主要改进:

  • 代码结构:重新调整模块化,使得模块清晰可见
  • 配置管理:从硬编码改为JSON外置
  • 图像识别:优化选择算法,增加识别休眠状态
  • 日志系统:从print改为logging模块
  • 错误处理:增加完善的重试机制

二、核心架构

项目采用模块化设计,分为以下核心模块:

|--------|-----------------|----------|
| 模块 | 文件名 | 功能说明 |
| 核心模块 | core/device.py | 设备连接管理 |
| 核心模块 | core/scanner.py | 图像识别 |
| 核心模块 | core/tasks.py | 任务执行 |
| 核心模块 | core/utils.py | 工具函数 |
| 界面模块 | ui/* | GUI界面 |

三、设备管理模块 (device.py)

设备管理模块采用 单例模式,确保全局只有一个设备管理器实例。

复制代码
class DeviceManager:
    """设备管理器(单例模式)"""
    
    _instance = None
    _lock = Lock()
    _devices: Dict[str, u2.Device] = {}
    
    def __new__(cls):
        if cls._instance is None:
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
        return cls._instance
  • 关键功能:
  • get_device(): 获取设备连接,带健康检查
  • _health_check(): 检查设备连接是否正常
  • disconnect(): 断开设备连接
  • get_device_info(): 获取设备详细信息

四、图像识别模块 (scanner.py)

图像识别模块是脚本的核心,提供四种扫描器:

  • ImageScanner: 基础模板匹配,支持缓存
  • MultiScaleScanner: 多尺度匹配,提高鲁棒性
  • AsyncScanner: 异步扫描,并行处理多模板
  • FeatureScanner: SIFT/ORB特征点匹配

【代码示例】模板匹配核心逻辑:

复制代码
def locate_image(self, screenshot, template_path, threshold=0.8):
    # 1. 加载模板(带缓存)
    template = self.load_template(template_path)
    
    # 2. 截图转灰度
    screenshot_gray = cv2.cvtColor(screenshot, cv2.COLOR_RGB2GRAY)
    
    # 3. 模板匹配
    result = cv2.matchTemplate(screenshot_gray, template, cv2.TM_CCOEFF_NORMED)
    _, max_val, _, max_loc = cv2.minMaxLoc(result)
    
    # 4. 返回匹配结果
    if max_val >= threshold:
        return MatchResult(found=True, position=(x, y), confidence=max_val)
    return MatchResult(found=False)

【代码示例】多尺度匹配核心逻辑:

复制代码
def locate_image(self, screenshot, template_path, threshold=0.8):
    template = self.load_template(template_path)
    best_result = MatchResult(found=False)
    
    # 遍历多个缩放比例
    for scale in self.scales:  # [0.8, 0.9, 1.0, 1.1, 1.2]
        resized = cv2.resize(template, (0, 0), fx=scale, fy=scale)
        result = cv2.matchTemplate(screenshot_gray, resized, cv2.TM_CCOEFF_NORMED)
        
        if max_val > best_result.confidence and max_val >= threshold:
            best_result = MatchResult(...)
    
    return best_result

五、任务执行模块 (tasks.py)

任务执行模块负责自动化流程的控制,包含三个核心类:

  • TaskConfig: 任务配置数据类
  • TaskConfigManager: 配置文件管理器
  • TaskRunner: 任务执行器

【代码示例】TaskConfig 数据类:

复制代码
@dataclass
class TaskConfig:
    id: int              # 任务ID
    name: str            # 任务名称
    folder: str          # 图像文件夹
    threshold: float     # 匹配阈值 (0.0-1.0)
    mode: str            # 执行模式 (break/nobreak)
    device_id: str       # 设备ID
    scan_interval: float # 扫描间隔
    click_delay: float   # 点击延迟

【代码示例】TaskRunner 核心循环:

复制代码
def run(self, config, on_found, on_click):
    # 指数退避参数
    base_interval = 0.5
    max_interval = 3.0
    consecutive_miss = 0
    
    while not self.is_stopped():
        screenshot = device.screenshot()
        
        # 扫描所有模板
        for image_file in image_files:
            result = self.scanner.locate_image(screenshot, image_path, threshold)
            
            if result.found:
                on_found(result.template_name, result.position)
                device.click(result.position)
                consecutive_miss = 0
                break
        
        # 指数退避等待
        consecutive_miss += 1
        if consecutive_miss >= 4:
            time.sleep(10)  # 休眠
        else:
            time.sleep(current_interval)
            current_interval = min(current_interval * 2, max_interval)

核心亮点:

  • 指数退避:连续未匹配时等待时间翻倍,避免CPU空转
  • 休眠机制:连续多次未匹配后进入休眠,节省资源
  • 可中断:支持随时停止任务
  • 可暂停:支持暂停/恢复任务

六、工具函数模块 (utils.py)

工具函数模块提供通用的辅助功能:

  • setup_logger(): 配置日志记录器(文件+控制台)
  • @retry: 重试装饰器,支持自定义异常类型和回调
  • @measure_time: 计时装饰器
  • Timer: 计时器上下文管理器
  • Singleton: 单例元类

【代码示例】@retry 重试装饰器:

复制代码
@retry(max_attempts=3, delay=1.0, exceptions=(ConnectionError,))
def connect_device(device_id):
    """设备连接失败自动重试"""
    return u2.connect(device_id)

# 使用示例
device = connect_device("emulator-5554")

七、GUI界面模块

GUI模块使用 PySide6构建,包含:

  • main_window.py: 主窗口界面
  • worker.py: 后台任务工作线程(QThread)
  • ui_form.py: Qt Designer生成的界面
  • back_rc.py: 资源文件编译结果

【代码示例】TaskWorker 工作线程:

复制代码
class TaskWorker(QThread):
    """后台执行自动化任务"""
    
    status_changed = Signal(str)
    progress = Signal(int, int)
    error = Signal(str)
    
    def run(self):
        # 在后台线程执行任务
        self.runner = TaskRunner(scanner, DeviceManager)
        self.runner.run(config, on_found=self._on_found)
    
    def _on_found(self, template_name, position):
        # 发送信号到主线程更新UI
        self.status_changed.emit(f"找到: {template_name}")

八、关键技术点总结

本项目涉及的关键技术点:

  • **单例模式:**确保设备管理器全局唯一,避免重复连接
  • **线程安全:**使用Lock保护共享资源,支持多线程并发
  • **模板缓存:**避免重复加载图像,提升识别速度
  • **多尺度匹配:**适应不同分辨率和屏幕尺寸
  • **指数退避:**智能调整扫描频率,平衡响应速度与资源消耗
  • **信号槽机制:**PySide6线程间通信,解耦UI与业务逻辑
  • **上下文管理器:**Timer简化耗时统计

九、运行效果展示

程序运行后会显示如下界面:

【界面功能说明】

  • 任务列表:显示所有可用的自动化任务
  • 设备状态:显示当前连接的Android设备
  • 开始/停止:控制任务执行
  • 日志输出:实时显示识别结果和操作记录

【运行截图】

【日志输出示例】

2026-04-04 09:00:00 [INFO] automation - 设备 emulator-5554 连接成功

2026-04-04 09:00:01 [INFO] automation - 开始执行任务: 积分赛

2026-04-04 09:00:02 [INFO] automation - 找到目标: 10.png @ (540, 960), 置信度: 0.95

2026-04-04 09:00:03 [INFO] automation - 点击成功: (540, 960)

2026-04-04 09:00:05 [INFO] automation - 找到目标: 20.png @ (320, 540), 置信度: 0.92

总结

本项目展示了如何使用Python实现Android自动化脚本,主要亮点:

  • 模块化设计:代码结构清晰,易于维护和扩展
  • 多种图像识别算法:可根据场景选择最优方案
  • 完善的错误处理:指数退避+休眠机制确保稳定性
  • 友好的GUI:PySide6实现的图形界面便于操作
  • 配置外置:JSON格式配置,无需修改代码即可调整任务

源码已上传,欢迎交流学习!

【项目文件结构】

jiaoben3/

├── main.py # 主入口

├── core/ # 核心模块

│ ├── device.py # 设备管理(96行)

│ ├── scanner.py # 图像识别(320行)

│ ├── tasks.py # 任务执行(320行)

│ └── utils.py # 工具函数(140行)

├── ui/ # GUI模块

├── config/ # 配置文件

│ └── tasks.json # 16种任务配置

└── images_*/ # 各任务模板图像

相关推荐
arvin_xiaoting5 小时前
OpenClaw学习总结_III_自动化系统_3:CronJobs详解
数据库·学习·自动化
智算菩萨5 小时前
【Pygame】第8章 文字渲染与字体系统(支持中文字体)
开发语言·python·pygame
:mnong5 小时前
全图纸语义理解升级分析
python·openvino·paddleocr·qt6.3·paddleocr-vl
qh0526wy5 小时前
pathlib 核心功能一览
python
Hello eveybody6 小时前
PyCharm性能调优避坑录
python·pycharm
arvin_xiaoting6 小时前
OpenClaw学习总结_III_自动化系统_2:Webhooks详解
运维·学习·自动化
¥-oriented6 小时前
【Python桌面应用开发环境搭建指南】
开发语言·python
项目管理小胡6 小时前
2026年项目管理工具选型指南:功能对比、适用场景与避坑建议
java·python·安全·团队开发·个人开发
雷帝木木6 小时前
Python 数据库 ORM 实战:SQLAlchemy 详解
人工智能·python·深度学习·机器学习