名称: ngrok-unofficial-webhook-skill
描述: 启动 ngrok 隧道以接收传入的 Webhook,并通过 LLM 进行处理。当用户要求监听 Webhook、设置 Webhook 端点、启动 ngrok,或其他技能(如 Zoom RTMS Meeting Assistant)需要公共 Webhook URL 时使用。接收 Webhook 负载,并让 LLM 决定如何处理。
通过 ngrok 启动一个公共 Webhook 端点。传入的 Webhook 会自动路由到匹配的技能,或呈现给用户进行手动处理。
cd skills/ngrok-unofficial-webhook-skill
npm install
在技能的 .env 文件中设置(可从 .env.example 复制)。
必需:
- NGROK_AUTHTOKEN — 来自 https://dashboard.ngrok.com 的 ngrok 认证令牌
可选:
- NGROK_DOMAIN — 用于保持 URL 稳定的 ngrok 域名
- WEBHOOK_PORT — 本地端口(默认:4040)
- WEBHOOK_PATH — Webhook 路径(默认:/webhook)
- OPENCLAW_BIN — openclaw 二进制文件路径(默认:openclaw)
- OPENCLAW_NOTIFY_CHANNEL — 通知渠道(默认:whatsapp)
- OPENCLAW_NOTIFY_TARGET — 通知的电话号码/目标
作为后台进程运行:
cd skills/ngrok-unofficial-webhook-skill
node scripts/webhook-server.js
服务器会将其公共 URL 打印到 stderr:
NGROK_URL=https://xxxx.ngrok-free.app
Webhook endpoint: https://xxxx.ngrok-free.app/webhook
如需长期运行,可使用 nohup 启动:
nohup node scripts/webhook-server.js >> /tmp/ngrok-webhook.log 2>&1 &
skill.json 中声明了 webhookEvents 的技能forwardPort → 向本地服务发起 HTTP POST 请求webhookCommands → 运行配置的 shell 命令技能通过在 skill.json 中添加 webhookEvents 来选择加入 Webhook 处理:
{
"openclaw": {
"webhookEvents": ["meeting.rtms_started", "meeting.rtms_stopped"],
"forwardPort": 4048,
"forwardPath": "/"
}
}
对于基于命令的自动处理(无需运行服务):
{
"openclaw": {
"webhookEvents": ["recording.completed"],
"webhookCommands": {
"recording.completed": {
"command": "python3 scripts/download.py {{meeting_id}}",
"description": "下载云端录制",
"meetingIdPath": "payload.object.id"
}
}
}
}
command — 要运行的 shell 命令;{{meeting_id}} 会被替换为提取的值meetingIdPath — 从 Webhook 负载中提取会议 ID 的点分隔路径description — 用于通知的人类可读描述ngrok 技能会扫描所有同级技能文件夹中带有这些字段的 skill.json 文件。
服务器还将每个 Webhook 作为 JSON 行写入 stdout,以便进程轮询:
{
"id": "uuid",
"timestamp": "ISO-8601",
"method": "POST",
"path": "/webhook",
"query": {},
"body": {}
}
curl http://localhost:4040/health
完成后终止后台进程。
典型流程:
1. 启动此 Webhook 监听器 → 获取 ngrok URL
2. 在您的 Zoom Marketplace 应用的 Webhook 设置中配置此 ngrok URL
3. 当 RTMS 开始时,Zoom 发送 meeting.rtms_started → 自动转发给 RTMS Meeting Assistant
4. 当 RTMS 停止时,Zoom 发送 meeting.rtms_stopped → 自动转发,触发清理