Install
openclaw skills install browser-relay-xiaohongshu通过 HTTP relay 控制用户本地 Chromium 浏览器(绕过数据中心 IP 封锁),支持截图发送到 Telegram
openclaw skills install browser-relay-xiaohongshu通过 HTTP relay 控制用户本地 Chromium,用于操作会封锁数据中心 IP 的网站(如小红书)。
AI → HTTP (port 18792) → relay.py → CDP (port 9222) → 用户本地 Chromium
所有请求从用户本地 IP 发出,绕过反爬。
127.0.0.1(localhost),不会暴露到外部网络/tmp/browser-relay-token) 以 0600 权限写入,仅文件所有者可读/evaluate 端点允许在浏览器上下文中执行 JS,可访问 DOM、cookies、localStorage 等。仅限本地可信调用方使用,不应暴露给不受信任的客户端start.sh 仅通过 PID 文件精确停止 relay 进程,不会影响其他进程使用此 skill 的 agent 必须遵守以下规则:
exec 仅允许用于以下操作:
127.0.0.1:18792(relay)和 127.0.0.1:9222(CDP)发送 HTTP 请求start.sh 启动/停止 relay/tmp/browser-relay-token./screenshots/禁止使用 exec 执行上述范围之外的命令。
/evaluate 仅允许用于 UI 自动化目的:
禁止通过 /evaluate 提取以下敏感数据:
document.cookielocalStorage / sessionStorage 中的 token 或凭据以下路径均相对于项目安装目录,请根据实际位置调整。
./relay.py./start.sh/tmp/browser-relay-token/tmp/browser-relay.pid/tmp/relay.log./screenshots/每次会话开始使用 relay 前,按以下步骤操作:
curl -s http://127.0.0.1:9222/json/version
如果连接失败,说明 Chromium 未启动,需要启动它(见下方"启动 Chromium")。
DISPLAY=:0 nohup chromium --remote-debugging-port=9222 --remote-allow-origins=* > /dev/null 2>&1 &
注意事项:
--remote-allow-origins=* 否则 WebSocket 连接会被拒绝DISPLAY=:0(或对应的显示环境变量)以在用户桌面上显示chromium 或 chromium-browser,按实际情况调整curl -s http://127.0.0.1:18792/health
如果返回 {"status":"ok"},跳到步骤 5。否则继续。
bash start.sh
cat /tmp/browser-relay-token
读取后用 session_state 缓存到当前会话:
session_state set namespace=browser-relay key=token value=<token>
后续所有请求从 session_state 读取 token,不重复读文件。
所有请求都需要 Authorization: Bearer <token> 头。
curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:18792/tabs
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"url":"https://www.xiaohongshu.com"}' \
http://127.0.0.1:18792/navigate
TOKEN=$(cat /tmp/browser-relay-token)
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"quality":70}' http://127.0.0.1:18792/screenshot \
| python3 -c "
import sys, json, base64, os
from datetime import datetime
data = json.load(sys.stdin)
if data.get('ok'):
os.makedirs('./screenshots', exist_ok=True)
fname = datetime.now().strftime('%Y%m%d_%H%M%S') + '.jpg'
path = f'./screenshots/{fname}'
with open(path, 'wb') as f:
f.write(base64.b64decode(data['data']))
print(f'saved:{path} size:{os.path.getsize(path)}')
else:
print(f'error:{data}')
"
当用户在 Telegram 上交互时,截图需要发送到 TG 才能看到。流程:
# 1. 截图并保存
TOKEN=$(cat /tmp/browser-relay-token)
SCREENSHOT_PATH="/tmp/relay_screenshot.png"
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"quality":80}' http://127.0.0.1:18792/screenshot \
| python3 -c "
import sys, json, base64
data = json.load(sys.stdin)
if data.get('ok'):
with open('$SCREENSHOT_PATH', 'wb') as f:
f.write(base64.b64decode(data['data']))
print('ok')
else:
print(f'error:{data}')
"
# 2. 通过 Telegram Bot API 发送图片
TG_BOT_TOKEN="<从 session_state 或 memory 获取>"
TG_CHAT_ID="<从 session_state 或 memory 获取>"
curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendPhoto" \
-F "chat_id=${TG_CHAT_ID}" \
-F "photo=@${SCREENSHOT_PATH}"
Telegram 配置:
telegram:alzmoltis_bot:<chat_id>)curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"x":100,"y":200}' http://127.0.0.1:18792/click
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"selector":"button.submit"}' http://127.0.0.1:18792/click
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"text":"要输入的内容"}' http://127.0.0.1:18792/type
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"key":"Enter"}' http://127.0.0.1:18792/keypress
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"y":300}' http://127.0.0.1:18792/scroll
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"expression":"document.title"}' http://127.0.0.1:18792/evaluate
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"selector":".target-element","timeout":5000}' http://127.0.0.1:18792/wait
# 新建标签页
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"url":"https://example.com"}' http://127.0.0.1:18792/tab/new
# 切换标签页
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"tab_id":"xxx"}' http://127.0.0.1:18792/tab/activate
# 关闭标签页
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"tab_id":"xxx"}' http://127.0.0.1:18792/tab/close
./screenshots/ 并带时间戳sleep 0.5~1 模拟人类节奏bash start.sh stop