OpenClaw——让龙虾像真人一样控制桌面的SKILL(macOS版)

作者:KD日期:2026/4/19

一、背景

工作中要做一个桌面控制相关需求,试了下ClawHub现有Desktop Control skill,发现都有一些不好用的地方,或者与macOS系统不够适配,因此写了一个新skill供大家使用和交流

二、概述

  • 这个Skill主要链路如下:image.png

三、具体步骤实现拆解

1.初始化

这一步是最关键的,也是很多现有skill缺失的一步。第一版本先只做Retina屏兼容

在 macOS 上,即使截图和点击都用 Python,也仍然需要先确认几件事情:

1截图图像尺寸是多少
2屏幕逻辑尺寸是多少
3鼠标点击使用的坐标系是什么
4

原因是,在 Retina 屏、缩放显示器、多屏环境下,截图图片的像素尺寸和 pyautogui.size() 返回的逻辑屏幕尺寸可能不同。

比如 Retina 屏上经常会出现这种情况:

1截图图像尺寸:2880 × 1800
2逻辑屏幕尺寸:1440 × 900
3

这意味着截图里的 2 个 pixel,才对应 macOS 逻辑坐标里的 1 个 point。

如果直接拿截图上的像素坐标去点击,就可能点偏。

所以初始化阶段要做的事情是:

用 Python 获取截图尺寸和逻辑屏幕尺寸,计算两者之间的缩放比例,并把结果保存到文件中,供后续流程使用。

2.屏幕截图

截图这一步继续使用 Python 的 pyautogui

关键点是:截图之后,把图片 resize 到 pyautogui.position()pyautogui.click() 使用的坐标系。

示例代码如下:

1import pyautogui
2
3img = pyautogui.screenshot()
4
5screen_w, screen_h = pyautogui.size()
6
7# 把截图 resize  pyautogui.position() / click() 使用的坐标系
8img = img.resize((screen_w, screen_h))
9
10img.save("screen_logical.png")
11

这一步看似简单,但非常关键。

如果我们后续所有识别都基于 screen_logical.png,那识别结果天然就在逻辑坐标系里,后面的点击会简单很多。

也就是说,我们把坐标统一这件事放到了截图阶段完成:

1截图原始尺寸:2880 × 1800
2逻辑屏幕尺寸:1440 × 900
3resize 后图片:1440 × 900
4OCR / OpenCV 返回坐标:逻辑坐标
5pyautogui.click 使用坐标:逻辑坐标
6

这样整个 skill 的坐标系统会更稳定。

3.图像/文字识别

识别定位可以分成两类:

1文字识别:OCR
2图像识别:OpenCV
3

这两种能力覆盖了大多数桌面自动化场景。


OCR 文字定位

OCR 适合查找界面上的文字,比如按钮文案、菜单项、标题、标签等。

例如:

1查找“确定”
2查找“发送”
3查找“登录”
4查找“保存”
5

流程大致是:

1读取 screen_logical.png
2运行 OCR
3找到匹配文本
4返回文字区域中心点
5

返回结果可以是:

1{
2  "type": "text",
3  "query": "发送",
4  "x": 1200,
5  "y": 820,
6  "confidence": 0.92
7}
8

然后鼠标点击模块直接点击 (1200, 820)

OCR 的优点是泛化性强。只要界面上有文字,就不需要提前准备模板图。

但它也有局限,比如小字号、低对比度、特殊字体、中文识别质量等,都可能影响结果。

所以 OCR 更适合这类场景:

1界面文字清晰
2目标按钮有明确文案
3需要查找的内容不固定
4不想提前维护模板图片
5

OpenCV 图像定位

OpenCV 更适合查找图标、按钮、头像、固定 UI 区块等视觉目标。

例如:

1查找某个 App 图标
2查找关闭按钮
3查找发送图标
4查找某个固定图片区域
5

典型做法是模板匹配:

1读取 screen_logical.png
2读取 template.png
3使用 OpenCV matchTemplate
4找到最高匹配区域
5返回中心点
6

返回结果可以是:

1{
2  "type": "image",
3  "template": "send_button.png",
4  "x": 1185,
5  "y": 835,
6  "confidence": 0.88
7}
8

OpenCV 的优点是对图形元素定位更稳定,不依赖文字识别。

但它也有局限。界面缩放、主题变化、深色模式、按钮状态变化,都可能影响匹配结果。

所以这两种方式最好同时保留:

1有文字  优先 OCR
2有图标  使用 OpenCV
3复杂场景  OCR + OpenCV 组合验证
4

4.鼠标点击

最后一步是鼠标点击。

这里仍然用 Python 实现,继续使用 pyautogui

1import pyautogui
2
3pyautogui.click(x, y)
4

为了让它更适合作为 skill 使用,点击脚本最好支持命令行参数:

1python scripts/mouse/click.py --x 1200 --y 820
2

也可以增加一些常用选项:

1python scripts/mouse/click.py --x 1200 --y 820 --duration 0.1
2python scripts/mouse/click.py --x 1200 --y 820 --button left
3python scripts/mouse/click.py --x 1200 --y 820 --double
4

这样 OpenClaw 在拿到定位结果后,就可以直接调用点击脚本完成操作。

因为前面的截图和识别都已经统一到了逻辑坐标,所以点击阶段不需要再做复杂转换:

1识别结果 x, y  pyautogui.click(x, y)
2

这也是为什么前面的坐标统一非常重要。

四、GitHub & ClawHub


OpenClaw——让龙虾像真人一样控制桌面的SKILL(macOS版)》 是转载文章,点击查看原文


相关推荐


AI Agent 智能体开发入门:AutoGen 多智能体协作实战教程
Halcyon.平安2026/4/10

本文通过 AutoGen 框架,从单智能体到多智能体协作,循序渐进地讲解如何构建 AI Agent 系统,包含完整的代码示例和架构设计。 1. 多智能体协作架构 #mermaid-svg-TX83Bcl6adrsEqiY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}


Claude Code 防上下文爆炸:源码级深度解析
lizhongxuan2026/4/2

基于 Claude Code v2.1.88 源码还原分析。本文从源码层面拆解 Claude Code 如何在长对话中管理上下文窗口,防止 token 爆炸,同时保持用户意图不被稀释。 问题:为什么上下文会爆炸? Claude Code 是一个 agentic coding 工具。一次典型的编码会话中,模型会: 读取十几个文件(每个几百到几千行) 执行 shell 命令并获取输出 搜索代码库(grep/glob 结果可能很大) 编辑文件并查看 diff 调用子 agent 处理子任务 每一


【万字长文】从 AI SDK 到 mini-opencode:一次很巧的 Go Agent 架构实践
mCell2026/3/25

同步更新至个人站点:从 AI SDK 到 mini-opencode:一次很巧的 Go Agent 架构实践 相关链接: 从零构建 Mini Claude Code:stack.mcell.top/blog/2026/a… 本次 Mini OpenCode 仓库地址:github.com/minorcell/m… Memo Code:memo.mcell.top/ 前阵子,我写过一篇 从零构建 Mini Claude Code 的 Agent 开发入门教程。 那次基本是顺着 AI SDK


Rust宏编程完全指南:用元编程解锁Rust的终极力量
土豆12502026/3/17

"宏就像是编译器的魔法棒,挥一挥,重复的代码就消失了。" —— 某位深夜 debug 的 Rustacean 目录 Why:为什么需要宏? What:宏是什么? How:如何使用宏? 声明宏 (macro_rules!) 派生宏 (Derive Macros) 属性宏 (Attribute Macros) 函数式宏 (Function-like Macros) 最佳实践 常见误区 总结 Why:为什么需要宏? 想象一下,你正在写一个 Web 框架,需要为 50 个不同的结构体实现相


【毕设】前后端(无模型训练)
2301_815389372026/3/8

后端 第一步,先建一个项目文件夹。 打开你电脑上任意一个地方,新建一个文件夹,就叫 ebike-detection,然后把你的 best.pt 复制进去。 第二步,安装Flask和相关依赖。 打开命令提示符(按 Win+R,输入 cmd,回车),然后把下面这行命令复制进去运行: pip install flask flask-cors ultralytics pillow 好,第三步,创建Flask后端文件。 在你的 ebike-detection


Node.js 安装与配置完全指南:从零开始搭建开发环境
张3蜂2026/2/28

目录 引言 第一部分:Node.js 简介与版本选择 1.1 什么是 Node.js? 1.2 Node.js 版本介绍 第二部分:Node.js 安装方式详解 2.1 方式一:官方安装包(最简单,适合初学者) Windows/macOS 安装步骤: 2.2 方式二:包管理器安装(适合 Linux 用户) Ubuntu/Debian 系统安装步骤: CentOS/RHEL 系统安装步骤: macOS 使用 Homebrew 安装: 2.3 方式三:使用 NVM 安装(最推


ThreadForge v1.1.0 发布:让 Java 并发更接近 Go 的开发体验
一只叫煤球的猫2026/2/20

正好春节放假,自驾去了陕西、河南、安徽,一路上走走停停。 白天基本在路上,晚上在酒店或者服务区休息时,抽一些时间继续打磨 ThreadForge。 一点点补了个 v1.1.0 出来。 仍然保持 ThreadForge 的目标: 让 Java 能写出更简单、更可推理、更可观测的并发代码。 这次版本,重点补齐了并发开发里几个还算常见的能力。 v1.1.0 核心更新 Retry Policy(失败重试) 支持 scope 级默认重试,也支持任务级覆盖,不再到处手写 while/try-catch


git pull拉取的时候碰到报错:error: 您对下列文件的本地修改将被合并操作覆盖 请在合并前提交或贮藏您的修改。
skywalk81632026/2/11

git pull拉取的时候碰到报错: error: 您对下列文件的本地修改将被合并操作覆盖:         data/processed/acnes_related_data.csv         data/processed/activity_data.csv         data/processed/hemolytic_data.csv         data/raw/active_peptides.csv         data/raw/hemolytic.csv      


自己搭邮件服务器有多难?我用 Mailu 跑通了整套企业邮箱
GetcharZp2026/2/3

从“为什么要自建邮箱”讲起,拆解 Mailu 的架构、优缺点,以及普通人也能照着做的安装实战。 Github:github.com/Mailu/Mailu 官网:mailu.io/ 这几年,越来越多团队开始重新审视一件事:邮箱,到底要不要掌握在自己手里? 用第三方企业邮箱当然省事,但账号封禁、功能限制、隐私不可控的问题,一旦遇到,几乎没有回旋余地。于是,自建邮件服务器这件事,又被不少技术团队重新捡了起来。 而在一堆方案里,Mailu 是被频繁提到的一个名字。 Mailu 是什么?一句话先讲明


VS code 类产物中 win11 终端字体内容和颜色 加粗不匹配问题
小兵张健2026/1/24

我尝试了各种方式,换字体,改配置,结果还是乱的,有人知道怎么搞吗?跪求,Mac好像天然就没问题,急急急大佬们

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客