你有没有想过,让 AI 直接帮你发微信消息?不是那种"帮我写一段话然后我复制粘贴"的半自动,而是从搜索联系人、打开聊天、输入消息到点击发送,全程自动完成?
今天,我用 OpenClaw + Peekaboo 实现了这件事。把完整流程和踩过的坑都记录下来,希望对你有帮助。
先看效果#
我在 Telegram 里对 AI 说:
“给张一二发微信,你好呀!我是来自远明的龙虾🦞”
AI 自动完成了以下操作:
- 打开微信搜索框
- 搜索"张一二"
- 点击搜索结果进入聊天
- 在输入框粘贴消息
- 按回车发送
- OCR 验证消息确实发出去了
全程大约 10 秒,我一个按钮都没按。
技术栈#
| 组件 | 作用 |
|---|
| OpenClaw | AI Agent 运行时,连接 Telegram/微信等多个渠道 |
| Peekaboo | macOS UI 自动化 CLI,模拟键鼠操作 |
| Vision OCR | macOS 原生文字识别,验证操作结果 |
| Claude | 大脑,理解指令并编排操作流程 |
简单说:你在 Telegram 里说一句话 → Claude 理解意图 → 调用 Peekaboo 操作微信 → OCR 验证结果 → 回复你"已发送"。
安装与配置#
1. 安装 Peekaboo#
1
| brew install steipete/tap/peekaboo
|
安装后需要授权两个权限(缺一不可):
- 辅助功能权限:系统设置 → 隐私与安全性 → 辅助功能
- 屏幕录制权限:系统设置 → 隐私与安全性 → 屏幕与系统音频录制
⚠️ 权限该给谁?取决于你的 OpenClaw 运行方式
如果你的 OpenClaw 是通过 LaunchAgent 后台守护进程运行的(关掉终端窗口 OpenClaw 依然在跑),权限需要授予 node 程序,而不是终端 App。在终端输入 which node 查看 node 的路径(通常是 /opt/homebrew/bin/node),然后在权限设置中添加这个程序。
如果你需要开着终端窗口 OpenClaw 才能运行,那权限给终端 App(Terminal 或 iTerm)就行。
不确定自己是哪种?问你的 OpenClaw 就知道了。
验证安装:
1
2
3
4
5
6
| peekaboo --version
# Peekaboo 3.0.0-beta3
peekaboo permissions
# Screen Recording: Granted ✅
# Accessibility: Granted ✅
|
2. 编译 OCR 工具#
我们用 macOS 原生的 Vision Framework 做文字识别,不需要任何 API key,离线运行,中英文识别精度极高。
创建 ocr.swift:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| import Cocoa
import Vision
let path = CommandLine.arguments[1]
let url = URL(fileURLWithPath: path)
guard let image = NSImage(contentsOf: url),
let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) else {
print("Cannot load image")
exit(1)
}
let request = VNRecognizeTextRequest()
request.recognitionLanguages = ["zh-Hans", "en"]
request.recognitionLevel = .accurate
let handler = VNImageRequestHandler(cgImage: cgImage)
try! handler.perform([request])
for observation in request.results ?? [] {
if let candidate = observation.topCandidates(1).first {
print(candidate.string)
}
}
|
编译:
1
| swiftc -O ocr.swift -o ocr_tool
|
测试:
1
2
| ./ocr_tool screenshot.png
# 输出图片中识别到的所有文字
|
3. OpenClaw 配置#
确保 OpenClaw 已安装并连接了你的 Telegram(或其他聊天渠道)。Peekaboo skill 在 OpenClaw 的 skills 目录中会被自动加载。
核心流程详解#
第一步:搜索联系人#
微信 macOS 版的搜索快捷键是 Cmd+F,但有个前提——焦点必须在微信窗口上。
1
2
3
4
5
6
7
8
9
10
| # 先点击微信聊天区获取焦点
peekaboo click --coords 900,500
# 打开搜索
peekaboo hotkey --keys "cmd,f" --app "com.tencent.xinWeChat"
sleep 1
# 输入联系人名
peekaboo paste "张一二" --app "com.tencent.xinWeChat"
sleep 2
|
⚠️ 关键踩坑:必须用 paste 不能用 type
Peekaboo 的 type 命令模拟的是逐个按键,会被中文输入法拦截,输出乱码。paste 是直接写入剪贴板再 Cmd+V 粘贴,完美绕过输入法问题。
第二步:选择搜索结果#
搜索结果一般第一个就是目标联系人,直接按回车:
1
| peekaboo press return --app "com.tencent.xinWeChat"
|
如果有重名怎么办?后面会专门讲。
第三步:验证是否进对了聊天#
这一步是防发错人的关键。截图 + OCR 确认聊天窗口标题:
1
2
3
4
5
| # 截图
peekaboo image --mode screen --path /tmp/wechat-verify.png
# OCR 识别
./ocr_tool /tmp/wechat-verify.png | grep "张一二"
|
如果 OCR 输出中包含目标联系人名字,说明进对了。如果不对,按 Escape 回去重来。
第四步:发送消息#
1
2
3
4
5
6
7
8
| # 点击输入框
peekaboo click --coords 1000,900
# 粘贴消息内容
peekaboo paste "你好呀!" --app "com.tencent.xinWeChat"
# 回车发送
peekaboo press return --app "com.tencent.xinWeChat"
|
第五步:验证发送成功#
1
2
| peekaboo image --mode screen --path /tmp/wechat-sent.png
./ocr_tool /tmp/wechat-sent.png | grep "你好"
|
OCR 读到消息内容出现在聊天记录中,确认发送成功。
处理重名联系人#
实际使用中,搜索"远明"可能出来 3 个人。这时候需要看头像区分。
OCR 只能读文字,看不了头像。解决方案是调用视觉模型分析截图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 截取搜索结果
peekaboo image --mode screen --path /tmp/search-result.png
# 用视觉模型分析每个头像的特征
IMG_B64=$(base64 -i /tmp/search-result.png)
curl -s "https://your-api/v1/messages" \
-H "x-api-key: $API_KEY" \
-d '{"model":"claude-sonnet-4","messages":[{
"role":"user",
"content":[
{"type":"image","source":{"type":"base64","data":"'$IMG_B64'"}},
{"type":"text","text":"描述每个联系人的头像特征"}
]
}]}'
|
模型会回复类似:
- 第1个:蓝色正装
- 第2个:黑色衣服 ← 目标
- 第3个:蓝色正装 + @远明科技
然后用方向键精确选择:
1
2
| peekaboo press down --count 1 --app "com.tencent.xinWeChat" # 选第2个
peekaboo press return --app "com.tencent.xinWeChat"
|
如果视觉模型也无法确定(比如头像太小或太相似),必须询问用户确认,绝不能猜。发错人的代价远大于多问一句。
完整脚本#
把上面的步骤串起来,就是一个完整的微信发消息流程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| #!/bin/bash
# wechat_send.sh - 通过 Peekaboo 给微信联系人发消息
# 用法: ./wechat_send.sh "联系人名" "消息内容"
CONTACT="$1"
MESSAGE="$2"
WECHAT_APP="com.tencent.xinWeChat"
OCR_TOOL="./ocr_tool"
echo "📱 正在给 ${CONTACT} 发消息..."
# 1. 打开微信搜索
peekaboo click --coords 900,500
sleep 0.3
peekaboo hotkey --keys "cmd,f" --app "$WECHAT_APP"
sleep 1
# 2. 搜索联系人
peekaboo paste "$CONTACT" --app "$WECHAT_APP"
sleep 2
# 3. 选择第一个结果
peekaboo press return --app "$WECHAT_APP"
sleep 1.5
# 4. OCR 验证
peekaboo image --mode screen --path /tmp/wechat-verify.png
if $OCR_TOOL /tmp/wechat-verify.png | grep -q "$CONTACT"; then
echo "✅ 已进入 ${CONTACT} 的聊天"
else
echo "❌ 验证失败,可能进错了聊天"
peekaboo press escape --app "$WECHAT_APP"
exit 1
fi
# 5. 发送消息
peekaboo click --coords 1000,900
sleep 0.3
peekaboo paste "$MESSAGE" --app "$WECHAT_APP"
sleep 0.5
peekaboo press return --app "$WECHAT_APP"
sleep 1
# 6. 验证发送
peekaboo image --mode screen --path /tmp/wechat-sent.png
if $OCR_TOOL /tmp/wechat-sent.png | grep -q "$(echo $MESSAGE | head -c 10)"; then
echo "✅ 消息已发送"
else
echo "⚠️ 无法确认发送状态"
fi
|
踩坑记录#
坑1:type 不能输入中文#
Peekaboo 的 type 命令模拟键盘逐字输入,会被 macOS 中文输入法拦截。必须用 paste(写剪贴板 + Cmd+V)。
坑2:搜索弹窗截不到#
微信的搜索弹窗是一个独立的浮层窗口,用 --window-id 截图只能截到主窗口,看不到弹窗。必须用 --mode screen 截全屏才能截到搜索弹窗和结果列表。
坑3:焦点问题#
如果微信不在最前面,Cmd+F 可能不响应。发送前先点击微信窗口区域获取焦点。
坑4:坐标是绝对坐标#
Peekaboo 的 click --coords 用的是屏幕绝对坐标,不是窗口相对坐标。如果微信窗口移动了位置,坐标需要重新计算。
可以通过 peekaboo list windows 查看当前窗口位置:
1
2
3
| peekaboo list windows --app "com.tencent.xinWeChat"
# 微信 - ID: 302
# Position: (378, 212) Size: 1001×809
|
坑5:发错人#
没有验证就直接发消息,结果发给了"李四"而不是"张一二"。教训:OCR 验证不是可选步骤,是必须步骤。
安全原则#
- 发送前必须 OCR 验证联系人——防止发错人
- 重名时必须确认——视觉模型识别头像,搞不定就问用户
- 不要自动发送敏感内容——涉及金钱、隐私的消息应该让用户确认
- 记录操作日志——每次操作都截图存档,方便回溯
这套方案的边界#
能做的:
- 给任意联系人发文字消息
- 搜索联系人、群聊
- 基本的键鼠操作(点击、输入、快捷键)
暂时不能做的:
- 发送图片/文件(需要额外的拖拽或文件选择操作)
- 读取聊天记录(微信的 accessibility 接口不暴露聊天内容)
- 在微信小程序里操作
潜在改进:
- 用
peekaboo see --annotate 识别 UI 元素,减少硬编码坐标 - 封装成 OpenClaw skill,一句话触发
- 结合定时任务,自动发送日报/周报
写在最后#
这套方案的本质是:用 AI 的理解能力 + 桌面自动化工具,操作任何没有 API 的应用。
微信没有开放的消息 API?没关系,我们有眼睛(截图)、有手(键鼠模拟)、有大脑(Claude)。这个思路不局限于微信,任何 macOS 应用都可以用同样的方式控制。
OpenClaw 让 AI 不再只是一个聊天窗口里的文字助手,而是一个能真正操作电脑的数字员工。