# Bot Config

> 管理 CloseCrab bot 配置（Firestore）。添加新 bot、给已有 bot 添加 channel、切换 channel、查看配置。当用户说"添加一个 bot"、"新建 bot"、"加个飞书 channel"、"加个 discord channel"、"切换到飞书"、"bot 配置"、"add bot"、"add channel"等关键词时触发。

- Skill: `yangwhale/bot-config` (Agent Skill)
- Install (CLI): `npx skillmds@latest add yangwhale/bot-config`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yangwhale/bot-config/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: yangwhale (https://skillmd.com/u/yangwhale)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yangwhale/bot-config

---


# Bot Config 管理

所有 bot 配置存储在 Firestore（由 `FIRESTORE_PROJECT` / `FIRESTORE_DATABASE` 环境变量配置），通过 `scripts/config-manage.py` 管理。

## 管理脚本位置

```
~/CloseCrab/scripts/config-manage.py
```

## 支持的操作

### 1. 查看

```bash
# 列出所有 bot
python3 ~/CloseCrab/scripts/config-manage.py list

# 查看某个 bot 配置（密钥自动打码）
python3 ~/CloseCrab/scripts/config-manage.py show <bot_name>
```

### 2. 创建新 bot

用 AskUserQuestion 收集以下信息：
1. **Bot 名称** — 英文小写，用于 Firestore document ID 和 `run.sh <name>` 启动
2. **首选 channel 类型** — discord / feishu / lark / dingtalk
3. **channel 凭据** — 根据类型不同（见下方各 channel 指南）

```bash
python3 ~/CloseCrab/scripts/config-manage.py create <bot_name> \
  --channel <type> \
  --description "描述" \
  [channel-specific options]
```

### 3. 给已有 bot 添加 channel

```bash
python3 ~/CloseCrab/scripts/config-manage.py add-channel <bot_name> <channel_type> [options]
```

### 4. 切换活跃 channel

```bash
python3 ~/CloseCrab/scripts/config-manage.py set-channel <bot_name> <channel_type>
```

### 5. 修改配置字段

```bash
python3 ~/CloseCrab/scripts/config-manage.py set <bot_name> <field> <value>
```

### 6. 删除 bot

```bash
python3 ~/CloseCrab/scripts/config-manage.py delete <bot_name> --yes
```

---

## Channel 创建指南

### Discord

**需要的信息：**
- `--token` — Bot Token

**可选：**
- `--log-channel-id` — 日志频道 ID
- `--auto-respond-channels` — 自动回复频道 ID（逗号分隔）

**获取方式：**
1. 打开 [Discord Developer Portal](https://discord.com/developers/applications)
2. 点击 **New Application** → 起名 → 创建
3. 左侧 **Bot** 页面：
   - 点 **Reset Token** 复制 Token（只显示一次！）
   - 开启 3 个 Privileged Intents：**Presence Intent**、**Server Members Intent**、**Message Content Intent**
4. 左侧 **OAuth2** 页面：
   - Scopes: 勾选 `bot`、`applications.commands`
   - Bot Permissions: Send Messages, Read Message History, Embed Links, Attach Files, View Channels
   - 复制生成的 URL，在浏览器打开邀请 bot 进服务器
5. 左侧 **Installation** 页面：
   - **禁用 User Install**（安全考虑）
6. 获取频道 ID：Discord 设置 → 高级 → 开启开发者模式 → 右键频道 → 复制频道 ID

**示例：**
```bash
python3 ~/CloseCrab/scripts/config-manage.py create mybot \
  --channel discord \
  --token "MTQ3xxx..." \
  --log-channel-id "1234567890" \
  --auto-respond-channels "1111111111,2222222222"
```

---

### 飞书 (Feishu)

**需要的信息：**
- `--app-id` — 应用 App ID
- `--app-secret` — 应用 App Secret

**可选：**
- `--log-chat-id` — 日志群 Chat ID
- `--allowed-open-ids` — 允许的用户 Open ID（逗号分隔）
- `--auto-respond-chats` — 自动回复群 Chat ID（逗号分隔）

**获取方式：**
1. 打开 [飞书开放平台](https://open.feishu.cn/app)
2. 点击 **创建企业自建应用**
3. 在应用详情页的 **凭证与基础信息** 中获取 **App ID** 和 **App Secret**
4. 左侧 **添加应用能力** → 添加 **机器人**
5. **权限管理** → 申请以下权限：
   - `im:message` — 获取与发送消息
   - `im:message.group_at_msg` — 接收群聊 @机器人消息
   - `im:message.p2p_msg` — 接收私聊消息
   - `im:chat` — 获取群信息
   - `contact:user.base:readonly` — 获取用户基本信息（可选）
6. **事件与回调** → **事件配置**：
   - 启用 **长连接 (WebSocket)** 模式（推荐，无需公网 IP）
   - 订阅事件：`im.message.receive_v1`（接收消息）
7. **版本管理与发布** → 创建版本 → 申请发布 → 管理员审批
8. 发布后在飞书客户端搜索 bot 名称即可发起对话

**示例：**
```bash
python3 ~/CloseCrab/scripts/config-manage.py add-channel mybot feishu \
  --app-id "cli_a932b22651785cb2" \
  --app-secret "VEvf3daX..."
```

---

### Lark (国际版飞书)

**需要的信息：**
- `--app-id` — 应用 App ID（`cli_` 开头）
- `--app-secret` — 应用 App Secret

**获取方式：**
1. 打开 [Lark Developer Console](https://open.larksuite.com/app)
2. 步骤与飞书相同，但注意：
   - Lark Standard 版 **API 限额仅 10,000 次/月**（飞书基础版目前 1M/月）
   - 域名用 `open.larksuite.com` 而非 `open.feishu.cn`
   - SDK domain 用 `LARK_DOMAIN` 而非 `FEISHU_DOMAIN`

**注意事项：**
- 如果同时有飞书和 Lark 应用，需要分别创建两个应用（不同的 App ID）
- Lark 的 API quota 很低，建议只在必须接入国际用户时使用

**示例：**
```bash
python3 ~/CloseCrab/scripts/config-manage.py add-channel mybot lark \
  --app-id "cli_a948237ceff89eef" \
  --app-secret "L46GVtnm..."
```

---

### 钉钉 (DingTalk)

**需要的信息：**
- `--client-id` — 应用 Client ID（`ding` 开头）
- `--client-secret` — 应用 Client Secret

**获取方式：**
1. 打开 [钉钉开放平台](https://open-dev.dingtalk.com/)
2. 应用开发 → 企业内部开发 → 创建应用
3. 在 **应用凭证** 中获取 **Client ID** 和 **Client Secret**
4. 添加 **消息收发** 能力
5. 配置事件订阅（Stream 模式，无需公网 IP）

**示例：**
```bash
python3 ~/CloseCrab/scripts/config-manage.py create dingbot \
  --channel dingtalk \
  --client-id "dingxxx" \
  --client-secret "xxx"
```

---

## 创建后的操作

bot 配置写入 Firestore 后，还需要：

1. **启动 bot**：
   ```bash
   cd ~/CloseCrab && ./run.sh <bot_name>
   ```

2. **远程机器部署**（如需在其他机器运行）：
   ```bash
   ssh <machine> "cd ~/CloseCrab && git pull && ./run.sh <bot_name>"
   ```
   不需要 `.env` 文件，配置全从 Firestore 读取。

3. **加入 Team**（可选）：
   ```bash
   python3 ~/CloseCrab/scripts/config-manage.py set <bot_name> team \
     '{"role":"teammate","leader_bot_id":"1473626xxx","team_channel_id":"1477228xxx"}'
   ```

## 交互式引导

当用户没有提供完整信息时，用 AskUserQuestion 逐步引导：

1. 先问 **bot 名称**和 **channel 类型**
2. 根据 channel 类型，展示上方对应的「获取方式」步骤
3. 等用户提供凭据后执行创建命令
4. 创建完成后提示用户启动 bot

