Skill: blogwebsem/bazhuayu-webhook (version 2.0.4)

--- name: bazhuayu-rpa-webhook description: 八爪鱼 RPA Webhook 调用工具 - 通过 Webhook 触发 RPA 任务运行，支持自定义参数传递 description_en: Octoparse RPA Webhook Tool - Trigger RPA tasks via Webhook with custom parameters metadata: {"clawdbot":{"emoji":"🐙","requires":{"bins":["python3"],"env":["BAZHUAYU_WEBHOOK_URL","BAZHUAYU_WEBHOOK_KEY"]},"primaryEnv":"BAZHUAYU_WEBHOOK_KEY","install":[{"id":"copy","kind":"copy","label":"复制 Skill 目录","description":"将 bazhuayu-rpa-webhook 目录复制到你的技能目录"}]}} --- # 八爪鱼 RPA Webhook 调用技能 (图文教程版 v2.0.4) 通过 Webhook 触发八爪鱼 RPA 任务运行，支持自定义参数传递。 ## ⚠️ 使用前必读 **本技能需要配置以下环境变量才能运行：** | 变量名 | 说明 | 是否必需 | |--------|------|----------| | `BAZHUAYU_WEBHOOK_URL` | 八爪鱼 RPA Webhook 地址 | **必需** | | `BAZHUAYU_WEBHOOK_KEY` | 签名密钥 | **必需** | **配置方式（二选一）：** 1. **推荐**：手动添加到 shell 配置文件 (`~/.bashrc` 或 `~/.zshrc`) 2. **临时**：在当前终端会话中使用 `export` 命令 详见下方「🔧 快速配置」章节。 --- ## 🔐 安全特性 (v2.0 新增) - ✅ **环境变量支持** - 敏感信息使用环境变量存储 (优先级高于配置文件) - ✅ **文件权限保护** - 配置文件自动设置为 600 (仅所有者可读写) - ✅ **日志脱敏** - 输出自动隐藏敏感信息 - ✅ **安全检查** - `secure-check` 命令帮助发现潜在风险 - ✅ **一键配置** - `setup-secure.sh` 快速安全配置 - ✅ **迁移工具** - `migrate-to-env.sh` 从旧配置迁移 ## 📦 安装 ### 方式一：从 ClawHub 安装 ```bash clawhub install bazhuayu-webhook ``` ### 方式二：手动复制 ```bash # 复制 skill 目录 cp -r ~/.openclaw/workspace/skills/bazhuayu-webhook /你的路径/ # 进入目录 cd /你的路径/bazhuayu-webhook ``` ## 🚀 快速配置 ### 方式一：运行配置向导（推荐） ```bash ./setup-secure.sh ``` 按提示输入 Webhook URL 和签名密钥，脚本会： - 生成环境变量配置示例 - 更新 `config.json`（密钥留空，从环境变量读取） - **不会**自动修改你的 shell 配置文件 **配置完成后，请手动将 export 命令添加到 `~/.bashrc` 或 `~/.zshrc`** ### 方式二：手动配置环境变量 编辑 `~/.bashrc` 或 `~/.zshrc`，添加： ```bash export BAZHUAYU_WEBHOOK_URL="你的 Webhook URL" export BAZHUAYU_WEBHOOK_KEY="你的签名密钥" ``` 然后执行： ```bash source ~/.bashrc # 或 source ~/.zshrc ``` ### 方式三：临时配置（仅当前终端会话） ```bash export BAZHUAYU_WEBHOOK_URL="你的 Webhook URL" export BAZHUAYU_WEBHOOK_KEY="你的签名密钥" ``` ### 验证配置 ```bash python3 bazhuayu-webhook.py secure-check ``` ## 🔧 使用方法 ### 运行任务（使用默认参数） ```bash python3 bazhuayu-webhook.py run ``` ### 运行任务（指定参数值） ```bash python3 bazhuayu-webhook.py run --A=新值 --B=新值 ``` ### 测试模式（不实际发送） ```bash python3 bazhuayu-webhook.py test ``` ### 查看配置 ```bash python3 bazhuayu-webhook.py config ``` ### 安全检查 ⭐ ```bash python3 bazhuayu-webhook.py secure-check ``` ## 📝 配置文件 `config.json` - 存储 Webhook URL、参数配置（**v2.0 起密钥建议使用环境变量**） ```json { "url": "Webhook 地址", "key": "", "paramNames": ["A", "B"], "defaultParams": {"A": "默认值 A", "B": "默认值 B"}, "security": { "keyFromEnv": true, "version": "2.0" } } ``` ### 环境变量 | 变量名 | 说明 | 是否必需 | 优先级 | |--------|------|----------|--------| | `BAZHUAYU_WEBHOOK_URL` | Webhook URL | **必需** | 高于配置文件 | | `BAZHUAYU_WEBHOOK_KEY` | 签名密钥 | **必需** | 高于配置文件 | | `BAZHUAYU_PARAM_*` | 参数默认值 | 可选 | 高于配置文件 | **如何设置环境变量：** 1. **永久生效**（推荐）：添加到 `~/.bashrc` 或 `~/.zshrc` ```bash export BAZHUAYU_WEBHOOK_URL="你的 URL" export BAZHUAYU_WEBHOOK_KEY="你的密钥" ``` 2. **临时生效**（仅当前终端）： ```bash export BAZHUAYU_WEBHOOK_URL="你的 URL" export BAZHUAYU_WEBHOOK_KEY="你的密钥" ``` ## 🔐 签名算法 ``` string_to_sign = timestamp + "\n" + key sign = Base64(HmacSHA256(string_to_sign, message="")) ``` 本工具已自动处理签名计算，无需手动操作。 ## 📤 返回结果 ### 成功响应（HTTP 200） ```json { "enterpriseId": "企业 ID", "flowId": "应用 ID", "flowProcessNo": "运行批次号" } ``` ### 失败响应（HTTP 400） ```json { "code": "错误码", "description": "错误描述" } ``` 常见错误： - [REDACTED_SECRET] - 签名错误或时间戳过期 - 检查系统时间是否准确 - 检查 Key 是否正确 ## 📁 文件结构 ``` bazhuayu-webhook/ ├── README.md # 使用说明 ├── QUICKSTART.md # 5 分钟快速配置指南 ⭐ ├── SECURITY.md # 安全指南 ├── MANUAL.md # 详细使用手册 ├── SKILL.md # 本文件 ├── bazhuayu-webhook.py # 主程序 (安全增强版 v2.0) ├── setup-secure.sh # 一键安全配置脚本 ⭐ ├── migrate-to-env.sh # 迁移到环境变量脚本 ├── config.json # 配置文件 (敏感，已加入.gitignore) ├── config.example.json # 配置模板 └── .gitignore # Git 忽略规则 ``` ## 📚 文档 - **快速开始**: `QUICKSTART.md` - 5 分钟完成配置 - **详细手册**: `MANUAL.md` - 完整使用指南 - **安全指南**: `SECURITY.md` - 安全最佳实践 ## 🆘 常见问题 ### Q: 如何配置环境变量？ **A**: 1. 编辑 `~/.bashrc` 或 `~/.zshrc` 2. 添加 `export BAZHUAYU_WEBHOOK_URL="..."` 和 `export BAZHUAYU_WEBHOOK_KEY="..."` 3. 运行 `source ~/.bashrc` 或 `source ~/.zshrc` 使配置生效 4. 运行 `python3 bazhuayu-webhook.py secure-check` 验证 ### Q: 签名验证失败？ **A**: 1. 检查系统时间是否准确 2. 检查 Key 是否正确（使用环境变量推荐） 3. 运行 `secure-check` 检查配置 ### Q: 如何迁移旧配置？ **A**: 运行 `./migrate-to-env.sh` 迁移到环境变量模式，然后手动将生成的 export 命令添加到 shell 配置 ### Q: 参数未设置值？ **A**: 检查 `config.json` 中的参数名是否与 RPA 应用中的变量名**完全一致** ### Q: 环境变量不生效？ **A**: 1. 确认已执行 `source ~/.bashrc` 或 `source ~/.zshrc` 2. 运行 `echo $BAZHUAYU_WEBHOOK_KEY` 检查是否已设置 3. 如使用新终端，需重新执行 source 命令 ## 📞 技术支持 - [八爪鱼 RPA 帮助中心](https://rpa.bazhuayu.com/helpcenter) - [Webhook 触发任务文档](https://rpa.bazhuayu.com/helpcenter/docs/skmvua) - [API 接口文档](https://rpa.bazhuayu.com/helpcenter/docs/rpaapi) ## 📋 版本历史 | 版本 | 日期 | 更新内容 | |------|------|----------| | 2.0.4 | 2026-03-08 | 📸 新增图文教程 - Webhook 设置步骤详解，包含截图示例 | | 2.0.3 | 2026-03-08 | 🏷️ 名称优化 - 添加 RPA 关键词便于搜索和发现 | | 2.0.2 | 2026-03-08 | 🔐 日志安全修复 - 新增日志权限自动修复、完善 SKILL.md 元数据环境变量声明 | | 2.0.1 | 2026-03-08 | 🔧 安全优化 - 修复环境变量元数据、移除脚本自动修改 shell 配置、新增手动配置指南 | | 2.0.0 | 2026-03-07 | 🔐 安全增强版 - 新增环境变量支持、安全检查、配置脚本 | | 1.0.1 | 2026-03-07 | 🎉 初始公开发布 | | 1.0.0 | - | 初始版本（内部迭代） | ## 📄 许可证 MIT License

path: CHANGES-v2.0.md
content: # v2.0 优化变更说明

## 📋 变更原因

根据用户反馈，v2.0 版本存在以下问题：

1. **元数据不匹配** - `package.json` 声明环境变量为"可选"，但实际代码和文档要求为"必需"
2. **脚本过于侵入性** - `setup-secure.sh` 和 `migrate-to-env.sh` 自动修改用户 `~/.bashrc` 或 `~/.zshrc`
3. **持久化风险** - 密钥以明文形式存储在 shell 配置文件中，用户可能不知情

## ✅ 已完成的优化

### 1. 修复元数据不匹配

**文件**: `package.json`

**变更**:
```json
// 修改前
"env": [
  "BAZHUAYU_WEBHOOK_URL (可选)",
  "BAZHUAYU_WEBHOOK_KEY (可选)"
]

// 修改后
"env": [
  "BAZHUAYU_WEBHOOK_URL (必需)",
  "BAZHUAYU_WEBHOOK_KEY (必需)"
]
```

### 2. 移除脚本的自动修改 shell 配置功能

**文件**: `setup-secure.sh`, `migrate-to-env.sh`

**变更**:
- ❌ 移除：自动 `>> ~/.bashrc` 或 `>> ~/.zshrc` 追加配置
- ❌ 移除：自动 `sed -i` 修改 shell 配置文件
- ✅ 新增：在脚本开头显示明确警告，告知用户不会自动修改 shell 配置
- ✅ 新增：生成 `.env.example` 或 `.env.migrated` 文件供用户参考
- ✅ 新增：提示用户手动将 export 命令添加到 shell 配置
- ✅ 保留：可选的当前会话临时设置（仅本次终端有效）

### 3. 更新文档说明

**文件**: `SKILL.md`, `README.md`, `QUICKSTART.md`

**变更**:
- ✅ 在 `SKILL.md` 开头添加「⚠️ 使用前必读」章节，明确说明环境变量为必需
- ✅ 更新配置步骤，强调需要手动添加环境变量
- ✅ 更新常见问题，添加环境变量配置相关 FAQ
- ✅ 所有文档中移除「自动完成配置」等误导性描述

### 4. 新增手动配置指南

**文件**: `MANUAL_SETUP.md` (新增)

**内容**:
- 详细的手动配置步骤（Linux/macOS/Windows）
- 验证配置的方法
- 安全建议
- 故障排除指南

### 5. 更新 .gitignore

**文件**: `.gitignore`

**变更**:
```
# 新增
.env.example
.env.migrated
```

---

## 🔐 安全改进

| 改进项 | 说明 |
|--------|------|
| 透明度提升 | 用户明确知道脚本会做什么，不会做什么 |
| 用户控制权 | 用户自己决定是否修改 shell 配置，如何修改 |
| 减少意外 | 避免因自动修改 shell 配置导致的意外问题 |
| 配置示例隔离 | 生成的 `.env.*` 文件已加入 `.gitignore`，不会泄露 |

---

## 📝 用户影响

### 正面影响
- ✅ 更清楚了解配置过程
- ✅ 完全控制自己的 shell 配置
- ✅ 可以选择适合自己的配置方式

### 需要注意
- ⚠️ 配置步骤略有增加（需要手动添加 export 命令）
- ⚠️ 文档中已明确说明，不影响有经验的用户

---

## 🧪 测试建议

发布前建议测试：

1. **全新配置流程**
   ```bash
   ./setup-secure.sh
   # 检查是否生成 .env.example
   # 检查是否有明确的手动配置提示
   ```

2. **迁移流程**
   ```bash
   ./migrate-to-env.sh
   # 检查是否生成 .env.migrated
   # 检查是否有明确的手动配置提示
   ```

3. **验证流程**
   ```bash
   python3 bazhuayu-webhook.py secure-check
   # 检查是否正确检测环境变量
   ```

4. **文档检查**
   - 阅读 `SKILL.md` 开头是否有明确的环境变量说明
   - 阅读 `MANUAL_SETUP.md` 是否有完整的手动配置指南

---

## 📦 发布前检查清单

- [x] `package.json` 中环境变量标记为"必需"
- [x] `setup-secure.sh` 不自动修改 shell 配置
- [x] `migrate-to-env.sh` 不自动修改 shell 配置
- [x] 脚本开头有明确的警告提示
- [x] `SKILL.md` 开头有环境变量说明
- [x] `MANUAL_SETUP.md` 已创建
- [x] `.gitignore` 包含 `.env.example` 和 `.env.migrated`
- [ ] 用户确认
- [ ] 发布到 ClawHub

---

**待用户确认后发布新版本**


path: MANUAL.md
content: # 八爪鱼 RPA Webhook Skill 完整使用手册

> 📘 本手册详细介绍如何配置和使用八爪鱼 RPA Webhook Skill，实现 OpenClaw 与八爪鱼 RPA 的自动化集成。

---

## 📖 目录

1. [什么是八爪鱼 RPA](#1-什么是八爪鱼-rpa)
2. [前置准备](#2-前置准备)
3. [安装 Skill](#3-安装-skill)
4. [配置八爪鱼 RPA 端](#4-配置八爪鱼-rpa-端)
5. [配置 Skill](#5-配置-skill)
6. [使用示例](#6-使用示例)
7. [与 OpenClaw 集成](#7-与-openclaw-集成)
8. [常见问题排查](#8-常见问题排查)

---

## 1. 什么是八爪鱼 RPA

**八爪鱼 RPA（Octoparse RPA）** 是一款企业级机器人流程自动化平台，支持：

- 🖱️ **网页自动化** - 模拟人工操作浏览器
- 📊 **数据采集** - 从网站提取结构化数据
- ⚙️ **流程编排** - 可视化设计自动化流程
- 🔗 **API 集成** - 通过 Webhook/API 触发任务

### 典型应用场景

| 场景 | 说明 |
|------|------|
| 电商监控 | 自动抓取商品价格、库存变化 |
| 舆情采集 | 定时抓取新闻、社交媒体数据 |
| 数据录入 | 自动填写表单、同步数据 |
| 报表生成 | 定期采集数据并生成报告 |

---

## 2. 前置准备

### 2.1 八爪鱼 RPA 账号

1. 访问 [八爪鱼 RPA 官网](https://rpa.bazhuayu.com/)
2. 注册/登录账号
3. 完成企业认证（如需使用 Webhook 功能）

### 2.2 环境要求

| 项目 | 要求 |
|------|------|
| Python | 3.6+ |
| 系统 | Linux / macOS / Windows |
| 网络 | 可访问八爪鱼 API 服务器 |

### 2.3 检查 Python 环境

```bash
python3 --version
# 应输出 Python 3.x.x
```

---

## 3. 安装 Skill

### 方式一：复制现有 Skill（推荐）

Skill 已存在于你的 OpenClaw 工作区：

```bash
# 进入工作区
cd ~/.openclaw/workspace/skills/

# 确认目录存在
ls -la bazhuayu-webhook/
```

### 方式二：从 ClawHub 安装（如已发布）

```bash
clawhub install bazhuayu-webhook
```

### 方式三：手动创建

```bash
# 创建目录
mkdir -p ~/.openclaw/workspace/skills/bazhuayu-webhook
cd ~/.openclaw/workspace/skills/bazhuayu-webhook

# 下载主程序（需要主程序文件）
# 将 bazhuayu-webhook.py 放入此目录
```

---

## 4. 配置八爪鱼 RPA 端

### 4.1 创建 Webhook 触发器

在使用 Webhook 之前，首先需要在八爪鱼 RPA 中创建 Webhook 触发器。

#### 步骤 1：进入触发器管理

1. 登录 [八爪鱼 RPA 控制台](https://rpa.bazhuayu.com/)
2. 进入【触发器】栏目
3. 点击 **"Webhook 触发器"**

#### 步骤 2：填写触发器信息

按顺序填写以下信息：

1. **触发器名称** → 输入易于识别的名称
   - 示例：`订单处理 `、`数据采集 `、` 每日报表`
   
2. **指定运行的机器人** → 选择要执行任务的机器人
   - 选择已配置好的机器人
   
3. **选择要运行的应用** → 选择对应的 RPA 应用
   - 选择你创建好的 RPA 流程/应用
   
4. 点击 **"确定"** 保存

#### 步骤 3：获取 Webhook 信息

创建成功后，会显示 Webhook 的详细信息：

| 信息 | 说明 | 示例 |
|------|------|------|
| **Webhook URL** | 调用接口地址 | `https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke` |
| **签名密钥 (Key)** | 用于签名验证 | `a1b2c3d4e5f6g7h8` |

⚠️ **重要**：请立即复制并保存这两个信息，后续配置需要用到！

#### 步骤 4：启动触发器

⚠️ **必须勾选**："启动触发器"

- 未勾选则 Webhook 不会生效
- 勾选后状态显示为"运行中"

### 4.2 创建 RPA 应用

1. 登录 [八爪鱼 RPA 控制台](https://rpa.bazhuayu.com/)
2. 点击「创建应用」或「新建流程」
3. 设计你的自动化流程（使用可视化编辑器）

### 4.2 设置输入变量

在流程设计中添加**输入变量**：

1. 点击「变量」→「添加变量」
2. 设置变量名（如：`keyword`、`url`、`startDate`）
3. 设置默认值（可选）

> ⚠️ **重要**：记住变量名，后续配置需要完全一致！

### 4.3 创建 Webhook 触发器

1. 进入应用详情页
2. 点击「触发器」→「新建触发器」
3. 选择触发类型为 **Webhook**
4. 配置触发器：
   - **触发器名称**：自定义（如：OpenClaw 触发）
   - **签名密钥**：点击生成或自定义（请妥善保存！）
   - **允许的参数**：选择你创建的输入变量

5. 保存后复制 **Webhook URL**

### 4.4 记录关键信息

创建完成后，请记录以下信息：

```
✅ Webhook URL: https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke
✅ 签名密钥：your-secret-key-here
✅ 参数名称：keyword, url, startDate
✅ 参数默认值：测试关键词，https://example.com, 2026-01-01
```

---

## 5. 配置 Skill

### 5.1 初始化配置

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
python3 bazhuayu-webhook.py init
```

### 5.2 或手动编辑配置文件

创建/编辑 `config.json`：

```bash
# 复制配置模板
cp config.example.json config.json

# 编辑配置
vim config.json
# 或使用你喜欢的编辑器
```

### 5.3 配置文件格式

```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/你的 webhook ID/invoke",
  "key": "你的签名密钥",
  "paramNames": ["keyword", "url", "startDate"],
  "defaultParams": {
    "keyword": "默认搜索词",
    "url": "https://example.com",
    "startDate": "2026-01-01"
  }
}
```

### 5.4 配置项说明

| 字段 | 必填 | 说明 |
|------|------|------|
| `url` | ✅ | Webhook 接口完整 URL |
| `key` | ✅ | 签名密钥（区分大小写） |
| `paramNames` | ✅ | 参数名称数组，顺序不限 |
| `defaultParams` | ❌ | 参数默认值，键名需与 paramNames 对应 |

### 5.5 验证配置

```bash
# 查看当前配置
python3 bazhuayu-webhook.py config

# 测试模式（不实际发送）
python3 bazhuayu-webhook.py test
```

---

## 6. 使用示例

### 6.1 运行任务（使用默认参数）

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
python3 bazhuayu-webhook.py run
```

**输出示例：**
```
✅ 任务已触发！
   企业 ID: ent_xxxxx
   应用 ID: flow_xxxxx
   运行批次：20260307001
```

### 6.2 运行任务（指定参数）

```bash
# 单个参数
python3 bazhuayu-webhook.py run --keyword=人工智能

# 多个参数
python3 bazhuayu-webhook.py run --keyword=AI --url=https://news.example.com --startDate=2026-03-01
```

### 6.3 创建快捷命令

编辑 Shell 配置文件（`~/.bashrc` 或 `~/.zshrc`）：

```bash
# 添加别名
alias rpa-run='cd ~/.openclaw/workspace/skills/bazhuayu-webhook && python3 bazhuayu-webhook.py run'
alias rpa-config='cd ~/.openclaw/workspace/skills/bazhuayu-webhook && python3 bazhuayu-webhook.py config'

# 使配置生效
source ~/.bashrc
```

之后可以直接运行：
```bash
rpa-run --keyword=测试
```

### 6.4 在脚本中调用

```bash
#!/bin/bash
# run-rpa-task.sh

SKILL_DIR=~/.openclaw/workspace/skills/bazhuayu-webhook
KEYWORD=$1
URL=$2

cd $SKILL_DIR
python3 bazhuayu-webhook.py run --keyword="$KEYWORD" --url="$URL"
```

---

## 7. 与 OpenClaw 集成

### 7.1 在 OpenClaw Skill 中调用

创建新的 OpenClaw Skill 来封装 RPA 调用：

```python
# ~/.openclaw/workspace/skills/my-rpa-automation/rpa_caller.py

import subprocess
import json

def run_rpa_task(keyword=None, url=None):
    """调用八爪鱼 RPA 任务"""
    
    cmd = [
        "python3",
        "~/.openclaw/workspace/skills/bazhuayu-webhook/bazhuayu-webhook.py",
        "run"
    ]
    
    if keyword:
        cmd.append(f"--keyword={keyword}")
    if url:
        cmd.append(f"--url={url}")
    
    result = subprocess.run(cmd, capture_output=True, text=True)
    return result.stdout
```

### 7.2 创建自动化流程示例

**场景**：用户说"采集新闻"时自动触发 RPA

```python
# 在 OpenClaw 的自定义技能中
async def handle_news_collection(user_message):
    # 从用户消息提取关键词
    keyword = extract_keyword(user_message)
    
    # 调用 RPA
    result = run_rpa_task(keyword=keyword, url="https://news.example.com")
    
    # 返回结果给用户
    return f"已启动新闻采集任务，关键词：{keyword}"
```

### 7.3 定时任务集成

结合 OpenClaw 的 cron 技能实现定时采集：

```bash
# 每天上午 9 点自动运行
0 9 * * * cd ~/.openclaw/workspace/skills/bazhuayu-webhook && python3 bazhuayu-webhook.py run
```

---

## 8. 常见问题排查

### 8.1 签名验证失败

**错误信息：** `SignatureVerificationFailureOrTimestampExpired`

**解决方案：**

1. **检查系统时间**
   ```bash
   date
   # 确保时间与网络时间同步
   ```

2. **同步系统时间**
   ```bash
   # Linux
   sudo ntpdate pool.ntp.org
   
   # 或使用 timedatectl
   sudo timedatectl set-ntp true
   ```

3. **检查签名密钥**
   - 确认 Key 复制完整，无多余空格
   - 确认 Key 区分大小写

### 8.2 参数未设置值

**错误信息：** 参数值为空或使用默认值

**解决方案：**

1. **检查参数名拼写**
   ```bash
   # 查看配置文件
   cat config.json | jq .paramNames
   ```

2. **确认参数名完全一致**
   - 包括空格、大小写
   - 中文参数名注意编码

3. **测试模式验证**
   ```bash
   python3 bazhuayu-webhook.py test
   # 查看实际发送的参数
   ```

### 8.3 网络连接失败

**错误信息：** 连接超时或无法访问 API

**解决方案：**

1. **检查网络连通性**
   ```bash
   curl -I https://api-rpa.bazhuayu.com/
   ```

2. **检查防火墙设置**
   ```bash
   # 确保 443 端口开放
   sudo ufw allow 443/tcp
   ```

3. **检查代理设置**
   ```bash
   # 如有代理，配置环境变量
   export https_proxy=http://your-proxy:port
   ```

### 8.4 Python 环境问题

**错误信息：** `ModuleNotFoundError` 或 `python3: command not found`

**解决方案：**

1. **安装 Python 3**
   ```bash
   # Ubuntu/Debian
   sudo apt install python3 python3-pip
   
   # macOS
   brew install python3
   
   # CentOS/RHEL
   sudo yum install python3
   ```

2. **安装依赖**
   ```bash
   pip3 install requests
   ```

### 8.5 权限问题

**错误信息：** `Permission denied`

**解决方案：**

```bash
# 赋予执行权限
chmod +x bazhuayu-webhook.py
chmod +x bazhuayu-webhook

# 或使用 python3 直接运行
python3 bazhuayu-webhook.py run
```

---

## 📞 技术支持

### 官方文档

- [八爪鱼 RPA 帮助中心](https://rpa.bazhuayu.com/helpcenter)
- [Webhook 触发任务文档](https://rpa.bazhuayu.com/helpcenter/docs/skmvua)
- [API 接口文档](https://rpa.bazhuayu.com/helpcenter/docs/rpaapi)

### 获取帮助

1. 查看本手册的常见问题章节
2. 使用测试模式调试：`python3 bazhuayu-webhook.py test`
3. 查看八爪鱼 RPA 控制台的运行日志
4. 联系 OpenClaw 社区或技能作者

---

## 📝 更新日志

| 版本 | 日期 | 更新内容 |
|------|------|----------|
| 1.0 | 2026-03-07 | 初始版本，支持基础 Webhook 调用 |
| 1.1 | TBD | 计划支持批量任务、异步回调 |

---

**🎉 祝你使用愉快！如有问题欢迎反馈。**


path: MANUAL_SETUP.md
content: # 手动配置指南

本指南介绍如何**手动配置**八爪鱼 RPA Webhook 技能，无需运行任何脚本。

## 📋 前置条件

- 已获取八爪鱼 RPA Webhook URL
- 已获取签名密钥 (Key)
- Python 3.6+ 已安装

---

## 步骤 1：设置环境变量

### Linux / macOS

编辑你的 shell 配置文件：

```bash
# 使用 bash
nano ~/.bashrc

# 或使用 zsh
nano ~/.zshrc
```

在文件末尾添加：

```bash
# 八爪鱼 RPA Webhook 配置
export BAZHUAYU_WEBHOOK_URL="https://rpa.bazhuayu.com/api/v1/trigger/xxx"
export BAZHUAYU_WEBHOOK_KEY="你的签名密钥"
```

保存后执行：

```bash
source ~/.bashrc  # 或 source ~/.zshrc
```

### Windows (PowerShell)

编辑 PowerShell 配置文件：

```powershell
notepad $PROFILE
```

添加：

```powershell
$env:BAZHUAYU_WEBHOOK_URL="https://rpa.bazhuayu.com/api/v1/trigger/xxx"
$env:BAZHUAYU_WEBHOOK_KEY="你的签名密钥"
```

保存后重启 PowerShell 或执行：

```powershell
. $PROFILE
```

### Windows (命令提示符)

临时设置（仅当前会话）：

```cmd
set BAZHUAYU_WEBHOOK_URL=https://rpa.bazhuayu.com/api/v1/trigger/xxx
set BAZHUAYU_WEBHOOK_KEY=你的签名密钥
```

永久设置需要通过系统环境变量设置界面。

---

## 步骤 2：验证配置

运行以下命令检查环境变量是否已设置：

```bash
echo $BAZHUAYU_WEBHOOK_URL
echo $BAZHUAYU_WEBHOOK_KEY
```

应该能看到你设置的值（密钥会显示完整值，请注意不要泄露）。

---

## 步骤 3：初始化配置文件

```bash
python3 bazhuayu-webhook.py init
```

这会创建 `config.json` 文件。

---

## 步骤 4：安全检查

```bash
python3 bazhuayu-webhook.py secure-check
```

确保所有检查项都通过。

---

## 步骤 5：测试连接

```bash
python3 bazhuayu-webhook.py test
```

如果测试成功，说明配置完成！

---

## 🔐 安全建议

1. **不要将密钥提交到版本控制**
   - `config.json` 已加入 `.gitignore`
   - 不要将包含密钥的截图或日志公开

2. **使用强密钥**
   - 建议至少 16 个字符
   - 包含大小写字母、数字和特殊字符

3. **限制文件权限**
   ```bash
   chmod 600 config.json
   ```

4. **定期轮换密钥**
   - 在八爪鱼 RPA 控制台更新密钥后
   - 同步更新环境变量

---

## 🆘 故障排除

### 环境变量不生效

1. 确认已执行 `source ~/.bashrc` 或 `source ~/.zshrc`
2. 打开新终端后需要重新执行 source
3. 检查拼写是否正确（区分大小写）

### 配置文件权限问题

```bash
chmod 600 config.json
```

### 其他问题

运行 `secure-check` 查看详细诊断信息。


path: QUICKSTART.md
content: # 快速配置指南 - 安全模式

> 📝 5 分钟完成安全配置，签名密钥使用环境变量存储

---

## 📖 第一步：获取 Webhook URL 和签名

在配置技能之前，首先需要在八爪鱼 RPA 中创建 Webhook 触发器。

### 步骤 1：创建 Webhook 触发器

1. 登录 [八爪鱼 RPA 控制台](https://rpa.bazhuayu.com/)
2. 进入【触发器】栏目
3. 点击 **"Webhook 触发器"**

### 步骤 2：填写触发器信息

按顺序填写：

1. **触发器名称** → 输入易于识别的名称（如：订单处理、数据采集等）
2. **指定运行的机器人** → 选择要执行任务的机器人
3. **选择要运行的应用** → 选择对应的 RPA 应用
4. 点击 **"确定"**

### 步骤 3：获取 Webhook 信息

创建成功后，会显示 Webhook 的详细信息：

- **Webhook URL** → 复制保存（格式：`https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke`）
- **签名密钥 (Key)** → 复制保存（用于签名验证）

### 步骤 4：启动触发器

⚠️ **重要**：勾选 **"启动触发器"**，否则 Webhook 不会生效！

---

## 🚀 方式一：运行配置向导（推荐）

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
./setup-secure.sh
```

按提示输入：
1. Webhook URL
2. 签名密钥

脚本会生成环境变量配置示例，**但不会自动修改你的 shell 配置文件**。

配置完成后，请手动将 export 命令添加到 `~/.bashrc` 或 `~/.zshrc`。

---

## 📝 方式二：手动配置

### 步骤 1: 设置环境变量

```bash
# 临时设置（当前终端会话）
export BAZHUAYU_WEBHOOK_KEY="你的签名密钥"
export BAZHUAYU_WEBHOOK_URL="https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke"

# 永久设置（添加到 ~/.bashrc 或 ~/.zshrc）
echo 'export BAZHUAYU_WEBHOOK_KEY="你的签名密钥"' >> ~/.bashrc
echo 'export BAZHUAYU_WEBHOOK_URL="https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke"' >> ~/.bashrc
source ~/.bashrc
```

### 步骤 2: 编辑配置文件

```bash
vim config.json
```

填入配置（**key 留空**）：

```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/你的 ID/invoke",
  "key": "",
  "paramNames": ["keyword", "url"],
  "defaultParams": {
    "keyword": "默认关键词",
    "url": "https://example.com"
  }
}
```

### 步骤 3: 验证配置

```bash
python3 bazhuayu-webhook.py secure-check
```

应显示：
```
✅ 配置文件权限正确 (600)
✅ 签名密钥使用环境变量存储
✅ Webhook URL 使用环境变量存储
```

### 步骤 4: 测试连接

```bash
python3 bazhuayu-webhook.py test
```

---

## 🔄 从旧配置迁移

如果已有配置存储在 config.json 中：

```bash
./migrate-to-env.sh
```

自动完成：
- ✅ 提取密钥到环境变量配置示例
- ✅ 更新配置文件移除密钥
- ✅ 备份原配置
- ⚠️ **不会**自动更新 Shell 配置文件（需手动添加）

迁移完成后，请手动将 export 命令添加到 `~/.bashrc` 或 `~/.zshrc`。

---

## ✅ 验证清单

配置完成后检查：

- [ ] `echo $BAZHUAYU_WEBHOOK_KEY` 显示密钥（部分）
- [ ] `python3 bazhuayu-webhook.py secure-check` 无警告
- [ ] `python3 bazhuayu-webhook.py test` 成功

---

## 🆘 常见问题

### Q: 环境变量不生效？

```bash
# 检查是否设置
echo $BAZHUAYU_WEBHOOK_KEY

# 重新加载 Shell 配置
source ~/.bashrc  # 或 source ~/.zshrc
```

### Q: 如何修改密钥？

```bash
# 1. 编辑 Shell 配置文件
vim ~/.bashrc

# 2. 修改 export 行
export BAZHUAYU_WEBHOOK_KEY="新密钥"

# 3. 重新加载
source ~/.bashrc
```

### Q: 可以 URL 用配置文件，密钥用环境变量吗？

可以！这正是推荐做法：

```json
{
  "url": "https://...",  // 配置文件存储（非敏感）
  "key": ""              // 留空，从环境变量读取
}
```

---

**配置完成后，运行 `python3 bazhuayu-webhook.py run` 开始使用！**


path: README.md
content: # 八爪鱼 RPA Webhook 调用工具 (安全增强版)

通过 Webhook 触发八爪鱼 RPA 任务运行，支持自定义参数传递。

## 🔐 安全特性

- ✅ **环境变量支持** - 敏感信息可使用环境变量存储 (优先级高于配置文件)
- ✅ **文件权限保护** - 配置文件自动设置为 600 (仅所有者可读写)
- ✅ **日志脱敏** - 输出自动隐藏敏感信息
- ✅ **安全检查** - `secure-check` 命令帮助发现潜在风险

### 推荐配置方式

| 信息类型 | 推荐存储方式 | 说明 |
|----------|--------------|------|
| 签名密钥 | 环境变量 | `BAZHUAYU_WEBHOOK_KEY` |
| Webhook URL | 环境变量或配置文件 | `BAZHUAYU_WEBHOOK_URL` |
| 参数默认值 | 配置文件或环境变量 | 非敏感值可用配置文件 |

---

## 📦 安装

### 方式一：直接复制

```bash
# 复制整个 skill 目录
cp -r /path/to/bazhuayu-webhook ~/your/path/

# 进入目录
cd ~/your/path/bazhuayu-webhook
```

### 方式二：从 ClawHub 安装（待发布）

```bash
clawhub install bazhuayu-webhook
```

---

## 📖 第一步：获取 Webhook URL 和签名

在配置技能之前，首先需要在八爪鱼 RPA 中创建 Webhook 触发器。

### 步骤 1：创建 Webhook 触发器

1. 登录 [八爪鱼 RPA 控制台](https://rpa.bazhuayu.com/)
2. 进入【触发器】栏目
3. 点击 **"Webhook 触发器"**

### 步骤 2：填写触发器信息

按顺序填写：

1. **触发器名称** → 输入易于识别的名称（如：订单处理、数据采集等）
2. **指定运行的机器人** → 选择要执行任务的机器人
3. **选择要运行的应用** → 选择对应的 RPA 应用
4. 点击 **"确定"**

### 步骤 3：获取 Webhook 信息

创建成功后，会显示 Webhook 的详细信息：

- **Webhook URL** → 复制保存（格式：`https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke`）
- **签名密钥 (Key)** → 复制保存（用于签名验证）

### 步骤 4：启动触发器

⚠️ **重要**：勾选 **"启动触发器"**，否则 Webhook 不会生效！

---

## ⚙️ 第二步：配置技能

### 方式一：运行配置向导（推荐）

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
./setup-secure.sh
```

按提示输入 Webhook URL 和签名密钥，脚本会：
- ✅ 生成环境变量配置示例
- ✅ 创建安全的配置文件（权限 600）
- ⚠️ **不会**自动修改 Shell 配置文件（需手动添加）

**配置完成后，请手动将 export 命令添加到 `~/.bashrc` 或 `~/.zshrc`**

### 方式二：手动初始化

```bash
python3 bazhuayu-webhook.py init
```

按提示输入以下信息：

| 配置项 | 说明 | 获取方式 |
|--------|------|----------|
| **Webhook URL** | 八爪鱼 Webhook 接口地址 | 从八爪鱼 RPA 触发器页面复制 |
| **签名密钥 (Key)** | Webhook 的签名密钥 | 从八爪鱼 RPA 触发器页面复制 |
| **参数名称** | RPA 应用的输入变量名 | 如：A, B 或 参数 1, 参数 2 |
| **默认参数值** | 每个参数的默认值 | 可选，方便快速运行 |

按提示输入以下信息：

| 配置项 | 说明 | 获取方式 |
|--------|------|----------|
| **Webhook URL** | 八爪鱼 Webhook 接口地址 | 从八爪鱼 RPA 触发器页面复制 |
| **签名密钥 (Key)** | Webhook 的签名密钥 | 从八爪鱼 RPA 触发器页面复制 |
| **参数名称** | RPA 应用的输入变量名 | 如：A, B 或 参数 1, 参数 2 |
| **默认参数值** | 每个参数的默认值 | 可选，方便快速运行 |

---

## 🚀 使用方法

### 运行任务（使用默认参数）

```bash
python3 bazhuayu-webhook.py run
```

### 运行任务（指定参数值）

```bash
python3 bazhuayu-webhook.py run --A=值 1 --B=值 2
```

**参数名根据实际配置而定**，例如：
```bash
# 如果参数名是 参数 1 和 参数 2
python3 bazhuayu-webhook.py run --参数 1=李飞 --参数 2=来了

# 如果参数名是 A 和 B
python3 bazhuayu-webhook.py run --A=aa --B=bb
```

### 测试模式（不实际发送）

```bash
python3 bazhuayu-webhook.py test
```

查看将要发送的请求内容，用于调试。

### 查看当前配置

```bash
python3 bazhuayu-webhook.py config
```

### 安全检查

```bash
python3 bazhuayu-webhook.py secure-check
```

检查项目：
- ✅ 配置文件权限是否为 600
- ✅ 敏感信息是否使用环境变量
- ✅ 是否在版本控制中泄露
- ✅ 日志文件权限是否安全

### 迁移到环境变量（已有配置）

如果已有配置存储在 config.json 中，可运行迁移脚本：

```bash
./migrate-to-env.sh
```

功能：
- 从配置文件提取敏感信息
- 生成环境变量配置示例
- 更新 config.json 移除密钥
- 自动备份原配置
- ⚠️ **不会**自动修改 Shell 配置文件（需手动添加）

**迁移完成后，请手动将 export 命令添加到 `~/.bashrc` 或 `~/.zshrc`**

---

## 📁 文件结构

```
bazhuayu-webhook/
├── README.md              # 使用说明（本文件）
├── QUICKSTART.md          # 5 分钟快速配置指南 ⭐
├── WEBHOOK_SETUP.md       # Webhook 设置图文教程 ⭐
├── SECURITY.md            # 安全指南
├── MANUAL.md              # 详细使用手册
├── MANUAL_SETUP.md        # 手动配置指南 ⭐
├── SKILL.md               # Skill 元数据
├── bazhuayu-webhook.py    # 主程序 (安全增强版 v2.0)
├── bazhuayu-webhook       # Shell 快捷命令
├── setup-secure.sh        # 配置向导脚本（不修改 shell 配置）
├── migrate-to-env.sh      # 迁移到环境变量脚本（不修改 shell 配置）
├── config.json            # 配置文件 (敏感，已加入.gitignore)
├── config.example.json    # 配置模板
├── .gitignore             # Git 忽略规则
├── images/                # 图文教程图片
└── *.log                  # 日志文件 (敏感，已加入.gitignore)
```

---

## 📝 配置文件说明

`config.json` 格式：

```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke",
  "key": "你的签名密钥",
  "paramNames": ["A", "B"],
  "defaultParams": {
    "A": "默认值 A",
    "B": "默认值 B"
  }
}
```

| 字段 | 说明 |
|------|------|
| `url` | Webhook 接口地址 |
| `key` | 签名密钥（用于计算请求签名） |
| `paramNames` | 参数名称列表 |
| `defaultParams` | 参数默认值（键值对） |

---

## 🔐 签名算法

根据八爪鱼文档，签名计算方式：

```
string_to_sign = timestamp + "\n" + key
sign = Base64(HmacSHA256(string_to_sign, message=""))
```

本工具已自动处理签名计算，无需手动操作。

---

## 📤 返回结果

### 成功响应（HTTP 200）

```json
{
  "enterpriseId": "企业 ID",
  "flowId": "应用 ID",
  "flowProcessNo": "运行批次号"
}
```

### 失败响应（HTTP 400）

```json
{
  "code": "错误码",
  "description": "错误描述"
}
```

常见错误：
- `SignatureVerificationFailureOrTimestampExpired` - 签名错误或时间戳过期
- 检查系统时间是否准确
- 检查 Key 是否正确

---

## 🛠️ 常见问题

### Q: 参数未设置值？
**A**: 检查 `config.json` 中的参数名是否与 RPA 应用中的变量名**完全一致**（包括空格）。

### Q: 签名验证失败？
**A**: 
1. 检查系统时间是否准确
2. 检查 Key 是否正确复制（无多余空格）

### Q: 如何修改默认参数？
**A**: 直接编辑 `config.json` 中的 `defaultParams` 部分。

---

## 📞 技术支持

如有问题，请联系技能作者或参考八爪鱼官方文档：
- [Webhook 触发任务](https://rpa.bazhuayu.com/helpcenter/docs/skmvua)
- [API 接口文档](https://rpa.bazhuayu.com/helpcenter/docs/rpaapi)


path: RELEASE-2.0.1.md
content: # Release Notes - v2.0.1

**发布日期**: 2026-03-08  
**类型**: 安全优化版本

---

## 📋 变更概述

v2.0.1 是针对 v2.0 的安全优化版本，主要解决用户反馈的以下问题：

1. **元数据不匹配** - 环境变量声明与实际要求不一致
2. **脚本过于侵入性** - 自动修改用户 shell 配置文件
3. **文档不够清晰** - 缺少手动配置指南

---

## 🔧 修复内容

### 1. 修复环境变量元数据

**问题**: `package.json` 中环境变量标记为"可选"，但实际为必需

**修复**:
```json
// 修改前
"env": [
  "BAZHUAYU_WEBHOOK_URL (可选)",
  "BAZHUAYU_WEBHOOK_KEY (可选)"
]

// 修改后
"env": [
  "BAZHUAYU_WEBHOOK_URL (必需)",
  "BAZHUAYU_WEBHOOK_KEY (必需)"
]
```

### 2. 移除脚本自动修改 shell 配置功能

**文件**: `setup-secure.sh`, `migrate-to-env.sh`

**变更**:
- ❌ 移除自动 `>> ~/.bashrc` / `~/.zshrc` 追加配置
- ❌ 移除自动 `sed -i` 修改 shell 配置文件
- ✅ 新增脚本开头警告提示，明确告知用户不会自动修改
- ✅ 新增生成 `.env.example` / `.env.migrated` 配置示例文件
- ✅ 新增明确的手动配置指引
- ✅ 保留可选的当前会话临时设置

### 3. 新增文档

**新增文件**:
- `MANUAL_SETUP.md` - 详细的手动配置指南（Linux/macOS/Windows）
- `CHANGES-v2.0.md` - 变更说明文档

**更新文件**:
- `SKILL.md` - 新增「⚠️ 使用前必读」章节
- `README.md` - 更新配置步骤说明
- `QUICKSTART.md` - 更新配置向导说明
- `.gitignore` - 新增 `.env.example` 和 `.env.migrated`

---

## 📦 升级指南

### 从 v2.0 升级

直接覆盖文件即可，配置保持不变：

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook

# 备份现有配置（可选）
cp config.json config.json.backup

# 复制新文件（保留 config.json）
# 从 ClawHub 或手动复制更新的文件
```

### 从 v1.x 升级

建议重新运行配置向导：

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
./setup-secure.sh
```

---

## ✅ 验证清单

升级后请验证：

- [ ] `python3 bazhuayu-webhook.py secure-check` 无警告
- [ ] `python3 bazhuayu-webhook.py test` 成功
- [ ] 环境变量已正确设置

---

## 🔄 版本规范

从 v2.0.1 开始，采用语义化版本号：

- **主版本**.x.x - 重大变更/不兼容更新
- x.**次版本**.x - 新功能/安全增强
- x.x.**修订号** - Bug 修复/小优化

下次发布版本号为 **v2.0.2**

---

**感谢用户反馈帮助改进！**


path: RELEASE-2.0.2.md
content: # Release Notes - v2.0.2

**发布日期**: 2026-03-08  
**类型**: 日志安全修复版本

---

## 📋 变更概述

v2.0.2 是针对 v2.0.1 的快速修复版本，解决用户反馈的两个安全问题：

1. **SKILL.md 元数据不完整** - 缺少环境变量声明
2. **日志文件权限未加固** - `run.log` 可能以默认权限创建

---

## 🔧 修复内容

### 1. 完善 SKILL.md 元数据

**问题**: SKILL.md 的 metadata 中未声明必需的环境变量

**修复**:
```yaml
# 修改前
metadata: {"clawdbot":{"emoji":"🐙","requires":{"bins":["python3"]},...}}

# 修改后
metadata: {
  "clawdbot":{
    "emoji":"🐙",
    "requires":{
      "bins":["python3"],
      "env":["BAZHUAYU_WEBHOOK_URL","BAZHUAYU_WEBHOOK_KEY"]
    },
    "primaryEnv":"BAZHUAYU_WEBHOOK_KEY",
    ...
  }
}
```

**影响**: 
- ✅ ClawHub/ClawDBot 现在能正确识别必需的环境变量
- ✅ 用户在安装时会看到明确的环境变量提示

### 2. 修复日志文件权限

**问题**: `run_daily.sh` 创建日志文件时未设置安全权限

**修复**:

**run_daily.sh**:
```bash
# 新增：确保日志文件存在并设置安全权限 (600)
touch "$LOG_FILE"
chmod 600 "$LOG_FILE"

# ... 运行日志记录 ...

# 新增：再次确保日志文件权限正确（防止被重新创建）
chmod 600 "$LOG_FILE"
```

**bazhuayu-webhook.py** (secure-check 命令):
```python
# 修改前：只检查不修复
if log_perms != '600':
    issues.append(f"日志文件 {log_file.name} 权限不安全 ({log_perms})")

# 修改后：自动修复
if log_perms != '600':
    try:
        os.chmod(log_file, stat.S_IRUSR | stat.S_IWUSR)
        print(f"✅ 已修复 {log_file.name} 权限 ({log_perms} → 600)")
    except Exception as e:
        issues.append(f"日志文件 {log_file.name} 权限不安全 ({log_perms}) 且无法自动修复")
```

**影响**:
- ✅ 日志文件自动设置为 600 权限（仅所有者可读写）
- ✅ `secure-check` 命令会自动修复日志权限问题
- ✅ 防止敏感日志信息泄露

---

## 📦 升级指南

### 从 v2.0.1 升级

直接覆盖文件即可：

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook

# 复制新文件（保留 config.json）
# 从 ClawHub 或手动复制更新的文件
```

### 手动修复日志权限

如果已有日志文件，建议手动修复权限：

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
chmod 600 *.log

# 或运行安全检查自动修复
python3 bazhuayu-webhook.py secure-check
```

---

## ✅ 验证清单

升级后请验证：

- [ ] `python3 bazhuayu-webhook.py secure-check` 无警告
- [ ] `ls -la *.log` 显示权限为 600
- [ ] `./run_daily.sh` 运行后日志权限正确

---

## 🔄 版本规范

采用语义化版本号：

- **主版本**.x.x - 重大变更/不兼容更新
- x.**次版本**.x - 新功能/安全增强
- x.x.**修订号** - Bug 修复/小优化

下次发布版本号为 **v2.0.3**

---

**感谢用户反馈帮助改进！**


path: RELEASE-2.0.3.md
content: # Release Notes - v2.0.3

**发布日期**: 2026-03-08  
**类型**: 名称优化版本

---

## 📋 变更概述

v2.0.3 是名称优化版本，在 skill 名称中添加 **RPA** 关键词，便于用户在 ClawHub 上搜索和发现。

---

## 🔧 修改内容

### 1. package.json

```json
// 修改前
{
  "name": "bazhuayu-webhook",
  "version": "2.0.2"
}

// 修改后
{
  "name": "bazhuayu-rpa-webhook",
  "version": "2.0.3"
}
```

### 2. SKILL.md

```yaml
# 修改前
name: bazhuayu-webhook

# 修改后
name: bazhuayu-rpa-webhook
```

### 3. 安装说明

```bash
# 修改前
clawhub install bazhuayu-webhook

# 修改后
clawhub install bazhuayu-rpa-webhook
```

---

## 📦 升级指南

### 从 v2.x 升级

```bash
# 方式 1: ClawHub 更新
clawhub update bazhuayu-rpa-webhook

# 方式 2: 手动覆盖
cd ~/.openclaw/workspace/skills/
# 复制新文件到 bazhuayu-rpa-webhook 目录
```

### 目录名称

**建议**将目录重命名为 `bazhuayu-rpa-webhook`：

```bash
cd ~/.openclaw/workspace/skills/
mv bazhuayu-webhook bazhuayu-rpa-webhook
```

**注意**: 如果已有 crontab 或脚本引用旧目录名，需要同步更新。

---

## ✅ 验证清单

升级后请验证：

- [ ] `clawhub list` 显示 `bazhuayu-rpa-webhook@2.0.3`
- [ ] `python3 bazhuayu-rpa-webhook.py --help` 正常运行
- [ ] 更新 crontab 或脚本中的目录引用（如有）

---

## 🔄 版本规范

采用语义化版本号：

- **主版本**.x.x - 重大变更/不兼容更新
- x.**次版本**.x - 新功能/安全增强
- x.x.**修订号** - Bug 修复/小优化

下次发布版本号为 **v2.0.4**

---

**名称优化，便于搜索！** 🎉


path: RELEASE-2.0.4.md
content: # Release Notes - v2.0.4

**发布日期**: 2026-03-08  
**类型**: 图文教程版本

---

## 📋 变更概述

v2.0.4 新增**Webhook 设置图文教程**，帮助用户快速了解如何在八爪鱼 RPA 中创建和配置 Webhook 触发器。

---

## 📸 新增内容

### 1. WEBHOOK_SETUP.md（新增文件）

详细的图文教程，包含：

- ✅ **步骤 1**：进入触发器管理
- ✅ **步骤 2**：创建 Webhook 触发器
- ✅ **步骤 3**：填写触发器信息（名称、机器人、应用）
- ✅ **步骤 4**：获取 Webhook URL 和签名密钥
- ✅ **步骤 5**：启动触发器
- ✅ **验证方法**：如何确认 Webhook 已生效
- ✅ **常见问题**：FAQ 和故障排查

### 2. 配套截图（images/ 目录）

| 文件 | 说明 |
|------|------|
| `webhook-setup-1.jpg` | 步骤 1：进入触发器管理 |
| `webhook-setup-2.jpg` | 步骤 2：创建触发器 |
| `webhook-setup-3.jpg` | 步骤 3：填写信息 |

### 3. 更新现有文档

| 文件 | 更新内容 |
|------|----------|
| `README.md` | 新增"第一步：获取 Webhook URL 和签名"章节 |
| `QUICKSTART.md` | 新增"第一步：获取 Webhook URL 和签名"章节 |
| `MANUAL.md` | 更新"配置八爪鱼 RPA 端"章节，添加详细步骤 |

---

## 📖 教程结构

```
bazhuayu-webhook/
├── README.md              # 包含 Webhook 获取步骤
├── QUICKSTART.md          # 包含 Webhook 获取步骤
├── WEBHOOK_SETUP.md       # ⭐ 完整图文教程（新增）
├── MANUAL.md              # 包含详细配置说明
└── images/
    ├── webhook-setup-1.jpg
    ├── webhook-setup-2.jpg
    └── webhook-setup-3.jpg
```

---

## 🎯 用户体验改进

### 修改前
- 用户需要自行查找如何创建 Webhook
- 缺少可视化指导
- 可能遗漏关键步骤（如"启动触发器"）

### 修改后
- ✅ 清晰的图文教程，步步引导
- ✅ 关键步骤有醒目标记（⚠️ 重要提示）
- ✅ 包含验证方法和故障排查
- ✅ 截图直观展示界面和操作

---

## 📦 升级指南

### 从 v2.x 升级

```bash
# 方式 1: ClawHub 更新
clawhub update bazhuayu-rpa-webhook

# 方式 2: 手动覆盖
cd ~/.openclaw/workspace/skills/
# 复制新文件到 bazhuayu-rpa-webhook 目录
```

---

## ✅ 验证清单

升级后请验证：

- [ ] `WEBHOOK_SETUP.md` 文件存在
- [ ] `images/` 目录包含 3 张截图
- [ ] `README.md` 包含 Webhook 获取步骤
- [ ] `QUICKSTART.md` 包含 Webhook 获取步骤

---

## 🔄 版本规范

采用语义化版本号：

- **主版本**.x.x - 重大变更/不兼容更新
- x.**次版本**.x - 新功能/安全增强
- x.x.**修订号** - Bug 修复/小优化

下次发布版本号为 **v2.0.5**

---

**图文教程，让配置更简单！** 🎉


path: RELEASE-v1.0.1.md
content: # 📦 bazhuayu-webhook v1.0.1 发布记录

## ✅ 发布成功

**发布时间**: 2026-03-07 23:55 GMT+8  
**Skill ID**: `k9747ryfntcrpw13e48gxbekax82e81k`  
**Slug**: `bazhuayu-webhook`  
**版本**: `1.0.1` (公开发布版)

---

## 🎉 更新内容

### v1.0.1 初始公开发布版

#### 核心功能

| 功能 | 说明 |
|------|------|
| 🔐 **环境变量支持** | 敏感信息使用 `BAZHUAYU_WEBHOOK_*` 环境变量存储 |
| 🛡️ **文件权限保护** | 配置文件自动设置为 600 (仅所有者可读写) |
| 🙈 **日志脱敏** | 输出自动隐藏密钥和敏感参数 |
| ✅ **安全检查** | `secure-check` 命令帮助发现潜在风险 |
| 🚀 **一键配置** | `setup-secure.sh` 快速安全配置向导 |
| 🔄 **迁移工具** | `migrate-to-env.sh` 从旧配置自动迁移 |

#### 主要文件

| 文件 | 用途 |
|------|------|
| `bazhuayu-webhook.py` | 主程序 (安全增强版) |
| `setup-secure.sh` | ⭐ 一键安全配置向导 |
| `migrate-to-env.sh` | ⭐ 旧配置迁移工具 |
| `QUICKSTART.md` | ⭐ 5 分钟快速配置指南 |
| `SECURITY.md` | ⭐ 安全指南 |
| `README.md` | 使用说明 |
| `MANUAL.md` | 详细手册 |

---

## 📋 版本说明

### 为什么是 v1.0.1 而不是 v1.0.0？

- v1.0.0 在内部测试时已创建（未公开发布）
- 删除后版本号保留（ClawHub 机制）
- v1.0.1 作为**首个公开发布版本**

对用户来说，**v1.0.1 就是初始版本**！

---

## 🔗 ClawHub 链接

- **Skill 页面**: https://clawhub.com/skills/bazhuayu-webhook
- **安装命令**: `clawhub install bazhuayu-webhook`
- **更新命令**: `clawhub update bazhuayu-webhook`

---

## 📝 发布说明

```
初始版本 - 八爪鱼 RPA Webhook 调用工具（安全增强版）
```

---

## 🚀 安装方式

### 从 ClawHub 安装（推荐）

```bash
clawhub install bazhuayu-webhook
```

### 手动安装

```bash
# 复制 skill 目录
cp -r ~/.openclaw/workspace/skills/bazhuayu-webhook /你的路径/

# 运行安全配置
cd /你的路径/bazhuayu-webhook
./setup-secure.sh
```

---

## 📊 发布状态

| 检查项 | 状态 |
|--------|------|
| 代码审查 | ✅ 通过 |
| 安全扫描 | ⏳ 进行中（ClawHub 自动扫描） |
| 文档完整性 | ✅ 完整 |
| 元数据配置 | ✅ 正确 |
| 发布确认 | ✅ 成功 |

---

## 📞 后续工作

- [ ] 等待 ClawHub 安全扫描完成（通常几分钟）
- [ ] 验证技能页面显示正常
- [ ] 测试从 ClawHub 安装流程
- [ ] 分享给其他用户

---

**发布完成！🎉**


path: RELEASE-v2.0.md
content: # 📦 bazhuayu-webhook v2.0 发布记录

## ✅ 发布成功

**发布时间**: 2026-03-07 23:40 GMT+8  
**Skill ID**: `k97av5p0r4mcenhxxhwez9zbqn82ehr6`  
**Slug**: `bazhuayu-webhook`  
**版本**: `2.0.0`

---

## 🎉 更新内容

### v2.0 安全增强版

#### 核心改进

| 功能 | 说明 |
|------|------|
| 🔐 **环境变量支持** | 敏感信息使用 `BAZHUAYU_WEBHOOK_*` 环境变量存储 |
| 🛡️ **文件权限保护** | 配置文件自动设置为 600 (仅所有者可读写) |
| 🙈 **日志脱敏** | 输出自动隐藏密钥和敏感参数 |
| ✅ **安全检查** | `secure-check` 命令帮助发现潜在风险 |
| 🚀 **一键配置** | `setup-secure.sh` 快速安全配置向导 |
| 🔄 **迁移工具** | `migrate-to-env.sh` 从旧配置自动迁移 |

#### 新增文件

| 文件 | 用途 |
|------|------|
| `setup-secure.sh` | ⭐ 一键安全配置向导 |
| `migrate-to-env.sh` | 旧配置迁移到环境变量 |
| `QUICKSTART.md` | 5 分钟快速配置指南 |
| `SECURITY.md` | 完整安全指南 |
| `package.json` | ClawHub 发布元数据 |
| `.gitignore` | Git 忽略规则 |

#### 更新文件

| 文件 | 更新内容 |
|------|----------|
| `bazhuayu-webhook.py` | 安全增强版主程序 (v2.0) |
| `SKILL.md` | 更新为 v2.0 文档 |
| `README.md` | 添加安全特性和快速配置 |
| `config.example.json` | 安全模式配置模板 |

---

## 📋 安全检查清单

发布前已完成：

- ✅ 代码质量检查
- ✅ 敏感信息处理（config.json 已清空密钥）
- ✅ .gitignore 配置正确
- ✅ 文档完整性验证
- ✅ package.json 元数据配置
- ✅ 安全检查功能测试通过

---

## 🔗 ClawHub 链接

- **Skill 页面**: https://clawhub.com/skills/bazhuayu-webhook
- **安装命令**: `clawhub install bazhuayu-webhook`
- **更新命令**: `clawhub update bazhuayu-webhook`

---

## 📝 发布说明

```
v2.0 安全增强版 - 新增环境变量支持、安全检查工具、一键配置脚本、迁移工具
```

---

## 🚀 安装方式

### 从 ClawHub 安装（推荐）

```bash
clawhub install bazhuayu-webhook
```

### 手动安装

```bash
# 复制 skill 目录
cp -r ~/.openclaw/workspace/skills/bazhuayu-webhook /你的路径/

# 运行安全配置
cd /你的路径/bazhuayu-webhook
./setup-secure.sh
```

---

## 📊 发布状态

| 检查项 | 状态 |
|--------|------|
| 代码审查 | ✅ 通过 |
| 安全扫描 | ⏳ 进行中 (ClawHub 自动扫描) |
| 文档完整性 | ✅ 完整 |
| 元数据配置 | ✅ 正确 |
| 发布确认 | ✅ 成功 |

---

## 📞 后续工作

- [ ] 等待 ClawHub 安全扫描完成（通常几分钟）
- [ ] 验证技能页面显示正常
- [ ] 测试从 ClawHub 安装流程
- [ ] 更新用户文档和公告

---

**发布完成！🎉**


path: SECURITY.md
content: # 安全指南

本文档说明如何安全地使用八爪鱼 RPA Webhook Skill。

---

## 🔐 安全威胁模型

### 潜在风险

| 风险 | 描述 | 影响 |
|------|------|------|
| 密钥泄露 | config.json 被未授权访问 | 攻击者可触发 RPA 任务 |
| 日志泄露 | 日志包含敏感参数 | 暴露业务数据 |
| 版本控制泄露 | config.json 被提交到 Git | 密钥公开暴露 |
| 文件权限不当 | 其他用户可读取配置 | 本地信息泄露 |

---

## ✅ 安全最佳实践

### 1. 使用环境变量存储敏感信息

**推荐方式：**

```bash
# 添加到 ~/.bashrc 或 ~/.zshrc
export BAZHUAYU_WEBHOOK_URL="https://api-rpa.bazhuayu.com/..."
export BAZHUAYU_WEBHOOK_KEY="your-secret-key"

# 可选：参数默认值
export BAZHUAYU_PARAM_KEYWORD="默认关键词"
```

**优势：**
- 密钥不存储在磁盘中
- 进程结束后自动清除
- 不会被版本控制追踪

### 2. 保护配置文件

如果必须使用配置文件：

```bash
# 设置正确权限 (仅所有者可读写)
chmod 600 config.json

# 验证权限
ls -la config.json
# 应显示：-rw------- 1 user user ...
```

### 3. 防止版本控制泄露

```bash
# 确保 .gitignore 包含 config.json
cat .gitignore

# 如果已提交，从 Git 历史中移除
git rm --cached config.json
git commit -m "Remove sensitive config"
```

### 4. 日志安全

```bash
# 日志文件也应设置严格权限
chmod 600 *.log

# 定期清理日志
find . -name "*.log" -mtime +30 -delete
```

### 5. 定期安全检查

```bash
# 运行内置安全检查
python3 bazhuayu-webhook.py secure-check
```

---

## 🛡️ 安全配置选项

### 混合模式（推荐）

敏感信息用环境变量，非敏感信息用配置文件：

```bash
# 环境变量
export BAZHUAYU_WEBHOOK_KEY="secret-key"

# config.json (不包含 key)
{
  "url": "https://api-rpa.bazhuayu.com/...",
  "key": "",  # 留空，从环境变量读取
  "paramNames": ["keyword"],
  "defaultParams": {
    "keyword": "默认值"
  }
}
```

### 纯环境变量模式

所有配置都使用环境变量：

```bash
export BAZHUAYU_WEBHOOK_URL="..."
export BAZHUAYU_WEBHOOK_KEY="..."
export BAZHUAYU_PARAM_KEYWORD="..."
```

---

## 🚨 应急响应

### 如果密钥可能已泄露

1. **立即撤销密钥**
   - 登录八爪鱼 RPA 控制台
   - 删除/重置 Webhook 触发器密钥

2. **检查日志**
   - 查看是否有异常调用记录
   - 检查 RPA 任务执行历史

3. **更新配置**
   - 生成新密钥
   - 更新所有配置位置
   - 运行 `secure-check` 验证

### 如果配置文件已提交到 Git

```bash
# 1. 从 Git 历史中移除
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch config.json" \
  --prune-empty --tag-name-filter cat -- --all

# 2. 推送更改
git push origin --force --all

# 3. 联系 GitHub/GitLab 支持清除缓存 (如已推送到远程)

# 4. 重置密钥 (必须!)
```

---

## 📋 安全检查清单

使用前请确认：

- [ ] config.json 权限为 600
- [ ] config.json 在 .gitignore 中
- [ ] 敏感参数使用环境变量
- [ ] 日志文件权限正确
- [ ] 运行 `secure-check` 无警告

---

## 🔍 审计日志

如需审计调用记录：

```bash
# 启用详细日志
python3 bazhuayu-webhook.py run --dry-run > audit.log 2>&1
chmod 600 audit.log

# 查看日志
cat audit.log
```

---

## 📞 报告安全问题

如发现安全漏洞，请：

1. **不要**公开披露
2. 联系技能作者
3. 等待修复后更新

---

**安全是持续过程，请定期审查和更新配置。**


path: USAGE_EXAMPLE.md
content: # 使用示例

## 场景一：每日数据同步

假设你有一个 RPA 应用，每天需要从数据库同步数据：

### 配置
```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/YOUR_WEBHOOK_ID/invoke",
  "key": "YOUR_SECRET_KEY",
  "paramNames": ["日期", "数据源"],
  "defaultParams": {
    "日期": "2026-03-05",
    "数据源": "main_db"
  }
}
```

### 运行
```bash
# 使用默认参数
python3 bazhuayu-webhook.py run

# 指定日期和数据源
python3 bazhuayu-webhook.py run --日期=2026-03-06 --数据源=backup_db
```

---

## 场景二：订单处理

假设你有一个订单处理 RPA，需要传递订单号和收货地址：

### 配置
```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/YOUR_ID/invoke",
  "key": "YOUR_KEY",
  "paramNames": ["订单号", "收货地址"],
  "defaultParams": {
    "订单号": "",
    "收货地址": ""
  }
}
```

### 运行
```bash
python3 bazhuayu-webhook.py run --订单号=ORD20260305001 --收货地址=北京市朝阳区 xx 路 xx 号
```

---

## 场景三：定时任务

设置每天 8 点自动运行：

### 1. 配置默认参数
```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/YOUR_ID/invoke",
  "key": "YOUR_KEY",
  "paramNames": ["A", "B"],
  "defaultParams": {
    "A": "默认值 A",
    "B": "默认值 B"
  }
}
```

### 2. 添加定时任务
```bash
crontab -e
```

添加：
```
0 8 * * * /path/to/bazhuayu-webhook/run_daily.sh
```

---

## 场景四：多参数传递

如果 RPA 应用有多个参数：

### 配置
```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/YOUR_ID/invoke",
  "key": "YOUR_KEY",
  "paramNames": ["用户名", "密码", "操作类型", "备注"],
  "defaultParams": {
    "用户名": "admin",
    "密码": "123456",
    "操作类型": "login",
    "备注": ""
  }
}
```

### 运行
```bash
python3 bazhuayu-webhook.py run --用户名=test --密码=654321 --操作类型=logout
```

---

## 场景五：10 个以上参数

支持任意数量的参数：

### 配置
```json
{
  "url": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/YOUR_ID/invoke",
  "key": "YOUR_KEY",
  "paramNames": [
    "参数 1", "参数 2", "参数 3", "参数 4", "参数 5",
    "参数 6", "参数 7", "参数 8", "参数 9", "参数 10"
  ],
  "defaultParams": {
    "参数 1": "值 1",
    "参数 2": "值 2",
    "参数 3": "100",
    "参数 4": "true",
    "参数 5": "2026-03-05",
    "参数 6": "值 6",
    "参数 7": "值 7",
    "参数 8": "值 8",
    "参数 9": "值 9",
    "参数 10": "值 10"
  }
}
```

### 运行
```bash
# 只修改需要改变的参数
python3 bazhuayu-webhook.py run --参数 1=新值 1 --参数 3=500 --参数 10=新值 10
```


path: WEBHOOK_SETUP.md
content: # 如何设置 Webhook - 图文教程

本教程详细介绍如何在八爪鱼 RPA 中创建和配置 Webhook 触发器。

---

## 📖 完整步骤

### 步骤 1：进入触发器管理

1. 登录 [八爪鱼 RPA 控制台](https://rpa.bazhuayu.com/)
2. 在左侧导航栏找到【触发器】栏目
3. 点击 **"Webhook 触发器"**

![步骤 1：进入触发器管理](./images/webhook-setup-1.jpg)

---

### 步骤 2：创建 Webhook 触发器

点击 **"创建 Webhook 触发器"** 或 **"+ "** 按钮开始创建。

![步骤 2：创建触发器](./images/webhook-setup-2.jpg)

---

### 步骤 3：填写触发器信息

按顺序填写以下信息：

#### 3.1 触发器名称

输入易于识别的名称，例如：
- `订单处理`
- `数据采集`
- `每日报表`
- `舆情监控`

#### 3.2 指定运行的机器人

从下拉菜单中选择要执行任务的机器人：
- 选择已配置好的机器人
- 确保机器人状态为"在线"或"可用"

#### 3.3 选择要运行的应用

从下拉菜单中选择对应的 RPA 应用：
- 选择你创建好的 RPA 流程/应用
- 确保应用已发布且可运行

#### 3.4 保存配置

点击 **"确定"** 按钮保存配置。

![步骤 3：填写信息](./images/webhook-setup-3.jpg)

---

### 步骤 4：获取 Webhook 信息

创建成功后，系统会显示 Webhook 的详细信息：

| 信息 | 说明 | 用途 |
|------|------|------|
| **Webhook URL** | 调用接口地址 | 用于发送 HTTP 请求 |
| **签名密钥 (Key)** | 用于签名验证 | 用于计算请求签名 |

⚠️ **重要提示**：
- 请**立即复制**并保存这两个信息
- 签名密钥只显示一次，关闭后无法再次查看
- 如丢失密钥，需要删除并重新创建 Webhook

![步骤 4：获取信息](./images/webhook-info.jpg)

---

### 步骤 5：启动触发器

⚠️ **必须操作**：勾选 **"启动触发器"**

- 未勾选则 Webhook 不会生效
- 勾选后状态显示为"运行中"
- 可随时取消勾选来暂停 Webhook

![步骤 5：启动触发器](./images/webhook-enable.jpg)

---

## ✅ 验证 Webhook 是否生效

### 方法 1：查看状态

在 Webhook 触发器列表中，检查状态：
- ✅ **运行中** - 已启动，可接受请求
- ⏸️ **已暂停** - 未启动，需要勾选"启动触发器"
- ❌ **错误** - 配置有问题，检查机器人和应用状态

### 方法 2：测试调用

使用以下命令测试 Webhook：

```bash
cd ~/.openclaw/workspace/skills/bazhuayu-webhook
python3 bazhuayu-webhook.py test
```

如果返回成功，说明 Webhook 配置正确。

---

## 🔧 常见问题

### Q1: 找不到 Webhook 触发器选项？

**A**: 确保你的账号已完成企业认证，部分功能可能需要企业版账号。

### Q2: 签名密钥丢失了怎么办？

**A**: 
1. 删除当前的 Webhook 触发器
2. 重新创建一个新的 Webhook
3. 立即复制并保存新的密钥

### Q3: Webhook 调用失败？

**A**: 检查以下几点：
- 触发器是否已启动（勾选"启动触发器"）
- 机器人是否在线
- 应用是否已发布
- Webhook URL 和密钥是否正确
- 签名计算是否正确（工具已自动处理）

### Q4: 如何修改 Webhook 配置？

**A**: 
1. 在触发器列表中找到对应的 Webhook
2. 点击"编辑"或"配置"
3. 修改后保存

---

## 📞 技术支持

- [八爪鱼 RPA 帮助中心](https://rpa.bazhuayu.com/helpcenter)
- [Webhook 触发任务文档](https://rpa.bazhuayu.com/helpcenter/docs/skmvua)
- [API 接口文档](https://rpa.bazhuayu.com/helpcenter/docs/rpaapi)

---

**配置完成后，继续配置技能本身 → [快速配置指南](./QUICKSTART.md)**


path: WEBHOOK_SETUP_PREVIEW.html
content: <!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>八爪鱼 RPA Webhook 设置教程 - v2.0.4 预览</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            line-height: 1.6;
            max-width: 900px;
            margin: 0 auto;
            padding: 20px;
            background: #f5f5f5;
        }
        .container {
            background: white;
            padding: 40px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        h1 { color: #1a73e8; border-bottom: 3px solid #1a73e8; padding-bottom: 10px; }
        h2 { color: #1a73e8; margin-top: 30px; }
        h3 { color: #333; }
        .step {
            background: #f8f9fa;
            border-left: 4px solid #1a73e8;
            padding: 20px;
            margin: 20px 0;
            border-radius: 4px;
        }
        .step-number {
            display: inline-block;
            background: #1a73e8;
            color: white;
            width: 30px;
            height: 30px;
            text-align: center;
            line-height: 30px;
            border-radius: 50%;
            margin-right: 10px;
            font-weight: bold;
        }
        .warning {
            background: #fff3cd;
            border-left: 4px solid #ffc107;
            padding: 15px;
            margin: 20px 0;
            border-radius: 4px;
        }
        .warning strong { color: #856404; }
        .image-placeholder {
            background: #e9ecef;
            border: 2px dashed #6c757d;
            padding: 40px;
            text-align: center;
            margin: 20px 0;
            border-radius: 4px;
            color: #6c757d;
        }
        .image-placeholder img {
            max-width: 100%;
            height: auto;
            border-radius: 4px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.15);
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        th, td {
            border: 1px solid #dee2e6;
            padding: 12px;
            text-align: left;
        }
        th {
            background: #f8f9fa;
            font-weight: bold;
        }
        code {
            background: #f8f9fa;
            padding: 2px 6px;
            border-radius: 3px;
            font-family: "Courier New", monospace;
            color: #e83e8c;
        }
        .tip {
            background: #d4edda;
            border-left: 4px solid #28a745;
            padding: 15px;
            margin: 20px 0;
            border-radius: 4px;
        }
        .version-info {
            background: #e7f3ff;
            padding: 15px;
            border-radius: 4px;
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="version-info">
            <strong>📦 版本预览</strong><br>
            Skill: bazhuayu-rpa-webhook v2.0.4<br>
            更新内容：新增 Webhook 设置图文教程
        </div>

        <h1>🐙 如何设置 Webhook - 图文教程</h1>
        
        <p>本教程详细介绍如何在八爪鱼 RPA 中创建和配置 Webhook 触发器。</p>

        <!-- 步骤 1 -->
        <div class="step">
            <h2><span class="step-number">1</span>进入触发器管理</h2>
            <ol>
                <li>登录 <a href="https://rpa.bazhuayu.com/" target="_blank">八爪鱼 RPA 控制台</a></li>
                <li>在左侧导航栏找到【触发器】栏目</li>
                <li>点击 <strong>"Webhook 触发器"</strong></li>
            </ol>
            <div class="image-placeholder">
                <img src="file:///root/.openclaw/workspace/skills/bazhuayu-webhook/images/webhook-setup-1.jpg" alt="步骤 1：进入触发器管理">
                <p><em>📸 截图：Webhook 触发器管理界面</em></p>
            </div>
        </div>

        <!-- 步骤 2 -->
        <div class="step">
            <h2><span class="step-number">2</span>创建 Webhook 触发器</h2>
            <p>点击 <strong>"创建 Webhook 触发器"</strong> 或 <strong>"+ "</strong> 按钮开始创建。</p>
            <div class="image-placeholder">
                <img src="file:///root/.openclaw/workspace/skills/bazhuayu-webhook/images/webhook-setup-2.jpg" alt="步骤 2：创建触发器">
                <p><em>📸 截图：创建 Webhook 触发器按钮</em></p>
            </div>
        </div>

        <!-- 步骤 3 -->
        <div class="step">
            <h2><span class="step-number">3</span>填写触发器信息</h2>
            <h3>3.1 触发器名称</h3>
            <p>输入易于识别的名称，例如：</p>
            <ul>
                <li><code>订单处理</code></li>
                <li><code>数据采集</code></li>
                <li><code>每日报表</code></li>
                <li><code>舆情监控</code></li>
            </ul>

            <h3>3.2 指定运行的机器人</h3>
            <p>从下拉菜单中选择要执行任务的机器人：</p>
            <ul>
                <li>选择已配置好的机器人</li>
                <li>确保机器人状态为"在线"或"可用"</li>
            </ul>

            <h3>3.3 选择要运行的应用</h3>
            <p>从下拉菜单中选择对应的 RPA 应用：</p>
            <ul>
                <li>选择你创建好的 RPA 流程/应用</li>
                <li>确保应用已发布且可运行</li>
            </ul>

            <h3>3.4 保存配置</h3>
            <p>点击 <strong>"确定"</strong> 按钮保存配置。</p>

            <div class="image-placeholder">
                <img src="file:///root/.openclaw/workspace/skills/bazhuayu-webhook/images/webhook-setup-3.jpg" alt="步骤 3：填写信息">
                <p><em>📸 截图：填写触发器信息表单</em></p>
            </div>
        </div>

        <!-- 步骤 4 -->
        <div class="step">
            <h2><span class="step-number">4</span>获取 Webhook 信息</h2>
            <p>创建成功后，系统会显示 Webhook 的详细信息：</p>
            
            <table>
                <tr>
                    <th>信息</th>
                    <th>说明</th>
                    <th>用途</th>
                </tr>
                <tr>
                    <td><strong>Webhook URL</strong></td>
                    <td>调用接口地址</td>
                    <td>用于发送 HTTP 请求</td>
                </tr>
                <tr>
                    <td><strong>签名密钥 (Key)</strong></td>
                    <td>用于签名验证</td>
                    <td>用于计算请求签名</td>
                </tr>
            </table>

            <div class="warning">
                <strong>⚠️ 重要提示：</strong>
                <ul>
                    <li>请<strong>立即复制</strong>并保存这两个信息</li>
                    <li>签名密钥只显示一次，关闭后无法再次查看</li>
                    <li>如丢失密钥，需要删除并重新创建 Webhook</li>
                </ul>
            </div>
        </div>

        <!-- 步骤 5 -->
        <div class="step">
            <h2><span class="step-number">5</span>启动触发器</h2>
            
            <div class="warning">
                <strong>⚠️ 必须操作：</strong>勾选 <strong>"启动触发器"</strong>
                <ul>
                    <li>未勾选则 Webhook 不会生效</li>
                    <li>勾选后状态显示为"运行中"</li>
                    <li>可随时取消勾选来暂停 Webhook</li>
                </ul>
            </div>
        </div>

        <!-- 验证 -->
        <div class="step">
            <h2>✅ 验证 Webhook 是否生效</h2>
            
            <h3>方法 1：查看状态</h3>
            <p>在 Webhook 触发器列表中，检查状态：</p>
            <ul>
                <li>✅ <strong>运行中</strong> - 已启动，可接受请求</li>
                <li>⏸️ <strong>已暂停</strong> - 未启动，需要勾选"启动触发器"</li>
                <li>❌ <strong>错误</strong> - 配置有问题，检查机器人和应用状态</li>
            </ul>

            <h3>方法 2：测试调用</h3>
            <p>使用以下命令测试 Webhook：</p>
            <pre><code>cd ~/.openclaw/workspace/skills/bazhuayu-webhook
python3 bazhuayu-webhook.py test</code></pre>
            <p>如果返回成功，说明 Webhook 配置正确。</p>
        </div>

        <!-- 常见问题 -->
        <div class="step">
            <h2>🔧 常见问题</h2>
            
            <h3>Q1: 找不到 Webhook 触发器选项？</h3>
            <p><strong>A:</strong> 确保你的账号已完成企业认证，部分功能可能需要企业版账号。</p>

            <h3>Q2: 签名密钥丢失了怎么办？</h3>
            <p><strong>A:</strong> </p>
            <ol>
                <li>删除当前的 Webhook 触发器</li>
                <li>重新创建一个新的 Webhook</li>
                <li>立即复制并保存新的密钥</li>
            </ol>

            <h3>Q3: Webhook 调用失败？</h3>
            <p><strong>A:</strong> 检查以下几点：</p>
            <ul>
                <li>触发器是否已启动（勾选"启动触发器"）</li>
                <li>机器人是否在线</li>
                <li>应用是否已发布</li>
                <li>Webhook URL 和密钥是否正确</li>
                <li>签名计算是否正确（工具已自动处理）</li>
            </ul>

            <h3>Q4: 如何修改 Webhook 配置？</h3>
            <p><strong>A:</strong> </p>
            <ol>
                <li>在触发器列表中找到对应的 Webhook</li>
                <li>点击"编辑"或"配置"</li>
                <li>修改后保存</li>
            </ol>
        </div>

        <!-- 下一步 -->
        <div class="tip">
            <strong>📌 下一步：</strong>
            <p>配置完成后，继续配置技能本身 → 参考 <code>QUICKSTART.md</code> 或 <code>README.md</code></p>
        </div>

        <!-- 技术支持 -->
        <div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #dee2e6; color: #666;">
            <h3>📞 技术支持</h3>
            <ul>
                <li><a href="https://rpa.bazhuayu.com/helpcenter" target="_blank">八爪鱼 RPA 帮助中心</a></li>
                <li><a href="https://rpa.bazhuayu.com/helpcenter/docs/skmvua" target="_blank">Webhook 触发任务文档</a></li>
                <li><a href="https://rpa.bazhuayu.com/helpcenter/docs/rpaapi" target="_blank">API 接口文档</a></li>
            </ul>
        </div>
    </div>
</body>
</html>


path: bazhuayu-webhook.py
content: #!/usr/bin/env python3
"""
八爪鱼 RPA Webhook 调用工具 (安全增强版)

安全特性:
- 支持环境变量存储敏感信息 (优先级高于配置文件)
- 配置文件自动设置权限为 600 (仅所有者可读写)
- 日志输出脱敏处理
- 支持加密配置文件 (可选)

环境变量:
- BAZHUAYU_WEBHOOK_URL    Webhook URL
- BAZHUAYU_WEBHOOK_KEY    签名密钥
- BAZHUAYU_PARAM_*        自定义参数默认值 (如 BAZHUAYU_PARAM_KEYWORD)
"""

import json
import hmac
import hashlib
import base64
import time
import argparse
import sys
import os
import stat
from pathlib import Path

SCRIPT_DIR = Path(__file__).parent
CONFIG_FILE = SCRIPT_DIR / 'config.json'

# 敏感字段列表 (用于脱敏)
SENSITIVE_FIELDS = ['key', 'password', 'secret', 'token', 'auth']

def show_help():
    print("""八爪鱼 RPA Webhook 调用工具 (安全增强版)

用法:
  python bazhuayu-webhook.py init              初始化配置
  python bazhuayu-webhook.py run [选项]        运行任务
  python bazhuayu-webhook.py config            查看当前配置
  python bazhuayu-webhook.py test              测试连接 (dry-run)
  python bazhuayu-webhook.py secure-check      安全检查

run 选项:
  --param1=值 1    设置参数 1 的值
  --param2=值 2    设置参数 2 的值
  --dry-run        仅显示请求内容，不实际发送

安全建议:
  - 使用环境变量存储敏感信息 (优先级高于配置文件)
  - 定期运行 secure-check 检查配置安全
  - 不要将 config.json 提交到版本控制

环境变量:
  BAZHUAYU_WEBHOOK_URL    Webhook URL
  BAZHUAYU_WEBHOOK_KEY    签名密钥
  BAZHUAYU_PARAM_*        自定义参数默认值

示例:
  python bazhuayu-webhook.py run --param1=新值 1 --param2=新值 2
  BAZHUAYU_WEBHOOK_KEY=xxx python bazhuayu-webhook.py run
""")

def mask_sensitive(value, field_name=''):
    """脱敏处理敏感信息"""
    if not value or len(value) <= 8:
        return '***'
    # 显示前 4 位和后 4 位
    return f'{value[:4]}...{value[-4:]}'

def load_config():
    """加载配置，环境变量优先级高于配置文件"""
    config = {
        'url': '',
        'key': '',
        'paramNames': [],
        'defaultParams': {}
    }
    
    # 1. 先从配置文件加载
    if CONFIG_FILE.exists():
        try:
            with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
                file_config = json.load(f)
                config.update(file_config)
        except json.JSONDecodeError as e:
            print(f"⚠️  配置文件解析失败：{e}")
            print("   请检查 config.json 格式是否正确")
            sys.exit(1)
        except Exception as e:
            print(f"⚠️  读取配置文件失败：{e}")
    
    # 2. 环境变量覆盖 (优先级更高)
    env_url = os.environ.get('BAZHUAYU_WEBHOOK_URL')
    env_key = os.environ.get('BAZHUAYU_WEBHOOK_KEY')
    
    if env_url:
        config['url'] = env_url
    if env_key:
        config['key'] = env_key
    
    # 3. 加载环境变量中的参数默认值 (BAZHUAYU_PARAM_*)
    for env_name, env_value in os.environ.items():
        if env_name.startswith('BAZHUAYU_PARAM_'):
            param_name = env_name.replace('BAZHUAYU_PARAM_', '')
            # 转换为驼峰或小写格式
            param_name = param_name.lower().replace('_', '')
            config['defaultParams'][param_name] = env_value
            if param_name not in config['paramNames']:
                config['paramNames'].append(param_name)
    
    # 验证必要配置
    if not config.get('url'):
        print("错误：缺少 Webhook URL")
        print("请设置 BAZHUAYU_WEBHOOK_URL 环境变量或在 config.json 中配置")
        sys.exit(1)
    
    if not config.get('key'):
        print("错误：缺少签名密钥")
        print("请设置 BAZHUAYU_WEBHOOK_KEY 环境变量或在 config.json 中配置")
        sys.exit(1)
    
    return config

def save_config(config):
    """保存配置并设置安全权限"""
    # 先写入文件
    with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
        json.dump(config, f, ensure_ascii=False, indent=2)
    
    # 设置文件权限为 600 (仅所有者可读写)
    os.chmod(CONFIG_FILE, stat.S_IRUSR | stat.S_IWUSR)
    
    # 验证权限
    file_stat = os.stat(CONFIG_FILE)
    perms = oct(file_stat.st_mode)[-3:]
    
    print("配置已保存")
    print(f"✅ 文件权限已设置为 {perms} (仅所有者可读写)")
    print(f"📁 配置文件位置：{CONFIG_FILE.absolute()}")

def init_config():
    """初始化配置 - 默认使用环境变量存储敏感信息"""
    print("=== 八爪鱼 RPA Webhook 初始化配置 (安全增强版) ===\n")
    print("🔐 安全模式：敏感信息默认使用环境变量存储")
    print("   - 签名密钥 → BAZHUAYU_WEBHOOK_KEY 环境变量")
    print("   - Webhook URL → 可选环境变量或配置文件")
    print("   - 配置文件将不存储任何敏感信息\n")
    
    # 收集配置信息
    print("--- 配置信息 ---")
    url = input("请输入 Webhook URL: ").strip()
    key = input("请输入签名密钥 (Key): ").strip()
    
    # 验证密钥格式
    if len(key) < 8:
        print("⚠️  警告：密钥长度较短，建议使用更安全的密钥")
    
    print("\n定义参数名称 (逗号分隔，如：参数 1，参数 2): ")
    params_input = input().strip()
    param_names = [p.strip() for p in params_input.split(',') if p.strip()]
    
    if not param_names:
        print("⚠️  未设置参数，将使用空参数列表")
    
    default_params = {}
    env_params = {}
    
    for name in param_names:
        print(f"\n配置参数 [{name}]:")
        print("  1. 使用固定默认值 (保存在配置文件)")
        print("  2. 使用环境变量 (推荐用于敏感参数)")
        print("  3. 不设置默认值 (运行时必须指定)")
        
        choice = input("  请选择 (1/2/3) [默认:1]: ").strip() or '1'
        
        if choice == '2':
            env_name = f"BAZHUAYU_PARAM_{name.upper().replace(' ', '_').replace('-', '_')}"
            value = input(f"  请输入 [{name}] 的默认值：").strip()
            env_params[env_name] = value
            default_params[name] = f'${{{env_name}}}'  # 标记为环境变量引用
        elif choice == '3':
            default_params[name] = ''  # 空值，运行时必须指定
        else:
            value = input(f"  请输入 [{name}] 的默认值：").strip()
            default_params[name] = value
    
    # 配置文件不包含敏感信息
    config = {
        'url': url,  # URL 可以存储在配置文件 (非敏感)
        'key': '',   # 密钥留空，从环境变量读取
        'paramNames': param_names,
        'defaultParams': default_params,
        'security': {
            'keyFromEnv': True,
            'createdAt': time.strftime('%Y-%m-%d %H:%M:%S'),
            'version': '2.0'
        }
    }
    
    save_config(config)
    
    # 生成环境变量配置
    print("\n=== 配置完成 ===")
    print(f"Webhook URL: {mask_sensitive(url)}")
    print(f"参数列表：{', '.join(param_names)}")
    print("\n🔐 安全配置：签名密钥已设置为从环境变量读取")
    print("   配置文件 (config.json) 中不存储密钥\n")
    
    # 提供环境变量设置指南
    print("📝 请设置以下环境变量 (二选一):\n")
    
    print("方式 1: 临时设置 (当前终端会话有效)")
    print("-" * 60)
    print(f'export BAZHUAYU_WEBHOOK_KEY="{key}"')
    for env_name, value in env_params.items():
        print(f'export {env_name}="{value}"')
    print("-" * 60)
    
    print("\n方式 2: 永久设置 (添加到 Shell 配置文件)")
    print("-" * 60)
    shell_config = "~/.bashrc" if os.path.exists(os.path.expanduser("~/.bashrc")) else "~/.zshrc"
    print(f'# 添加到 {shell_config}')
    print(f'export BAZHUAYU_WEBHOOK_KEY="{key}"')
    for env_name, value in env_params.items():
        print(f'export {env_name}="{value}"')
    print("-" * 60)
    print(f"\n然后运行：source {shell_config}")
    
    print("\n✅ 验证配置:")
    print("   python3 bazhuayu-webhook.py secure-check")
    print("   python3 bazhuayu-webhook.py test\n")

def show_config():
    """显示当前配置 (脱敏)"""
    config = load_config()
    print("=== 当前配置 ===")
    
    # 检查配置来源
    url_from_env = bool(os.environ.get('BAZHUAYU_WEBHOOK_URL'))
    key_from_env = bool(os.environ.get('BAZHUAYU_WEBHOOK_KEY'))
    
    print(f"Webhook URL: {mask_sensitive(config['url'])} {'(环境变量)' if url_from_env else '(配置文件)'}")
    print(f"签名密钥：{mask_sensitive(config['key'])} {'(环境变量)' if key_from_env else '(配置文件)'}")
    print(f"参数列表：{', '.join(config['paramNames'])}")
    print("默认参数值:")
    for name, value in config['defaultParams'].items():
        is_sensitive = any(s in name.lower() for s in SENSITIVE_FIELDS)
        display_value = mask_sensitive(value) if is_sensitive else value
        print(f"  {name} = {display_value}")
    
    # 显示安全状态
    print("\n=== 安全状态 ===")
    if key_from_env:
        print("✅ 签名密钥使用环境变量存储 (安全)")
    else:
        print("⚠️  签名密钥存储在配置文件中")
        if CONFIG_FILE.exists():
            file_stat = os.stat(CONFIG_FILE)
            perms = oct(file_stat.st_mode)[-3:]
            if perms == '600':
                print(f"✅ 配置文件权限正确 ({perms})")
            else:
                print(f"⚠️  配置文件权限不安全 ({perms}), 建议设置为 600")
    
    if url_from_env:
        print("✅ Webhook URL 使用环境变量存储 (安全)")
    else:
        print("ℹ️  Webhook URL 存储在配置文件中")

def secure_check():
    """安全检查"""
    print("=== 安全检查 ===\n")
    
    issues = []
    recommendations = []
    
    # 1. 检查配置文件权限
    if CONFIG_FILE.exists():
        file_stat = os.stat(CONFIG_FILE)
        perms = oct(file_stat.st_mode)[-3:]
        if perms != '600':
            issues.append(f"配置文件权限不安全 ({perms}), 应为 600")
            recommendations.append(f"运行：chmod 600 {CONFIG_FILE}")
        else:
            print("✅ 配置文件权限正确 (600)")
    else:
        print("ℹ️  配置文件不存在 (可能使用环境变量)")
    
    # 2. 检查环境变量和配置文件
    key_from_env = bool(os.environ.get('BAZHUAYU_WEBHOOK_KEY'))
    url_from_env = bool(os.environ.get('BAZHUAYU_WEBHOOK_URL'))
    
    # 检查配置文件中的密钥是否为空（安全模式）
    config_key_in_file = False
    if CONFIG_FILE.exists():
        try:
            config = json.load(open(CONFIG_FILE, 'r', encoding='utf-8'))
            if config.get('key'):  # 如果 key 字段有值（非空）
                config_key_in_file = True
        except:
            pass
    
    if key_from_env:
        print("✅ 签名密钥使用环境变量存储")
    elif not config_key_in_file:
        print("✅ 签名密钥配置为从环境变量读取 (config.json 中 key 为空)")
    else:
        issues.append("签名密钥存储在配置文件中")
        recommendations.append("建议使用 BAZHUAYU_WEBHOOK_KEY 环境变量或运行 ./migrate-to-env.sh 迁移")
    
    if url_from_env:
        print("✅ Webhook URL 使用环境变量存储")
    else:
        print("ℹ️  Webhook URL 存储在配置文件中 (可接受)")
    
    # 3. 检查是否在版本控制中
    git_dir = SCRIPT_DIR / '.git'
    if git_dir.exists():
        issues.append("Skill 目录在 Git 仓库中")
        recommendations.append("确保 config.json 已添加到 .gitignore")
    
    # 4. 检查日志文件
    log_files = list(SCRIPT_DIR.glob('*.log'))
    if log_files:
        print(f"📝 发现 {len(log_files)} 个日志文件")
        for log_file in log_files:
            log_stat = os.stat(log_file)
            log_perms = oct(log_stat.st_mode)[-3:]
            if log_perms != '600':
                # 自动修复日志文件权限
                try:
                    os.chmod(log_file, stat.S_IRUSR | stat.S_IWUSR)
                    print(f"✅ 已修复 {log_file.name} 权限 ({log_perms} → 600)")
                except Exception as e:
                    issues.append(f"日志文件 {log_file.name} 权限不安全 ({log_perms}) 且无法自动修复")
    
    # 输出结果
    print("\n=== 检查结果 ===")
    if not issues:
        print("✅ 所有安全检查通过!")
    else:
        print(f"⚠️  发现 {len(issues)} 个问题:\n")
        for i, issue in enumerate(issues, 1):
            print(f"  {i}. {issue}")
        
        if recommendations:
            print("\n=== 修复建议 ===")
            for i, rec in enumerate(recommendations, 1):
                print(f"  {i}. {rec}")
    
    return len(issues) == 0

def calculate_sign(key, timestamp):
    """
    计算签名：HmacSHA256(timestamp + '\\n' + key) -> Base64
    """
    string_to_sign = f"{timestamp}\n{key}"
    sign_data = hmac.new(
        string_to_sign.encode('utf-8'),
        b'',
        hashlib.sha256
    ).digest()
    return base64.b64encode(sign_data).decode('utf-8')

def run_task(override_params=None, dry_run=False):
    """运行任务"""
    if override_params is None:
        override_params = {}
    
    config = load_config()
    
    # 合并参数：默认参数 + 覆盖参数
    params = {**config['defaultParams'], **override_params}
    
    # 处理环境变量引用
    for key, value in params.items():
        if isinstance(value, str) and value.startswith('${') and value.endswith('}'):
            env_name = value[2:-1]
            env_value = os.environ.get(env_name)
            if env_value:
                params[key] = env_value
            else:
                print(f"⚠️  环境变量 {env_name} 未设置，使用空值")
                params[key] = ''
    
    timestamp = str(int(time.time()))
    sign = calculate_sign(config['key'], timestamp)
    
    payload = {
        'sign': sign,
        'params': params,
        'timestamp': timestamp
    }
    
    print("=== 准备发送请求 ===")
    print(f"URL: {mask_sensitive(config['url'])}")
    print(f"时间戳：{timestamp}")
    print("参数:")
    for name, value in params.items():
        is_sensitive = any(s in name.lower() for s in SENSITIVE_FIELDS)
        display_value = mask_sensitive(value) if is_sensitive else value
        print(f"  {name} = {display_value}")
    
    if dry_run:
        print("\n[DRY RUN] 未实际发送请求")
        print("\n请求 Payload (敏感信息已脱敏):")
        safe_payload = {
            'sign': mask_sensitive(payload['sign']),
            'params': {k: mask_sensitive(v) if any(s in k.lower() for s in SENSITIVE_FIELDS) else v 
                      for k, v in payload['params'].items()},
            'timestamp': payload['timestamp']
        }
        print(json.dumps(safe_payload, ensure_ascii=False, indent=2))
        return
    
    print("\n正在发送请求...")
    
    try:
        import urllib.request
        import urllib.error
        
        data = json.dumps(payload, ensure_ascii=False).encode('utf-8')
        req = urllib.request.Request(
            config['url'],
            data=data,
            headers={'Content-Type': 'application/json'},
            method='POST'
        )
        
        with urllib.request.urlopen(req, timeout=30) as response:
            http_code = response.status
            result = json.loads(response.read().decode('utf-8'))
    except urllib.error.HTTPError as e:
        http_code = e.code
        try:
            result = json.loads(e.read().decode('utf-8'))
        except:
            result = {'error': str(e)}
    except Exception as e:
        print(f"\n=== 响应结果 ===")
        print(f"错误：{e}")
        sys.exit(1)
    
    print("\n=== 响应结果 ===")
    print(f"HTTP 状态码：{http_code}")
    
    if http_code == 200:
        print("✅ 调用成功!")
        if 'flowId' in result:
            print(f"应用 ID (flowId): {result['flowId']}")
        if 'flowProcessNo' in result:
            print(f"运行批次 (flowProcessNo): {result['flowProcessNo']}")
        if 'enterpriseId' in result:
            print(f"企业 ID: {enterpriseId}")
    else:
        print("❌ 调用失败")
        if 'code' in result:
            print(f"错误码：{result['code']}")
        if 'description' in result:
            print(f"错误描述：{result['description']}")
        sys.exit(1)

def main():
    if len(sys.argv) < 2:
        show_help()
        sys.exit(0)
    
    command = sys.argv[1]
    override_params = {}
    dry_run = False
    
    # 解析命令行参数
    args = sys.argv[2:]
    i = 0
    while i < len(args):
        arg = args[i]
        if arg == '--dry-run':
            dry_run = True
        elif arg.startswith('--'):
            if '=' in arg:
                eq_pos = arg.index('=')
                key = arg[2:eq_pos]
                value = arg[eq_pos+1:]
                override_params[key] = value
            else:
                if i + 1 < len(args):
                    next_arg = args[i + 1]
                    if '=' in next_arg and not next_arg.startswith('--'):
                        eq_pos = next_arg.index('=')
                        key = arg[2:] + ' ' + next_arg[:eq_pos]
                        value = next_arg[eq_pos+1:]
                        override_params[key] = value
                        i += 1
                    elif not next_arg.startswith('--'):
                        override_params[arg[2:]] = next_arg
                        i += 1
        i += 1
    
    if command == 'init':
        init_config()
    elif command == 'config':
        show_config()
    elif command == 'run':
        run_task(override_params, dry_run)
    elif command == 'test':
        run_task({}, True)
    elif command == 'secure-check':
        secure_check()
    elif command in ('help', '-h', '--help'):
        show_help()
    else:
        print(f"未知命令：{command}\n")
        show_help()
        sys.exit(1)

if __name__ == '__main__':
    main()


path: config.example.json
content: {
  "_comment": "八爪鱼 RPA Webhook 配置示例",
  "_security_note": "敏感信息建议使用环境变量，不要将此文件提交到版本控制",
  
  "url": "",
  "key": "",
  "paramNames": ["keyword", "url"],
  "defaultParams": {
    "keyword": "默认关键词",
    "url": "https://example.com"
  },
  
  "_env_usage": {
    "url": "设置 BAZHUAYU_WEBHOOK_URL 环境变量可覆盖此配置",
    "key": "设置 BAZHUAYU_WEBHOOK_KEY 环境变量可覆盖此配置",
    "params": "设置 BAZHUAYU_PARAM_* 环境变量可设置参数默认值"
  },
  
  "_example_env": {
    "BAZHUAYU_WEBHOOK_URL": "https://api-rpa.bazhuayu.com/api/v1/bots/webhooks/xxx/invoke",
    "BAZHUAYU_WEBHOOK_KEY": "your-secret-key-here",
    "BAZHUAYU_PARAM_KEYWORD": "默认关键词"
  }
}


path: migrate-to-env.sh
content: #!/bin/bash
#
# 八爪鱼 RPA Webhook - 迁移到环境变量配置
# 
# 功能：
# 1. 从 config.json 提取敏感信息
# 2. 生成环境变量配置示例（不自动修改 shell 配置）
# 3. 更新 config.json 移除敏感信息
# 4. 备份原配置
#

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="$SCRIPT_DIR/config.json"
BACKUP_FILE="$SCRIPT_DIR/config.json.backup.$(date +%Y%m%d%H%M%S)"

echo "=== 八爪鱼 RPA Webhook - 迁移到环境变量配置 ==="
echo ""
echo "⚠️  重要提示："
echo "   本脚本不会自动修改你的 shell 配置文件 (~/.bashrc 或 ~/.zshrc)"
echo "   迁移完成后，请手动将环境变量添加到你的 shell 配置中"
echo ""

# 检查配置文件
if [ ! -f "$CONFIG_FILE" ]; then
    echo "❌ 错误：配置文件不存在：$CONFIG_FILE"
    exit 1
fi

# 备份原配置
echo "📦 备份原配置文件..."
cp "$CONFIG_FILE" "$BACKUP_FILE"
echo "✅ 备份完成：$BACKUP_FILE"
echo ""

# 读取配置
echo "📖 读取配置..."
CURRENT_KEY=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE')).get('key', ''))")
CURRENT_URL=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE')).get('url', ''))")

if [ -z "$CURRENT_KEY" ]; then
    echo "ℹ️  签名密钥为空，可能已使用环境变量"
fi

if [ -z "$CURRENT_URL" ]; then
    echo "ℹ️  Webhook URL 为空，可能已使用环境变量"
fi

echo ""

# 生成环境变量配置示例
echo "📝 生成环境变量配置示例..."
echo ""
echo "=========================================="
echo "📌 请将以下内容添加到你的 shell 配置文件:"
echo "=========================================="
echo ""

ENV_CONFIG="# 八爪鱼 RPA Webhook 配置 (从 config.json 迁移)
# 创建于：$(date '+%Y-%m-%d %H:%M:%S')
# 请将以下行添加到 ~/.bashrc 或 ~/.zshrc"

if [ -n "$CURRENT_KEY" ]; then
    ENV_CONFIG="$ENV_CONFIG
export BAZHUAYU_WEBHOOK_KEY=\"$CURRENT_KEY\""
fi

if [ -n "$CURRENT_URL" ]; then
    ENV_CONFIG="$ENV_CONFIG
export BAZHUAYU_WEBHOOK_URL=\"$CURRENT_URL\""
fi

echo "$ENV_CONFIG"
echo ""
echo "=========================================="
echo ""

# 保存到临时文件供用户参考
ENV_FILE="$SCRIPT_DIR/.env.migrated"
echo "$ENV_CONFIG" > "$ENV_FILE"
chmod 600 "$ENV_FILE"
echo "✅ 配置示例已保存到：$ENV_FILE"
echo ""

# 设置当前会话（可选）
read -p "是否为当前终端会话临时设置环境变量？(y/n) [默认:y] " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]] || [ -z "$REPLY" ]; then
    if [ -n "$CURRENT_KEY" ]; then
        export BAZHUAYU_WEBHOOK_KEY="$CURRENT_KEY"
    fi
    if [ -n "$CURRENT_URL" ]; then
        export BAZHUAYU_WEBHOOK_URL="$CURRENT_URL"
    fi
    echo "✅ 当前会话环境变量已设置（仅本次终端有效）"
else
    echo "ℹ️  跳过当前会话设置"
fi

echo ""

# 更新 config.json
echo "🔧 更新配置文件..."

python3 << EOF
import json
from pathlib import Path

config_file = Path("$CONFIG_FILE")
config = json.load(open(config_file))

# 移除敏感信息
if 'key' in config:
    config['key'] = ''  # 留空，从环境变量读取

# 更新安全标记
if 'security' not in config:
    config['security'] = {}
config['security']['keyFromEnv'] = True
config['security']['migratedAt'] = "$(date '+%Y-%m-%d %H:%M:%S')"
config['security']['version'] = '2.0'

# 保存
with open(config_file, 'w', encoding='utf-8') as f:
    json.dump(config, f, ensure_ascii=False, indent=2)

# 设置权限
import os
os.chmod(config_file, 0o600)

print("✅ 配置文件已更新")
print(f"   签名密钥已清空，将从 BAZHUAYU_WEBHOOK_KEY 环境变量读取")
EOF

echo ""
echo "=== 迁移完成 ==="
echo ""
echo "📌 下一步（必须完成）:"
echo ""
echo "  1️⃣  手动添加环境变量到 shell 配置:"
echo "     方式一：复制上面的 export 命令，添加到 ~/.bashrc 或 ~/.zshrc"
echo "     方式二：编辑 $ENV_FILE，然后手动复制内容"
echo ""
echo "  2️⃣  使环境变量生效:"
echo "     source ~/.bashrc  # 或 source ~/.zshrc"
echo ""
echo "  3️⃣  验证配置:"
echo "     python3 bazhuayu-webhook.py secure-check"
echo ""
echo "  4️⃣  测试连接:"
echo "     python3 bazhuayu-webhook.py test"
echo ""
echo "🔐 安全提示:"
echo "   - 签名密钥现在存储在环境变量中，不会写入配置文件"
echo "   - 配置文件权限已设置为 600"
echo "   - 不要将 .env.migrated 提交到版本控制"
echo ""
echo "如需回滚:"
echo "  cp $BACKUP_FILE $CONFIG_FILE"
echo ""


path: package.json
content: {
  "name": "bazhuayu-rpa-webhook",
  "version": "2.0.4",
  "description": "八爪鱼 RPA Webhook 调用工具 - 通过 Webhook 触发八爪鱼 RPA 任务运行，支持自定义参数传递",
  "description_en": "Octoparse RPA Webhook Tool - Trigger RPA tasks via Webhook with custom parameters",
  "main": "bazhuayu-webhook.py",
  "scripts": {
    "init": "python3 bazhuayu-webhook.py init",
    "run": "python3 bazhuayu-webhook.py run",
    "test": "python3 bazhuayu-webhook.py test",
    "config": "python3 bazhuayu-webhook.py config",
    "secure-check": "python3 bazhuayu-webhook.py secure-check",
    "setup": "./setup-secure.sh",
    "migrate": "./migrate-to-env.sh"
  },
  "keywords": [
    "rpa",
    "八爪鱼",
    "octoparse",
    "webhook",
    "automation",
    "自动化",
    "数据采集"
  ],
  "author": "OpenClaw Community",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/openclaw/openclaw",
    "directory": "skills/bazhuayu-webhook"
  },
  "engines": {
    "python": ">=3.6",
    "node": ">=14"
  },
  "os": [
    "linux",
    "darwin",
    "win32"
  ],
  "clawhub": {
    "slug": "bazhuayu-webhook",
    "category": "automation",
    "tags": [
      "rpa",
      "webhook",
      "octoparse",
      "automation",
      "security"
    ],
    "features": [
      "Webhook 触发 RPA 任务",
      "自定义参数传递",
      "环境变量安全存储",
      "自动签名计算",
      "安全检查工具"
    ],
    "requirements": {
      "python": true,
      "env": [
        "BAZHUAYU_WEBHOOK_URL (必需)",
        "BAZHUAYU_WEBHOOK_KEY (必需)"
      ]
    },
    "install_steps": [
      {
        "id": "copy-skill",
        "kind": "copy",
        "label": "复制 Skill 目录",
        "description": "将 bazhuayu-webhook 目录复制到你的技能目录"
      },
      {
        "id": "run-setup",
        "kind": "exec",
        "command": "./setup-secure.sh",
        "label": "运行安全配置向导",
        "description": "按提示输入 Webhook URL 和签名密钥"
      }
    ]
  },
  "files": [
    "bazhuayu-webhook.py",
    "bazhuayu-webhook",
    "setup-secure.sh",
    "migrate-to-env.sh",
    "config.example.json",
    ".gitignore",
    "README.md",
    "QUICKSTART.md",
    "SECURITY.md",
    "MANUAL.md",
    "MANUAL_SETUP.md",
    "WEBHOOK_SETUP.md",
    "SKILL.md",
    "images/"
  ],
  "release_notes": "v2.0.4 图文教程 - 新增 Webhook 设置图文教程，包含完整步骤截图"
}


path: run_daily.sh
content: #!/bin/bash
# 八爪鱼 RPA Webhook 每日自动运行脚本

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="$SCRIPT_DIR/run.log"

# 确保日志文件存在并设置安全权限 (600)
touch "$LOG_FILE"
chmod 600 "$LOG_FILE"

# 记录运行日志
echo "=== 运行时间：$(date '+%Y-%m-%d %H:%M:%S') ===" >> "$LOG_FILE"

# 运行任务（使用默认参数）
cd "$SCRIPT_DIR"
python3 bazhuayu-webhook.py run >> "$LOG_FILE" 2>&1

# 记录运行结果
if [ $? -eq 0 ]; then
    echo "✅ 运行成功" >> "$LOG_FILE"
else
    echo "❌ 运行失败" >> "$LOG_FILE"
fi

echo "" >> "$LOG_FILE"

# 再次确保日志文件权限正确（防止被重新创建）
chmod 600 "$LOG_FILE"


path: setup-secure.sh
content: #!/bin/bash
#
# 八爪鱼 RPA Webhook - 快速安全配置向导
# 
# 功能：
# 1. 收集配置信息
# 2. 生成环境变量配置示例（不自动修改 shell 配置）
# 3. 更新配置文件
# 4. 验证配置
#

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="$SCRIPT_DIR/config.json"

echo "🔐 八爪鱼 RPA Webhook - 快速安全配置向导"
echo "========================================"
echo ""
echo "⚠️  重要提示："
echo "   本脚本不会自动修改你的 shell 配置文件 (~/.bashrc 或 ~/.zshrc)"
echo "   配置完成后，请手动将环境变量添加到你的 shell 配置中"
echo ""

# 检查是否已有配置
if [ -f "$CONFIG_FILE" ]; then
    echo "📖 检测到现有配置文件"
    
    # 检查是否已使用环境变量
    CURRENT_KEY=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE')).get('key', ''))" 2>/dev/null || echo "")
    
    if [ -z "$CURRENT_KEY" ]; then
        echo "✅ 配置文件已使用安全模式 (密钥从环境变量读取)"
    else
        echo "⚠️  检测到密钥存储在配置文件中"
        echo ""
        read -p "是否迁移到环境变量模式？(y/n) [默认:y] " -n 1 -r
        echo ""
        if [[ $REPLY =~ ^[Yy]$ ]] || [ -z "$REPLY" ]; then
            echo ""
            echo "🚀 运行迁移脚本..."
            "$SCRIPT_DIR/migrate-to-env.sh"
            exit 0
        else
            echo "ℹ️  跳过迁移，继续配置..."
        fi
    fi
    echo ""
fi

# 收集配置信息
echo "--- 配置信息 ---"
echo ""

if [ -f "$CONFIG_FILE" ]; then
    CURRENT_URL=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE')).get('url', ''))" 2>/dev/null || echo "")
    if [ -n "$CURRENT_URL" ]; then
        echo "当前 Webhook URL: ${CURRENT_URL:0:20}...${CURRENT_URL: -20}"
        read -p "是否修改？(y/n) [默认:n] " -n 1 -r
        echo ""
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            read -p "请输入新的 Webhook URL: " WEBHOOK_URL
        else
            WEBHOOK_URL="$CURRENT_URL"
        fi
    else
        read -p "请输入 Webhook URL: " WEBHOOK_URL
    fi
else
    read -p "请输入 Webhook URL: " WEBHOOK_URL
fi

read -p "请输入签名密钥 (Key): " WEBHOOK_KEY

# 验证输入
if [ -z "$WEBHOOK_URL" ]; then
    echo "❌ 错误：Webhook URL 不能为空"
    exit 1
fi

if [ -z "$WEBHOOK_KEY" ]; then
    echo "❌ 错误：签名密钥不能为空"
    exit 1
fi

if [ ${#WEBHOOK_KEY} -lt 8 ]; then
    echo "⚠️  警告：密钥长度较短 (${#WEBHOOK_KEY} 字符)，建议使用更安全的密钥"
    read -p "是否继续？(y/n) [默认:n] " -n 1 -r
    echo ""
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

echo ""

# 生成环境变量配置示例
echo "📝 生成环境变量配置..."
echo ""
echo "=========================================="
echo "📌 请将以下内容添加到你的 shell 配置文件:"
echo "=========================================="
echo ""

ENV_CONFIG="# 八爪鱼 RPA Webhook 配置
# 创建于：$(date '+%Y-%m-%d %H:%M:%S')
# 请将以下两行添加到 ~/.bashrc 或 ~/.zshrc
export BAZHUAYU_WEBHOOK_URL=\"$WEBHOOK_URL\"
export BAZHUAYU_WEBHOOK_KEY=\"$WEBHOOK_KEY\""

echo "$ENV_CONFIG"
echo ""
echo "=========================================="
echo ""

# 保存到临时文件供用户参考
ENV_FILE="$SCRIPT_DIR/.env.example"
echo "$ENV_CONFIG" > "$ENV_FILE"
chmod 600 "$ENV_FILE"
echo "✅ 配置示例已保存到：$ENV_FILE"
echo ""

# 设置当前会话（可选）
read -p "是否为当前终端会话临时设置环境变量？(y/n) [默认:y] " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]] || [ -z "$REPLY" ]; then
    export BAZHUAYU_WEBHOOK_URL="$WEBHOOK_URL"
    export BAZHUAYU_WEBHOOK_KEY="$WEBHOOK_KEY"
    echo "✅ 当前会话环境变量已设置（仅本次终端有效）"
else
    echo "ℹ️  跳过当前会话设置"
fi

echo ""

# 更新/创建配置文件
echo "🔧 更新配置文件..."

python3 << EOF
import json
from pathlib import Path
import os

config_file = Path("$CONFIG_FILE")

# 尝试读取现有配置
if config_file.exists():
    config = json.load(open(config_file))
else:
    config = {
        'paramNames': [],
        'defaultParams': {}
    }

# 更新配置 (URL 可存储，密钥留空)
config['url'] = "$WEBHOOK_URL"
config['key'] = ''  # 从环境变量读取

# 安全标记
config['security'] = {
    'keyFromEnv': True,
    'urlFromEnv': False,
    'createdAt': "$(date '+%Y-%m-%d %H:%M:%S')",
    'version': '2.0'
}

# 保存
with open(config_file, 'w', encoding='utf-8') as f:
    json.dump(config, f, ensure_ascii=False, indent=2)

# 设置权限
os.chmod(config_file, 0o600)

print("✅ 配置文件已更新")
print(f"   位置：{config_file.absolute()}")
print(f"   权限：600 (仅所有者可读写)")
EOF

echo ""
echo "=== 配置完成 ==="
echo ""
echo "📌 下一步（必须完成）:"
echo ""
echo "  1️⃣  手动添加环境变量到 shell 配置:"
echo "     方式一：复制上面的 export 命令，添加到 ~/.bashrc 或 ~/.zshrc"
echo "     方式二：编辑 $ENV_FILE，然后手动复制内容"
echo ""
echo "  2️⃣  使环境变量生效:"
echo "     source ~/.bashrc  # 或 source ~/.zshrc"
echo ""
echo "  3️⃣  验证配置:"
echo "     python3 bazhuayu-webhook.py secure-check"
echo ""
echo "  4️⃣  测试连接:"
echo "     python3 bazhuayu-webhook.py test"
echo ""
echo "  5️⃣  运行任务:"
echo "     python3 bazhuayu-webhook.py run"
echo ""
echo "🔐 安全提示:"
echo "   - 签名密钥存储在环境变量中，不会写入配置文件"
echo "   - 配置文件权限已设置为 600"
echo "   - 不要将 config.json 提交到版本控制"
echo "   - 不要将 .env.example 提交到版本控制"
echo ""


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)