
在游戏里每天手动跑图采集资源确实是一件重复性很高的苦差事。尤其是《无尽冬日》这类生存建造游戏木材、铁矿、食物等资源点刷新时间固定路线固定操作模式也固定但就是每天都要花十几分钟甚至更久去点。最近用清源AI平台把这套流程做成自动化采集应用省下来的时间非常可观。这篇文章就结合我的开发过程整理一份完整的“清源AI开发教程”从需求拆分、环境准备到代码实现和排错思路给大家讲清楚整个自动采集应用是怎么从零搭起来的。如果你是第一次接触AI开发或者之前只写过简单的Python脚本这篇文章也完全能跟上。整体方案用到的核心能力是图像识别、坐标定位、定时调度和AI工作流编排并不需要深度介入游戏内部数据。我还会在最后补充常见问题和工程建议帮你减少上线后的翻车概率。1. 自动采集需求与清源AI开发思路1.1 为什么需要自动采集《无尽冬日》的资源采集体系有几个特点决定了它非常适合做自动化。第一资源点位置固定。地图上的木材堆、铁矿脉、食物仓库等采集点刷新位置基本不变。即使有所偏移也是在小范围内浮动。这就给图像识别和坐标定位提供了稳定的前提。第二采集操作高度重复。接近资源点、点击采集、等待读条、再点击丰收、然后切换下一个点这一套流程每天要重复几十次。操作顺序和节奏基本一致很适合写成固定任务流。第三采集时间有规律。资源点被采完后通常会在一定时间后重新刷新。所以不只是“点击采集”这一个动作还需要一套定时轮询机制每隔一段时间去检查哪些点可采。第四人眼盯着屏幕容易疲劳。当你同时要处理游戏聊天、公会任务、活动页面时很容易忘记去收菜。自动化脚本可以保持固定频率巡检不会漏。自动采集要解决的不是“能不能采”而是“怎么稳定地采、怎么不重复采、怎么在异常情况下降级处理”。这几个问题光靠简单的“每隔十分钟点一下”的脚本是解决不了的需要结合图像识别和AI调度逻辑。1.2 清源AI开发平台定位清源AI是一个面向开发者的AI应用开发平台核心思路是把大模型能力、工具调用能力和业务流程编排结合起来。你可以把它理解成一个“AI应用工厂”你定义这个应用要完成什么目标你给AI配置可调用的工具模块比如图像识别、按键模拟、日志记录AI根据你编写的规则或自动规划的工作流完成对应的调度和异常处理应用可以复用、可以分享也能作为后续其他自动化任务的底座。在自动采集场景里清源AI充当的是“大脑”的角色。传统写死逻辑的脚本是if-else套到底遇到界面弹窗、资源点偏移、加载缓慢等情况脚本很容易失效。而基于清源AI的工作流可以让AI根据识别结果做出判断当前画面是什么状态应该执行点击还是等待出现异常时是重试还是跳过。这套思路不只适用于《无尽冬日》。清源AI的开发者生态里还有大量类似的智能体开发教程本质上都是“大模型 工具 业务规则”的组合。学会一个场景就能迁移到日常签到、桌面整理、文件批量处理、网页信息抓取等方向。1.3 自动采集的技术路径自动采集的完整技术链路可以拆成下面几个模块图像采集模块截取当前屏幕画面图像识别模块找到资源点图标所在坐标操作执行模块模拟鼠标移动和点击完成采集交互状态判断模块判断采集是否成功、是否出现弹窗、是否资源未刷新调度模块按设定时间或轮询频率执行任务AI编排模块把上述模块串联起来在异常时动态调整策略。模块之间的关系可以用一个简单的流程描述屏幕截图 - 图像识别 - 是否找到目标 - 是执行点击 - 等待结果 - 记录日志 - 否判断是否超时 - 跳过或重试这里不再展开画图实际编码时我们会把每一步封装成独立函数再交给AI工作流去调用。有一点需要提前声明自动采集方案仅用于个人学习和研究使用前请确认不违反你所在服务器的游戏规则。不要在公共环境中影响其他玩家的正常体验也不要使用任何破解、修改客户端数据的非法手段。我们做的只是“屏幕识别 模拟点击”层面的自动化。2. 环境准备与开发基础2.1 软硬件环境在开始写代码之前先把开发和运行环境讲清楚。本文示例以 Windows 系统为例这是大多数游戏玩家的主力环境也是模拟鼠标键盘操作最方便的平台。开发语言选择 Python版本推荐用 3.9 或更高版本。Python 在图像处理和自动化操作方面都有比较成熟的第三方库生态完善很适合快速实现。涉及的主要依赖库如下库名用途安装命令opencv-python图像识别、模板匹配pip install opencv-pythonpyautogui屏幕截图、鼠标控制pip install pyautoguipillow图像处理辅助pip install pillownumpy图像数据计算pip install numpyapscheduler定时任务调度pip install apschedulerrequestsHTTP 请求后续对接AI服务用pip install requestsloguru日志记录pip install loguru版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。如果你用的是 Python 3.12 或更高版本个别库可能需要升级到最新版安装时注意看提示。IDE 推荐 PyCharm 或者 Visual Studio Code。VS Code 加 Python 插件就够用了轻量启动速度快。2.2 创建清源AI智能体或自动化项目登录清源AI平台后首先在开发者中心创建一个新应用。创建时可以选择应用类型自动采集场景建议选择“智能体应用”或“自动化工作流应用”具体名称以平台当前版本为准。创建之后你会得到一个应用ID和API Key。这两个信息后面在代码里调用AI服务时需要用到注意保存到本地配置文件不要提交到公开代码仓库。清源AI的开发者招募目前也在进行中如果你对这个方向感兴趣可以在文章评论区填写问卷报名。参与开发者计划可以获得更多平台调用额度也能和做智能体开发的同学一起交流踩坑经验。2.3 项目结构规划一个好的项目结构能在后期维护时省下大量时间。我建议按功能模块拆分不要把代码全部堆在一个文件里。下面是一个推荐的目录结构auto_collector/ ├── main.py # 程序入口 ├── config.py # 配置文件 ├── requirements.txt # 依赖清单 ├── modules/ │ ├── __init__.py │ ├── screen.py # 屏幕截图模块 │ ├── vision.py # 图像识别模块 │ ├── operator.py # 鼠标操作模块 │ ├── scheduler.py # 定时调度模块 │ └── ai_service.py # 清源AI服务对接模块 ├── assets/ │ ├── wood.png # 木材资源点模板图 │ ├── iron.png # 铁矿资源点模板图 │ └── food.png # 食物资源点模板图 └── logs/ └── collector.log # 运行日志在真正开始写代码前建议先把资源点模板图准备好。打开游戏截取一张清晰的资源点图标然后用截图工具裁剪成小图保存到 assets 目录。模板图越小越好只要包含资源点的核心特征即可。过大反而会影响匹配速度和准确率。3. 核心原理拆解自动采集的关键模块3.1 屏幕识别与目标定位自动采集的核心难点是程序怎么知道屏幕上哪个位置有资源点。常用的做法是模板匹配。简单来说我们把提前裁剪好的小图模板图放到完整截图里去滑动比对找到相似度最高的位置就认为那里是目标资源点。OpenCV 提供的matchTemplate方法就是干这个事的。下面是最小示例import cv2 import numpy as np # 读取完整截图和模板图 screen cv2.imread(screen.png) template cv2.imread(assets/wood.png) # 模板匹配 result cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) # 获取相似度最高的位置 min_val, max_val, min_loc, max_loc cv2.minMaxLoc(result) # 模板图的左上角坐标即 max_loc top_left max_loc h, w template.shape[:2] center_x top_left[0] w // 2 center_y top_left[1] h // 2 print(f相似度: {max_val:.2f}, 中心点坐标: ({center_x}, {center_y}))这里有几个参数需要解释cv2.TM_CCOEFF_NORMED是归一化相关系数匹配法结果越接近1说明相似度越高minMaxLoc返回结果矩阵中的最大值和最小值位置模板图大小直接决定匹配结果模板越小越容易误匹配模板越大匹配速度越慢。实际开发中我们不能只看最大相似度还要设一个阈值。比如只有相似度大于0.8时才认为找到了目标否则就判定为“当前画面没有该资源点”。3.2 任务调度与状态管理自动采集不能只执行一次而是要长期、定时、反复运行。这里引入定时调度组件。APScheduler 是 Python 里很成熟的调度库。我们可以用它实现两种触发方式固定间隔触发每隔 N 分钟执行一次巡检固定时间触发每天在指定时间点执行采集。推荐使用间隔触发。因为资源刷新时间可能因为服务器活动、在线人数等原因浮动固定时间去采容易漏掉刚刷新的资源。间隔巡检反而更灵活。状态管理是整个系统的重点。建议用一个状态字典保存当前每个资源点的状态resource_status { wood: {last_collect_time: None, status: unknown, fail_count: 0}, iron: {last_collect_time: None, status: unknown, fail_count: 0}, food: {last_collect_time: None, status: unknown, fail_count: 0}, }每个资源点记录上次采集时间、当前状态、连续失败次数。连续失败次数非常重要如果达到一定数值比如3次就要暂停该点采集避免一直重复无效操作。3.3 AI工作流编排清源AI在这个场景中的作用是把上面这些模块按业务逻辑编排起来。传统脚本的流程是固定的但游戏运行过程中会出现各种意外情况突然弹出活动弹窗网络波动导致画面卡住资源点还没有刷新角色被其他玩家攻击。这些情况如果都靠写死逻辑去处理代码会非常庞大。而通过AI工作流我们可以在每次截屏后让AI判断当前画面属于什么状态再决定下一步动作。简单的理解为AI拿到图像识别模块的输入结合我们提供的业务规则输出一个“操作意图”然后由操作模块去执行。4. 完整实战无尽冬日自动采集助手这一节我们从零开始逐步写出完整的自动采集程序。为了让代码能直接跑起来我会把关键文件的完整内容都贴出来。4.1 创建项目结构与配置文件首先创建项目目录并安装依赖。在终端中执行mkdir auto_collector cd auto_collector pip install opencv-python pyautogui pillow numpy apscheduler requests loguru因为依赖库比较多推荐把它们记录到 requirements.txtopencv-python4.8.0 pyautogui0.9.54 pillow10.0.0 numpy1.24.0 apscheduler3.10.0 requests2.31.0 loguru0.7.0接下来编写 config.py把游戏相关配置和清源AI平台配置集中管理# 文件路径auto_collector/config.py # 图像识别相关配置 TEMPLATE_DIR assets MATCH_THRESHOLD 0.8 # 相似度阈值低于该值视为未找到目标 SCAN_INTERVAL 60 # 巡检间隔单位秒 # 清源AI平台配置 AI_APP_ID your_app_id AI_API_KEY your_api_key AI_API_URL https://your-ai-endpoint.example.com/api/workflow # 资源点配置 RESOURCE_POINTS { wood: { template: assets/wood.png, interval: 300, # 预计刷新间隔单位秒 }, iron: { template: assets/iron.png, interval: 600, }, food: { template: assets/food.png, interval: 240, }, } # 日志文件 LOG_FILE logs/collector.log这里需要注意AI_APP_ID和AI_API_KEY需要换成你在清源AI开发者中心创建应用后拿到的真实值。示例中的 URL 只是一个占位说明实际地址以平台文档为准。4.2 编写屏幕截图模块屏幕截图是整个流程的起点。pyautogui 提供了截图功能但为了统一处理我们封装一个 screen.py 模块# 文件路径auto_collector/modules/screen.py import pyautogui import numpy as np import cv2 def capture_screen(): 截取当前主屏幕 :return: 返回 BGR 格式的 OpenCV 图像 # pyautogui.screenshot 返回 PIL Image pil_image pyautogui.screenshot() # 转换为 OpenCV 使用的 BGR 格式 frame cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR) return frame代码解释pyautogui.screenshot() 截取的是全屏画面我们在多显示器环境下默认截取主屏。如果需要指定区域截图可以传 region 参数例如pyautogui.screenshot(region(0, 0, 1920, 1080))。4.3 编写图像识别模块图像识别模块负责在整张截图中寻找资源点模板图。这里需要处理两种结果找到和没找到。同时要返回中心点坐标和相似度。# 文件路径auto_collector/modules/vision.py import cv2 from modules.screen import capture_screen def find_template(template_path, threshold0.8): 在当前屏幕中查找模板图 :param template_path: 模板图路径 :param threshold: 相似度阈值 :return: (是否找到, 中心点x, 中心点y, 相似度) screen capture_screen() template cv2.imread(template_path) if template is None: return False, 0, 0, 0.0 # 模板匹配 result cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc cv2.minMaxLoc(result) if max_val threshold: return False, 0, 0, float(max_val) h, w template.shape[:2] center_x max_loc[0] w // 2 center_y max_loc[1] h // 2 return True, center_x, center_y, float(max_val)这段代码的逻辑很清楚先截图再加载模板然后匹配最后根据阈值决定是否认定找到目标。如果你发现阈值设为0.8时识别不到资源点可以适当降低到0.7测试但阈值太低会导致误点需要自己权衡。4.4 编写鼠标操作模块找到资源点坐标后需要把鼠标移过去并点击。这里封装 operator.py# 文件路径auto_collector/modules/operator.py import time import pyautogui # 每次点击后稍微暂停避免操作过快被游戏判定为异常 CLICK_PAUSE 0.5 def move_and_click(x, y, doubleFalse): 移动鼠标到指定坐标并点击 :param x: 目标点x坐标 :param y: 目标点y坐标 :param double: 是否双击 pyautogui.moveTo(x, y, duration0.3) time.sleep(CLICK_PAUSE) pyautogui.click() if double: time.sleep(CLICK_PAUSE) pyautogui.click() time.sleep(CLICK_PAUSE) def press_key(key): 按键操作比如按 ESC 关闭弹窗 pyautogui.press(key) time.sleep(CLICK_PAUSE)这里的关键设计是每步操作之间都加入了 sleep 延迟。原因很简单游戏客户端对“瞬间完成大量操作”的行为很敏感过快的点击容易被误判为外挂。加入适当的延迟模拟人工操作节奏反而更稳定。4.5 编写清源AI服务对接模块下面到了清源AI平台接入的环节。这个模块的目标是把当前采集状态发送给AI由AI返回下一步操作建议。# 文件路径auto_collector/modules/ai_service.py import requests from config import AI_APP_ID, AI_API_KEY, AI_API_URL def ask_ai_decision(context): 向清源AI发送当前状态获取操作决策 :param context: 包含当前画面状态、各资源点状态等信息的字典 :return: AI返回的决策结果 headers { Content-Type: application/json, X-App-Id: AI_APP_ID, X-Api-Key: AI_API_KEY, } payload { scene: auto_collect, context: context, } try: response requests.post(AI_API_URL, jsonpayload, headersheaders, timeout10) response.raise_for_status() data response.json() return data.get(decision, noop) except requests.RequestException as e: print(f调用清源AI服务失败: {e}) return noop提示ask_ai_decision返回的字符串比如collect_wood、collect_iron、skip、handle_popup等只是示例。实际返回结构需要根据你在清源AI平台上配置的工作流输出为准。如果你刚开始接入也可以先不依赖AI服务直接用规则判断。等基础流程跑通后再接入AI这样排查问题更容易。4.6 编写主控逻辑最后写 main.py把上面的模块串起来。主控逻辑采用“截屏 - 识别 - 决策 - 执行 - 等待”的循环。# 文件路径auto_collector/main.py import time from loguru import logger from config import RESOURCE_POINTS, SCAN_INTERVAL, MATCH_THRESHOLD from modules.vision import find_template from modules.operator import move_and_click, press_key from modules.ai_service import ask_ai_decision # 配置日志 logger.add(logs/collector.log, rotation10 MB, retention7 days) def collect_all(): 执行一轮全量巡检 logger.info(开始新一轮资源巡检) # 保存当前轮次的资源点状态用于AI决策 context {} for name, point in RESOURCE_POINTS.items(): found, x, y, score find_template(point[template], thresholdMATCH_THRESHOLD) context[name] { found: found, x: x, y: y, similarity: round(score, 3), } if found: logger.info(f发现资源点 {name}坐标 ({x}, {y})相似度 {score:.2f}) move_and_click(x, y) # 等待采集动作完成这里预留足够时间 time.sleep(3) # 点击丰收按钮位置需要根据游戏实际界面调整 # 这里仅作示例实际坐标需要自行校准 harvest_btn_x 960 harvest_btn_y 700 move_and_click(harvest_btn_x, harvest_btn_y) else: logger.info(f未发现资源点 {name}本轮跳过) # 将当前状态提交给清源AI做额外判断 decision ask_ai_decision(context) logger.info(f清源AI决策: {decision}) if decision handle_popup: logger.info(检测到可能有弹窗按 ESC 关闭) press_key(esc) logger.info(本轮巡检结束) def main_loop(): 主循环按固定间隔执行巡检 logger.info(自动采集程序启动) while True: try: collect_all() except Exception as e: logger.error(f巡检过程出现异常: {e}) time.sleep(SCAN_INTERVAL) if __name__ __main__: main_loop()这里有两个地方需要你按自己的游戏实际界面校准“丰收按钮”的坐标(960, 700)只是示例值采集点击后的等待时间3秒也需要调整。建议先打开游戏手动把画面停在丰收按钮上方用一个小脚本打印当前鼠标坐标记录下来再填入。4.7 运行与验证代码写完以后先不要直接跑长时间循环。我建议先做一个“单轮验证”python -c from main import collect_all; collect_all()这样只会执行一次巡检不会进入死循环。观察日志输出确认资源点识别坐标是否正确、点击后游戏是否有正确反应。确认单轮没问题后再启动完整程序python main.py预期输出类似2025-01-12 10:00:01.123 | INFO | 自动采集程序启动 2025-01-12 10:00:02.456 | INFO | 开始新一轮资源巡检 2025-01-12 10:00:03.890 | INFO | 发现资源点 wood坐标 (800, 450)相似度 0.91 ...如果连续几轮都能稳定识别和采集说明基础流程已经跑通。5. 常见问题与排查思路开发过程中最容易遇到下面几类问题我把现象、原因和解决思路整理成表格方便你按图索骥。问题现象常见原因解决思路程序启动后立即闪退缺少依赖库或Python版本不兼容检查 requirements.txt 依赖是否完整安装确认Python版本在3.9以上识别不到任何资源点模板截图过大或过小、画面分辨率不同重新裁剪模板图确保模板图与游戏内图标大小接近检查截屏分辨率识别到了但点击位置偏移游戏使用了高分屏缩放在Windows显示设置中检查缩放比例调整 pyautogui 坐标换算或使用区域截图配合换算点击后游戏无反应操作速度过快被游戏忽略增加 move_and_click 中的 sleep 时间模拟更慢的人工点击节奏运行几分钟后程序卡死截屏或图像识别循环中内存占用过高定时释放图像变量避免在循环内持续持有大尺寸截图AI服务调用超时网络波动或请求体太大设置更长的超时时间精简 context 数据去掉不必要的坐标信息频繁误判其他图标为资源点模板图特征过于通用换用包含更多颜色特征的小图提高阈值到0.85以上日志看不到输出日志文件目录不存在确保 logs 目录已创建或让 loguru 自动创建目录排查时可以遵循一个顺序先确认截图正常再确认模板匹配有效最后确认点击生效。把流程拆开验证能快速定位问题出现在哪一环。另外提醒一下不同显示器的分辨率和缩放比例不同直接复制代码很难保证坐标完全一致。建议在每台机器上都做一次坐标校准这是自动化操作项目中比较常见但容易被忽视的一步。6. 最佳实践与工程建议6.1 安全与合规边界自动采集类工具一定要明确使用边界。正规的游戏客户端通常会对模拟点击类操作有一定限制过于频繁的操作可能触发反作弊机制。个人学习研究可以但不要用于影响游戏平衡或破坏其他玩家体验的场景。建议措施设置合理的操作间隔不要 7x24 小时高强度运行不要同时开多个客户端批量操作控制单次运行时长比如每运行 30 分钟暂停 10 分钟定期人工检查账号状态。6.2 配置与密钥管理AI_APP_ID 和 AI_API_KEY 这类敏感信息千万别硬编码在代码里更不要传到 GitHub 公开仓库。推荐做法使用环境变量或本地不被人知的文件保存为自动采集项目单独申请一个低权限的 API Key如果怀疑密钥泄露立刻在清源AI开发者中心重置。6.3 日志和可观测性自动化程序最怕“悄悄死掉”。所以日志系统一定要完善。建议记录以下内容每一轮巡检的启动时间和结束时间每个资源点的识别坐标和相似度每次点击操作的坐标和目标AI决策的原始返回异常堆栈信息。这样即使第二天发现程序没有正常工作也能通过日志回溯是哪一轮开始出问题的。6.4 状态持久化程序重启后如果不知道上次采集时间可能会造成重复采集或漏采。建议把资源点状态保存到本地 JSON 文件比如 status.json每次巡检后更新一次。import json STATUS_FILE logs/status.json def save_status(status_data): with open(STATUS_FILE, w, encodingutf-8) as f: json.dump(status_data, f, ensure_asciiFalse, indent2)状态持久化还有一个好处如果程序崩溃重启可以根据上次状态决定是否立即巡检而不是傻等一个完整的间隔周期。6.5 引入 AI 决策时的降级策略AI 服务是外部依赖会存在网络波动或服务不可用的情况。在引入 AI 决策后一定要设计降级方案。推荐策略AI 调用失败时返回默认决策 noop默认决策下按照本地规则继续执行基础巡检连续多次 AI 调用失败时主动降低巡检频率避免无意义的请求压力把 AI 决策结果写入日志便于后续优化工作流。6.6 代码维护与扩展自动采集方案稳定运行后你会想把它扩展成更多功能比如自动收取邮件、自动建筑升级、自动查看活动页面。这时候模块化设计的优势就体现出来了。以目前的结构为例新增一个“自动邮件收取”功能只需要新增一个窗口截图模板在巡检流程里加一个识别和点击步骤把新场景加入 AI 决策 context。不需要改动图像识别、操作执行这些底层模块。这也是我为什么推荐一开始就做好模块划分的原因。7. 清源AI开发者招募与下一步学习方向如果你跟着前面的步骤把自动采集跑通那么恭喜你你其实已经掌握了“AI 开发”在自动化场景下的核心框架感知环境、理解状态、决策动作、执行反馈。这套框架可以迁移到很多地方不只是《无尽冬日》。清源AI 目前正在推进开发者生态建设也在持续招募对 AI 应用开发感兴趣的开发者。如果你希望获得更多平台资源、参与更多有趣的应用方向可以通过本文评论区的问卷报名。清源AI 开发者计划会提供更丰富的 API 能力、应用托管支持以及和其他开发者交流的渠道。关于下一步学习方向建议按这条路线走先把现有自动采集脚本优化稳定熟悉图像识别的各种参数调整深入学习清源AI 平台的工作流配置把更多业务逻辑从硬编码迁移到 AI 编排学习更多 Python 自动化技能比如 UI 自动化测试框架、OCR 文字识别尝试开发一个全新的 AI 应用比如定时邮件助手、桌面文件整理器参与开发者社区多看别人的智能体开发教程学习不同场景下的工具组合方式。自动采集只是 AI 开发的一个入门场景但它已经把“感知-决策-执行”的闭环完整走了一遍。后面无论是做更复杂的智能体还是做企业级的自动化流程本质上都是这套思路在放大。如果在开发过程中遇到问题欢迎对照文章里的排查表格逐项检查。也欢迎在评论区分享你的配置经验或踩坑记录一起把清源AI 的自动采集方案做得更完善。