Install
openclaw skills install @thcjp/flow-control-hub-freeopenclaw skills install @thcjp/flow-control-hub-free让AI Agent像人类一样操作桌面。鼠标、键盘、截图,三合一流程控制。
将重复性桌面操作交给Agent执行。本技能提供统一的桌面控制接口,覆盖鼠标定位、键盘输入、屏幕截图三大核心能力,配合失败安全机制确保自动化过程可控可中止。
┌─────────────────────────────────────────────────┐
│ 桌面流程控制中枢 (免费版) │
├─────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 鼠标控制 │ │ 键盘控制 │ │ 屏幕操作 │ │
│ │ │ │ │ │ │ │
│ │ 绝对定位 │ │ 文本输入 │ │ 全屏截图 │ │
│ │ 相对移动 │ │ 热键组合 │ │ 区域截图 │ │
│ │ 平滑移动 │ │ 特殊按键 │ │ 像素检测 │ │
│ │ 点击拖拽 │ │ 按键保持 │ │ 分辨率 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │
│ └────────────┼────────────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 安全防护层 │ │
│ │ 失败中止 │ │
│ │ 边界检查 │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────┘
安装依赖并执行第一次鼠标移动:
pip install pyautogui pillow
import pyautogui
x, y = pyautogui.position()
print(f"鼠标位置:{x}, {y}")
screen_w, screen_h = pyautogui.size()
pyautogui.moveTo(screen_w // 2, screen_h // 2, duration=0.3)
pyautogui.click()
初始化控制器并执行完整的输入流程:
import pyautogui
import time
pyautogui.FAILSAFE = True
pyautogui.PAUSE = 0.1 # 每个操作间隔0.1秒
screenshot = pyautogui.screenshot()
screenshot.save("before_action.png")
try:
import pygetwindow as gw
windows = gw.getAllWindows()
for w in windows:
if "记事本" in w.title:
w.activate()
time.sleep(0.5)
break
except ImportError:
print("提示:安装 pygetwindow 可启用窗口管理:pip install pygetwindow")
pyautogui.typewrite("Hello World", interval=0.05)
pyautogui.hotkey('ctrl', 's')
screenshot_after = pyautogui.screenshot()
screenshot_after.save("after_action.png")
配置自动化日志、错误处理与批量操作模板:
import pyautogui
import time
import logging
from pathlib import Path
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
filename='automation.log'
)
logger = logging.getLogger(__name__)
class FlowController:
"""桌面流程控制器(免费版核心)"""
def __init__(self, failsafe=True, pause=0.1):
self.failsafe = failsafe
self.pause = pause
pyautogui.FAILSAFE = failsafe
pyautogui.PAUSE = pause
self.action_log = []
def safe_click(self, x, y, button='left', clicks=1, desc=""):
"""安全点击,带日志记录"""
try:
logger.info(f"点击 ({x}, {y}) [{button}] - {desc}")
pyautogui.click(x, y, button=button, clicks=clicks)
self.action_log.append({
'action': 'click', 'x': x, 'y': y,
'desc': desc, 'success': True
})
except pyautogui.FailSafeException:
logger.error("失败安全触发!自动化已中止。")
raise
except Exception as e:
logger.error(f"点击失败:{e}")
self.action_log.append({
'action': 'click', 'desc': desc, 'success': False, 'error': str(e)
})
def safe_type(self, text, interval=0.05, desc=""):
"""安全输入文本"""
try:
logger.info(f"输入文本:{text[:30]}... - {desc}")
pyautogui.typewrite(text, interval=interval)
self.action_log.append({
'action': 'type', 'text': text, 'desc': desc, 'success': True
})
except Exception as e:
logger.error(f"输入失败:{e}")
def capture(self, region=None, filename=None):
"""截图并保存"""
img = pyautogui.screenshot(region=region)
if filename:
Path(filename).parent.mkdir(parents=True, exist_ok=True)
img.save(filename)
logger.info(f"截图已保存:{filename}")
return img
fc = FlowController(failsafe=True)
fc.safe_click(500, 300, desc="点击输入框")
fc.safe_type("自动化测试内容", desc="填写表单")
fc.capture(filename="screenshots/result.png")
| 功能 | 方法 | 参数说明 |
|---|---|---|
| 绝对定位 | moveTo(x, y, duration) | x/y为像素坐标,duration为移动时长(秒) |
| 相对移动 | moveRel(xOffset, yOffset) | 相对当前位置偏移 |
| 平滑移动 | moveTo(x, y, duration=0.5) | duration>0时使用插值平滑移动 |
| 左键点击 | click(x, y) | 不传坐标则在当前位置点击 |
| 右键点击 | click(x, y, button='right') | button可选left/right/middle |
| 双击 | click(x, y, clicks=2) | clicks控制点击次数 |
| 拖拽 | dragTo(x, y, duration=0.5) | 从当前位置拖拽到目标 |
| 滚轮 | scroll(clicks) | 正数向上,负数向下 |
| 获取位置 | position() | 返回当前(x, y)坐标 |
示例:
import pyautogui
pyautogui.moveTo(800, 400, duration=0.5)
pyautogui.click(300, 200, button='right')
pyautogui.click(500, 300, clicks=2, interval=0.1)
pyautogui.moveTo(100, 100)
pyautogui.dragTo(800, 600, duration=1.0, button='left')
pyautogui.scroll(-5)
输入: 用户提供鼠标控制所需的指令和必要参数。 处理: 按照skill规范执行鼠标控制操作,遵循单一意图原则。 输出: 返回鼠标控制的执行结果,包含操作状态和输出数据。
| 功能 | 方法 | 参数说明 |
|---|---|---|
| 输入文本 | typewrite(text, interval) | interval为按键间隔(秒) |
| 按键 | press('enter') | 按下并释放单个键 |
| 热键组合 | hotkey('ctrl', 'c') | 同时按下多个键 |
| 按住 | keyDown('shift') | 按住不释放 |
| 释放 | keyUp('shift') | 释放已按住的键 |
常用键名速查:
| 类别 | 键名 |
|---|---|
| 字母 | 'a' 到 'z' |
| 数字 | '0' 到 '9' |
| 功能键 | 'f1' 到 'f12' |
| 回车 | 'enter' 或 'return' |
| 退出 | 'esc' 或 'escape' |
| 空格 | 'space' |
| 制表 | 'tab' |
| 退格 | 'backspace' |
| 删除 | 'delete' 或 'del' |
| 方向键 | 'up' 'down' 'left' 'right' |
| 修饰键 | 'ctrl' 'shift' 'alt' 'win' |
示例:
import pyautogui
pyautogui.typewrite("你好世界", interval=0.05)
pyautogui.hotkey('ctrl', 'c')
pyautogui.hotkey('ctrl', 'v')
pyautogui.hotkey('ctrl', 'a')
pyautogui.keyDown('shift')
pyautogui.press('right')
pyautogui.press('right')
pyautogui.press('right')
pyautogui.keyUp('shift')
输入: 用户提供键盘控制所需的指令和必要参数。 处理: 按照skill规范执行键盘控制操作,遵循单一意图原则。 输出: 返回键盘控制的执行结果,包含操作状态和输出数据。
| 功能 | 方法 | 参数说明 |
|---|---|---|
| 全屏截图 | screenshot() | 返回PIL Image对象 |
| 区域截图 | screenshot(region=(l,t,w,h)) | region为(left, top, width, height) |
| 保存截图 | screenshot(filename='x.png') | 直接保存到文件 |
| 像素颜色 | pixel(x, y) | 返回RGB元组 |
| 屏幕尺寸 | size() | 返回(width, height) |
示例:
import pyautogui
img = pyautogui.screenshot()
img.save("fullscreen.png")
region_img = pyautogui.screenshot(region=(100, 100, 800, 600))
region_img.save("region.png")
r, g, b = pyautogui.pixel(500, 300)
print(f"RGB: ({r}, {g}, {b})")
w, h = pyautogui.size()
print(f"分辨率:{w}x{h}")
输入: 用户提供屏幕操作所需的指令和必要参数。 处理: 按照skill规范执行屏幕操作操作,遵循单一意图原则。 输出: 返回屏幕操作的执行结果,包含操作状态和输出数据。
| 机制 | 说明 | 使用方式 |
|---|---|---|
| 失败安全 | 鼠标移到屏幕角落立即中止 | pyautogui.FAILSAFE = True |
| 操作暂停 | 每个操作之间自动暂停 | pyautogui.PAUSE = 0.1 |
| 边界检查 | 防止坐标超出屏幕范围 | 自动校验 |
紧急中止方法:将鼠标快速移动到屏幕任意一角(左上/右上/左下/右下),自动化立即停止并抛出 FailSafeException。
输入: 用户提供安全防护所需的指令和必要参数。 处理: 按照skill规范执行安全防护操作,遵循单一意图原则。 输出: 返回安全防护的执行结果,包含操作状态和输出数据。 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:桌面自动化流程控、制中枢免费版、提供鼠标、屏幕截图等核心自、动化能力、快速上手、RPA、桌面流程控制中枢、免费版是一套面向、Agent、的桌面自动化执行、将鼠标操作、键盘输入、屏幕截图等底层控、制能力封装为统一、的流程控制接口、通过本技能、可以像人类一样操、作桌面应用程序、实现表单填写、窗口切换、截图归档等常见、Use、when、模型调用、智能对话、LLM、应用时使用、不适用于需要、确定性的关键决策等。
角色:数据录入员
场景描述:需要将Excel中的数据逐行填入网页表单,每行包含姓名、邮箱、电话三个字段。
实现:
import pyautogui
import time
import csv
pyautogui.FAILSAFE = True
pyautogui.PAUSE = 0.2
with open('contacts.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
pyautogui.click(300, 250)
pyautogui.typewrite(row['name'], interval=0.03)
pyautogui.press('tab')
pyautogui.typewrite(row['email'], interval=0.03)
pyautogui.press('tab')
pyautogui.typewrite(row['phone'], interval=0.03)
pyautogui.press('enter')
time.sleep(1.5)
print(f"已录入:{row['name']}")
角色:测试工程师
场景描述:在自动化测试过程中,需要在关键步骤截图并归档,用于后续质检对比。
实现:
import pyautogui
from datetime import datetime
from pathlib import Path
def capture_step(step_name, region=None):
"""在关键步骤截图并按时间戳归档"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
save_dir = Path(f"screenshots/{datetime.now().strftime('%Y%m%d')}")
save_dir.mkdir(parents=True, exist_ok=True)
filename = f"{save_dir}/{step_name}_{timestamp}.png"
pyautogui.screenshot(region=region, filename=filename)
print(f"截图已保存:{filename}")
return filename
capture_step("01_login_page")
pyautogui.click(400, 300)
pyautogui.typewrite("testuser", interval=0.05)
pyautogui.press('tab')
pyautogui.typewrite("password123", interval=0.05)
capture_step("02_credentials_filled")
pyautogui.press('enter')
import time; time.sleep(2)
capture_step("03_after_login")
角色:行政人员
场景描述:需要从应用A复制数据,切换到应用B粘贴,循环处理多条记录。
实现:
import pyautogui
import time
pyautogui.PAUSE = 0.3
for i in range(10):
pyautogui.click(200, 300 + i * 25) # 逐行选择
time.sleep(0.3)
pyautogui.hotkey('ctrl', 'c')
time.sleep(0.2)
pyautogui.hotkey('alt', 'tab')
time.sleep(0.5)
pyautogui.click(500, 400)
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('enter')
time.sleep(0.3)
pyautogui.hotkey('alt', 'tab')
time.sleep(0.3)
print(f"第 {i+1} 条记录搬运完成")
屏幕坐标系原点(0,0)在屏幕左上角,X轴向右递增,Y轴向下递增。单位为像素。可使用 pyautogui.size() 获取屏幕分辨率,使用 pyautogui.position() 获取当前鼠标坐标。注意Windows DPI缩放可能影响坐标准确性,建议在系统设置中将缩放调整为100%进行自动化操作。
typewrite() 方法默认只支持ASCII字符。输入中文需要使用输入法或改用 pyperclip 配合粘贴操作。推荐方案:先用 pyperclip.copy('中文内容') 复制到剪贴板,再用 pyautogui.hotkey('ctrl', 'v') 粘贴。
失败安全触发时会抛出 FailSafeException 异常,自动化立即停止。恢复方式:检查并修复自动化逻辑后重新运行脚本。如需临时禁用失败安全(不推荐),设置 pyautogui.FAILSAFE = False,但务必确保有其他中止机制。
在执行操作前先激活目标窗口。免费版可通过 pygetwindow 库实现:window.activate()。如果窗口无法激活,可尝试先用 pyautogui.click() 点击窗口标题栏。建议在每个关键操作前加入焦点检查。
使用以下方法定位坐标:(1) 运行 python -c "import pyautogui; print(pyautogui.position())" 实时查看鼠标坐标;(2) 先截图 pyautogui.screenshot('debug.png'),再用图片查看器标注目标位置坐标;(3) 使用 pyautogui.displayMousePosition() 实时显示坐标(需安装鼠标位置显示工具)。
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| pyautogui | Python库 | 必需 | pip install pyautogui |
| Pillow | Python库 | 必需 | pip install pillow(pyautogui自动安装) |
| pygetwindow | Python库 | 可选 | pip install pygetwindow(窗口管理功能) |
| pyperclip | Python库 | 可选 | pip install pyperclip(中文输入辅助) |
本技能基于原始开源桌面自动化作品改进,保留原始版权声明:
本改进作品在原始作品基础上进行了深度差异化改造,包括但不限于:
原始MIT license允许使用、复制、修改和分发,需保留版权声明。本改进作品在保留原始版权声明的基础上添加自有署名,完全符合MIT license要求。
本免费体验版限制以下高级功能:
find_on_screen 模板匹配)需升级专业版解锁全部功能请使用专业版:flow-control-hub-pro
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
输入:用户提供操作指令和必要参数
输出:返回执行结果,包含操作状态和输出数据
用户: 执行核心功能
Skill: 正在执行核心功能...
Skill: 执行完成,结果如下: 操作成功