全桌面GUI 自动化 — 使用 Python 库 (pyautogui, opencv) + xdotool + scrot,支持鼠标/键盘模拟、截图、视觉识别。
desktop-gui - 全桌面 GUI 自动化是一项面向实际任务的技能,主要用于使用 Python 库实现全桌面 GUI 自动化,包括鼠标/键盘模拟、截图、视觉识别等;🌟 两种模式;
移动、点击、双击、右键;拖动、滑动。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
使用 Python 库实现全桌面 GUI 自动化,包括鼠标/键盘模拟、截图、视觉识别等。
# 核心库 pip3 install pyautogui pygetwindow pymsgbox opencv-python-headless pillow pytesseract # 系统工具 sudo apt-get install -y xdotool scrot tesseract-ocr tesseract-ocr-chi-sim tesseract-ocr-chi-tra
import pyautogui
import pygetwindow as gw
from PIL import Image
import time
# 暂停保护(误操作时按 Ctrl+C 停止)
pyautogui.PAUSE = 1
# 鼠标操作
pyautogui.moveTo(100, 200) # 移动到坐标
pyautogui.click() # 左键点击
pyautogui.doubleClick() # 双击
pyautogui.rightClick() # 右键
pyautogui.scroll(5) # 滚动
# 键盘操作
pyautogui.typewrite('Hello World')
pyautogui.hotkey('ctrl', 'c') # Ctrl+C
pyautogui.press('enter')
# 截图
screenshot = pyautogui.screenshot()
screenshot.save('/tmp/screen.png')
# 图像搜索(找按钮位置)
button_pos = pyautogui.locateOnScreen('button.png')
if button_pos:
pyautogui.click(button_pos)
# 窗口管理
windows = gw.getAllWindows()
for w in windows:
print(w.title, w.left, w.top, w.width, w.height)
# 激活窗口
for w in gw.getWindowsAt(100, 100):
w.activate()
break
通过 exec 工具运行 Python 脚本:
python3 << 'EOF'
import pyautogui
pyautogui.press('f5') # 刷新页面
EOF
⚠️ 高危操作!
pyautogui.FAILSAFE = True(鼠标移到屏幕角落停止)PAUSE 延迟观察效果✅ 适合:
❌ 不适合:
| 方案 | 优点 | 缺点 |
|---|---|---|
| pyautogui | 简单易用、跨平台 | 慢、不精确、依赖屏幕分辨率 |
| xdotool | 快速、精确、Linux 原生 | 只能模拟输入、不能截图 |
| Playwright | 快速、可靠、支持 JS | 仅限浏览器 |
| rdp + 远程 | 真实人类操作 | 成本高、需要真机 |
用 Qwen3.5-27b 的原生视觉能力分析截图,直接返回操作建议:
截图 (scrot) → Qwen3.5-27b 分析 → 返回坐标/操作 → xdotool 执行
✅ 不需要 OCR - 直接理解界面布局和图标 ✅ 上下文感知 - 能理解"这个按钮是干什么的" ✅ 更准确 - 视觉模型比规则匹配更可靠 ✅ 更灵活 - 可以问复杂问题("找到提交按钮"vs"点击坐标 300,200")
import subprocess
import base64
import requests
# 1. 截图
subprocess.run(['scrot', '/tmp/screen.png'])
# 2. 转 Base64
with open('/tmp/screen.png', 'rb') as f:
img_b64 = base64.b64encode(f.read()).decode()
# 3. 问视觉模型
prompt = """
分析屏幕截图,找到打卡按钮,返回坐标。
用 JSON 格式:{"action": "click", "x": 450, "y": 320, "description": "打卡按钮"}
"""
response = requests.post(
"http://10.6.207.56:8000/v1/chat/completions",
headers={"Authorization": "Bearer VLLM_API_KEY"},
json={
"model": "qwen3.5-27b",
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}},
{"type": "text", "text": prompt}
]
}]
}
)
result = response.json()['choices'][0]['message']['content']
print(result) # 输出:{"action": "click", "x": 450, "y": 320}
# 4. 执行操作
import json
data = json.loads(result)
if data['action'] == 'click':
subprocess.run(['xdotool', 'mousemove', str(data['x']), str(data['y'])])
subprocess.run(['xdotool', 'click', '1'])
考勤系统打卡:
1. 截图当前屏幕
2. 问模型:"找到打卡/签到按钮,返回坐标"
3. 模型返回:{"x": 512, "y": 400, "confidence": 0.95}
4. xdotool 点击该坐标
5. 截图验证是否成功
比传统方案强在哪里:
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习