如果你也在用 OpenClaw 对接飞书,每天被一堆配对请求点到手酸,这篇文章应该能帮你省点咖啡时间。
核心思路:list → extract → approve → loop
OpenClaw 提供了 CLI 工具,支持 pairing list 查看待处理请求,也支持 pairing approve 单个批准。这意味着我们完全可以用一个脚本把流程串起来:
- 扫:定时调用
pairing list,看看有没有新来的配对码; - 抓:从输出里把配对码"抠"出来;
- 批:拿到码之后,逐个执行
approve; - 睡:歇一会儿,继续下一轮。
说白了,就是一个守护进程 + 轮询 + 批量处理的经典套路。
代码实现
先上完整代码,后面分段拆解。
#!/bin/bash
# OpenClaw 自动批准配对脚本 - 最终版LOG_FILE="/home/admin/auto-approve.log"
OPENCLAW="/home/admin/.local/share/pnpm/openclaw"echo "$(date '+%Y-%m-%d %H:%M:%S') 自动批准服务启动 (PID: $$)" >> "$LOG_FILE"while true; do# 1. 获取待处理配对码codes=$($OPENCLAW pairing list 2>/dev/null | grep -oE '[A-Z0-9]{8}')if [ -n "$codes" ]; thenfor code in $codes; doecho "$(date '+%Y-%m-%d %H:%M:%S') 发现配对码: $code,正在批准..." >> "$LOG_FILE"result=$($OPENCLAW pairing approve feishu "$code" 2>&1)if echo "$result" | grep -q "Approved"; thenecho "$(date '+%Y-%m-%d %H:%M:%S') ✅ 成功批准: $code" >> "$LOG_FILE"elseecho "$(date '+%Y-%m-%d %H:%M:%S') ❌ 批准失败: $code" >> "$LOG_FILE"fidonefisleep 10
done
逐段拆解
1. 识别配对码——正则提取是关键
codes=$($OPENCLAW pairing list 2>/dev/null | grep -oE '[A-Z0-9]{8}')
这是整个脚本的第一步,也是最核心的一步。
pairing list 的原始输出大概长这样(示意):
PENDING PAIRINGS
----------------
Platform: feishu | Code: A1B2C3D4 | User: alice
Platform: feishu | Code: X9Y8Z7W6 | User: bob
我们需要的是中间那串 8 位字符。用 grep -oE '[A-Z0-9]{8}' 正好能精准提取:
| 参数 | 含义 |
|---|---|
-o |
only-matching:只输出匹配到的部分,不要整行 |
-E |
扩展正则,支持 {8} 这种量词 |
[A-Z0-9]{8} |
严格匹配 8 位大写字母或数字 |
一个小坑:如果配对码格式变了(比如加了横杠、变成小写),这个正则会失效。目前 OpenClaw 的码是标准 8 位大写,所以够用。
另外,2>/dev/null 是为了防止 pairing list 在网络抖动或 token 过期时报错,把错误输出直接扔掉,避免污染后续处理。
2. 批量批准——for 循环逐个搞定
if [ -n "$codes" ]; thenfor code in $codes; do# ... approve ...done
fi
这里有个细节:grep -oE 如果匹配到多个结果,默认会用换行或空格分隔。Shell 的 for...in 正好按空白字符切分,于是天然实现了批量遍历。
也就是说,哪怕一次来了 10 个配对请求,脚本也会一个一个按顺序处理,不会漏掉。
3. 执行批准——调用 OpenClaw CLI
result=$($OPENCLAW pairing approve feishu "$code" 2>&1)
命令结构很清晰:
| 片段 | 作用 |
|---|---|
pairing approve |
子命令,执行批准动作 |
feishu |
平台标识,目前团队只用飞书,所以写死了 |
"$code" |
当前要批准的具体配对码 |
2>&1 |
把 stderr 也抓进变量,这样后面才能判断到底是成功了还是报错了 |
4. 结果判定——字符串匹配有点"土",但好用
if echo "$result" | grep -q "Approved"; thenecho "... ✅ 成功批准: $code" >> "$LOG_FILE"
elseecho "... ❌ 批准失败: $code" >> "$LOG_FILE"
fi
OpenClaw 批准成功时,标准输出里会包含 Approved 字样;失败时则可能是 Error、Expired、Invalid 之类的。
我没有用退出码判断,因为有些 CLI 工具即使业务失败也会返回 0 退出码。直接 grep 字符串虽然看起来有点"土",但在这个场景下稳定可靠。
5. 守护进程——while true + sleep
while true; do# ... 扫描 + 批准 ...sleep 10
done
脚本跑起来之后就是一个常驻进程。每 10 秒扫描一次,既不会漏掉紧急请求,也不会疯狂刷 API。
10 秒这个值是我拍脑袋定的,实际可以根据配对请求的频率调整。如果团队人不多,改成 30 秒甚至 60 秒也完全没问题,还能更省电。
实际运行效果
日志文件 /home/admin/auto-approve.log 里会长这样:
2026-05-11 16:43:01 自动批准服务启动 (PID: 12345)
2026-05-11 16:43:12 发现配对码: A1B2C3D4,正在批准...
2026-05-11 16:43:13 ✅ 成功批准: A1B2C3D4
2026-05-11 16:43:13 发现配对码: X9Y8Z7W6,正在批准...
2026-05-11 16:43:14 ❌ 批准失败: X9Y8Z7W6
一目了然,出了问题也能翻日志定位。
还能怎么优化?
这个脚本目前算是"够用且好用",但真要上生产环境长期跑,还有几个可以打磨的点:
1. 失败原因要留痕
现在的失败日志只写了"批准失败",但没记具体报错。建议改成:
echo "$(date) ❌ 批准失败: $code, 详情: $result" >> "$LOG_FILE"
这样排查时不用手动复现。
2. 加个优雅退出
while true 很硬核,但如果要重启或下线服务,直接 kill 可能会让正在进行的 approve 中断。可以加个 trap:
trap 'echo "$(date) 收到终止信号,正在退出..." >> "$LOG_FILE"; exit 0' SIGTERM SIGINT
3. 防止重复批准
如果某个配对码因为网络原因被处理了两次,OpenClaw 一般会返回"已处理"或报错。可以在本地维护一个已处理码的缓存,避免重复请求。
4. 平台参数化
现在平台写死了 feishu,如果以后接钉钉、企业微信,就得改代码。可以通过环境变量注入:
PLATFORM="${OPENCLAW_PLATFORM:-feishu}"
结语
这个脚本本质上没什么高深技术,就是把几个 CLI 命令用 Bash 串成了一个自动化流水线。但正是这种"小自动化",能把人从重复、低价值的点击操作里解放出来。
如果你也在用 OpenClaw,或者有类似的"手动批准"痛点,不妨拿过去改改用。有优化思路也欢迎交流。
Happy scripting! 🚀
本文示例代码基于 OpenClaw CLI 与 Bash,测试环境为 Ubuntu24.06lts。
