Skill: jiebao360/feishu-bot-config-helper (version 0.1.2)

# 🤖 飞书机器人配置助手 - 技能文档 **版本**: v1.0.0 **类型**: 飞书机器人自动配置 **难度**: ⭐⭐⭐⭐ --- ## 📋 技能概述 在飞书对话中直接配置新机器人，自动完成 Agent 创建、工作空间配置、Gateway 重启。 --- ## 🎯 核心能力 - ✅ 飞书机器人自动配置 - ✅ 智能 Agent 匹配（7 种规则） - ✅ 自动更新 openclaw.json - ✅ 自动重启 Gateway - ✅ 返回配置报告 --- ## 🚀 安装方式 ### Mac / Linux ```bash curl -fsSL https://raw.githubusercontent.com/jiebao360/feishu-bot-config-helper/main/install.sh | bash ``` ### Windows ```powershell curl -fsSL https://raw.githubusercontent.com/jiebao360/feishu-bot-config-helper/main/install.bat -o install.bat .\install.bat ``` --- ## 🎭 Agent 阵容 | Agent | 职责 | 默认模型 | |-------|------|----------| | 第二大脑笔记虾 | 知识管理 + 素材提供 | doubao-pro | | 朋友圈创作虾 | 朋友圈文案创作 | doubao | | 电商视频导演虾 | 电商视频脚本 | doubao-pro | | 通用内容创作虾 | 通用内容创作 | doubao | | 图片素材生成虾 | 图片搜索 + 生成 | doubao-pro | | 电商 Seedance 导演虾 | Seedance 提示词 | doubao-pro | | 工作助手 | 工作相关任务 | doubao | --- ## ⚙️ 配置规范 严格遵循官方模板： 1. 每个飞书机器人对应一个独立 Agent 2. 拥有独立的工作空间和记忆 3. 在 `agents.list` 中定义 Agent 4. 在 `channels.feishu.accounts` 中配置机器人 5. 在 `bindings` 中添加路由绑定 6. 使用 `dmScope: "per-account-channel-peer"` 7. 群组策略使用 `groupPolicy: "open"` --- ## 📁 文件清单 ``` feishu-bot-config-helper/ ├── scripts/ │ └── auto-configure-bot.js # 自动配置脚本 ├── index.js # 主入口 ├── install.sh # Mac/Linux 安装脚本 ├── install.bat # Windows 安装脚本 ├── package.json # 项目配置 ├── SKILL.md # 技能文档 ├── README.md # 使用说明 ├── CHANGELOG.md # 更新日志 └── LICENSE # MIT 许可证 ``` --- ## 🔗 相关资源 - **GitHub**: https://github.com/jiebao360/feishu-bot-config-helper - **OpenClaw 文档**: https://docs.openclaw.ai - **飞书开放平台**: https://open.feishu.cn/ --- <div align="center"> **🦞 让龙虾成为你的飞书机器人配置助手！** </div>

path: CHANGELOG.md
content: # 📝 更新日志

## v1.0.0 (2026-03-17)

**核心功能**:
- ✅ 飞书机器人自动配置系统
- ✅ 在飞书对话中直接配置新机器人
- ✅ 智能匹配 Agent（7 种规则）
- ✅ 自动更新 openclaw.json
- ✅ 自动重启 Gateway

**智能匹配规则**:
| 关键词 | Agent ID |
|--------|---------|
| 笔记/笔记虾/第二大脑 | notes |
| 内容/创作/通用 | generic_content |
| 朋友圈/社交 | moment |
| 视频/导演 | video |
| Seedance/提示词 | seedance |
| 图片/设计 | image |
| 工作/助手 | work |

**配置规范**:
- 每个飞书机器人对应一个独立 Agent
- 拥有独立的工作空间和记忆
- dmScope: per-account-channel-peer
- groupPolicy: open

**核心文件**:
- scripts/auto-configure-bot.js - 自动配置脚本
- index.js - 主入口
- install.sh / install.bat - 安装脚本
- package.json - 项目配置

---


path: README.md
content: # 🤖 飞书机器人配置助手

> 在飞书对话中直接配置新机器人，自动完成所有配置

**版本**: v1.0.0  
**作者**: OpenClaw 来合火  
**创建时间**: 2026-03-17

---

## ✨ 核心功能

- ✅ 在飞书对话中直接配置新机器人
- ✅ 自动解析配置信息
- ✅ 智能匹配 Agent 类型（7 种规则）
- ✅ 自动创建工作空间
- ✅ 自动更新 openclaw.json
- ✅ 自动重启 Gateway
- ✅ 返回配置报告

---

## 🚀 快速开始

### 安装

**Mac / Linux**:
```bash
cd ~/.openclaw/workspace-main/skills/
git clone https://github.com/jiebao360/feishu-bot-config-helper.git
cd feishu-bot-config-helper
bash install.sh
```

**Windows**:
```powershell
cd ~/.openclaw/workspace-main/skills/
git clone https://github.com/jiebao360/feishu-bot-config-helper.git
cd feishu-bot-config-helper
.\install.bat
```

---

## 📋 配置格式

### 标准格式

```
配置飞书机器人：机器人名称
飞书应用凭证：
App ID: cli_xxx
App Secret: xxx
创建技能：技能名称（可选）
```

### 示例 1: 配置笔记虾

```
配置飞书机器人：来合火 1 号第二大脑笔记虾
飞书应用凭证：
App ID: cli_a93cff63cc789cee
App [REDACTED_SECRET]
```

**自动匹配**:
- Agent ID: `notes`
- Agent 名称：`第二大脑笔记虾`
- 技能：`make-notes, web-search, file-reading`

---

### 示例 2: 配置工作助手

```
配置飞书机器人：工作助手
飞书应用凭证：
App ID: cli_xxx_work
App [REDACTED_SECRET]
创建技能：Content Agent
```

**自动匹配**:
- Agent ID: `work`
- Agent 名称：`工作助手`
- 技能：`make-create, content-optimization`

---

## 🎭 智能匹配规则

| 机器人名称包含 | Agent ID | Agent 名称 | 默认技能 |
|---------------|---------|-----------|---------|
| 笔记/笔记虾/第二大脑/知识 | notes | 第二大脑笔记虾 | make-notes, web-search, file-reading |
| 内容/创作/文章/通用 | generic_content | 通用内容创作虾 | make-create, content-optimization |
| 朋友圈/社交/媒体 | moment | 朋友圈创作虾 | make-moments |
| 视频/导演/脚本 | video | 电商视频导演虾 | video-script, storyboard |
| Seedance/提示词 | seedance | 电商 Seedance 导演虾 | seedance-director, prompt-engineering |
| 图片/设计/封面/素材 | image | 图片素材生成虾 | make-image, image-search, doubao-prompt |
| 工作/助手 | work | 工作助手 | all |

---

## ⚙️ 配置规范

严格遵循官方参考模板：

### 1. 每个飞书机器人对应一个独立 Agent

```json
{
  "id": "work",
  "name": "工作助手",
  "workspace": "~/.openclaw/workspace-work",
  "model": { "primary": "ark/doubao" },
  "skills": ["all"]
}
```

### 2. 在 `agents.list` 中定义 Agent

- `id`: 唯一标识
- `name`: 显示名称
- `workspace`: 工作空间路径
- `model`: 使用的大模型
- `skills`: 启用的技能列表

### 3. 创建工作空间目录

```bash
~/.openclaw/workspace-work/
```

### 4. 在 `channels.feishu.accounts` 中配置

```json
"work": {
  "appId": "cli_xxx_work",
  "appSecret": "work_secret",
  "botName": "工作助手",
  "dmPolicy": "allowlist",
  "allowFrom": ["*"],
  "groupPolicy": "open"
}
```

### 5. 在 `bindings` 中添加路由绑定

```json
{
  "agentId": "work",
  "match": {
    "channel": "feishu",
    "accountId": "work"
  }
}
```

### 6. 会话隔离

```json
"session": {
  "dmScope": "per-account-channel-peer"
}
```

### 7. 群组策略

```json
"groupPolicy": "open"
```

---

## 🚀 自动完成

配置后系统自动完成：

1. ✅ 解析配置信息
2. ✅ 智能匹配 Agent
3. ✅ 创建工作空间目录
4. ✅ 添加 Agent 配置
5. ✅ 添加飞书账户配置
6. ✅ 添加路由绑定
7. ✅ 更新 openclaw.json
8. ✅ 重启 Gateway
9. ✅ 返回配置报告

---

## 📊 配置报告示例

```
✅ 飞书机器人配置完成！

📋 配置信息:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
机器人名称：工作助手
Agent ID: work
Agent 名称：工作助手
工作空间：~/.openclaw/workspace-work
App ID: cli_xxx_work
技能：all
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🎯 已完成的配置:
✅ 创建工作空间目录
✅ 添加 Agent 配置
✅ 添加飞书账户配置
✅ 添加路由绑定
✅ 更新 openclaw.json
✅ 重启 Gateway

📱 下一步:
1. 在飞书开放平台完成应用配置
2. 配置事件订阅
3. 发布应用
4. 在飞书中搜索"工作助手"并测试
```

---

## 🐛 常见问题

### Q1: 配置后机器人无响应

**解决**:
```bash
# 1. 检查 Gateway 状态
openclaw status

# 2. 查看日志
tail -f ~/.openclaw/logs/*.log

# 3. 验证配置
cat ~/.openclaw/openclaw.json | jq '.agents.list[] | {id, name}'
```

### Q2: Agent 匹配不准确

**解决**:
- 在配置信息中明确指定技能
- 如：`创建技能：Content Agent`

### Q3: 工作空间已存在

**解决**:
- 自动配置会检测，如果存在会跳过创建
- 如需重置，手动删除工作空间目录

---

## 📚 相关资源

- **GitHub**: https://github.com/jiebao360/feishu-bot-config-helper
- **OpenClaw 文档**: https://docs.openclaw.ai
- **飞书开放平台**: https://open.feishu.cn/

---

<div align="center">

**🦞 在飞书对话中直接配置，让 AI 帮你完成所有配置！**

**版本**: v1.0.0 | **创建**: 2026-03-17

</div>


path: install.sh
content: #!/bin/bash

set -e

echo "🚀 开始安装飞书机器人配置助手..."
echo ""

cd ~/.openclaw/workspace-main/skills/

if [ -d "feishu-bot-config-helper" ]; then
  echo "⚠️  技能已安装，是否覆盖？(y/N)"
  read -n 1 -r
  echo ""
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    exit 0
  fi
  rm -rf "feishu-bot-config-helper"
fi

echo "📦 克隆技能包..."
git clone https://github.com/jiebao360/feishu-bot-config-helper.git
cd feishu-bot-config-helper

echo "📦 安装依赖..."
npm install

chmod +x scripts/auto-configure-bot.js

echo ""
echo "✅ 安装完成！"
echo ""
echo "🚀 使用方式:"
echo "   在飞书对话中发送:"
echo "   配置飞书机器人：机器人名称"
echo "   飞书应用凭证："
echo "   App ID: cli_xxx"
echo "   App Secret: xxx"
echo ""


path: package.json
content: {
  "name": "feishu-bot-config-helper",
  "version": "1.0.0",
  "description": "飞书机器人配置助手 - 在飞书对话中直接配置新机器人",
  "author": "OpenClaw 来合火",
  "license": "MIT",
  "main": "index.js",
  "scripts": {
    "configure": "node scripts/auto-configure-bot.js"
  },
  "keywords": [
    "openclaw",
    "skill",
    "feishu",
    "bot-config",
    "auto-configure"
  ]
}


path: scripts/auto-configure-bot.js
content: #!/usr/bin/env node

/**
 * 飞书机器人配置助手 - 自动配置脚本 v1.0.0
 * 
 * 支持在飞书对话中直接配置新机器人
 * 自动创建 Agent、工作空间、路由绑定
 * 自动更新 openclaw.json 并重启 Gateway
 */

const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');

class FeishuBotConfigHelper {
  constructor() {
    this.openclawConfigPath = path.join(process.env.HOME, '.openclaw', 'openclaw.json');
    this.workspaceBase = path.join(process.env.HOME, '.openclaw');
  }

  /**
   * 解析配置命令
   */
  parseConfigCommand(message) {
    const lines = message.split('\n').map(line => line.trim()).filter(line => line);
    
    const config = {
      robotName: '',
      appId: '',
      appSecret: '',
      agentId: '',
      agentName: '',
      workspace: '',
      skills: [],
      model: 'ark/doubao'
    };

    for (const line of lines) {
      if (line.includes('配置飞书机器人：')) {
        config.robotName = line.split('配置飞书机器人：')[1].trim();
      }
      if (line.toLowerCase().includes('app id:')) {
        config.appId = line.split(':')[1].trim();
      }
      if (line.toLowerCase().includes('app secret:')) {
        config.appSecret = line.split(':')[1].trim();
      }
      if (line.includes('创建技能')) {
        const match = line.match(/创建技能\s*(.+?)(?:（|,|，|$)/);
        if (match && match[1]) {
          config.skills = this.parseSkills(match[1].trim());
        }
      }
    }

    if (config.robotName) {
      const match = this.autoMatchAgent(config.robotName);
      config.agentId = match.agentId;
      config.agentName = match.agentName;
      config.workspace = `~/.openclaw/workspace-${config.agentId}`;
      
      if (config.skills.length === 0) {
        config.skills = match.defaultSkills;
      }
    }

    return config;
  }

  /**
   * 自动匹配 Agent
   */
  autoMatchAgent(robotName) {
    const nameLower = robotName.toLowerCase();
    
    const rules = [
      {
        keywords: ['笔记', '笔记虾', '第二大脑', '知识'],
        agentId: 'notes',
        agentName: '第二大脑笔记虾',
        defaultSkills: ['make-notes', 'web-search', 'file-reading']
      },
      {
        keywords: ['内容', '创作', '文章', '通用'],
        agentId: 'generic_content',
        agentName: '通用内容创作虾',
        defaultSkills: ['make-create', 'content-optimization']
      },
      {
        keywords: ['朋友圈', '社交', '媒体'],
        agentId: 'moment',
        agentName: '朋友圈创作虾',
        defaultSkills: ['make-moments']
      },
      {
        keywords: ['视频', '导演', '脚本'],
        agentId: 'video',
        agentName: '电商视频导演虾',
        defaultSkills: ['video-script', 'storyboard']
      },
      {
        keywords: ['seedance', '提示词'],
        agentId: 'seedance',
        agentName: '电商 Seedance 导演虾',
        defaultSkills: ['seedance-director', 'prompt-engineering']
      },
      {
        keywords: ['图片', '设计', '封面', '素材'],
        agentId: 'image',
        agentName: '图片素材生成虾',
        defaultSkills: ['make-image', 'image-search', 'doubao-prompt']
      },
      {
        keywords: ['工作', '助手'],
        agentId: 'work',
        agentName: '工作助手',
        defaultSkills: ['all']
      }
    ];

    for (const rule of rules) {
      for (const keyword of rule.keywords) {
        if (nameLower.includes(keyword.toLowerCase())) {
          return rule;
        }
      }
    }

    return {
      agentId: 'generic_content',
      agentName: '通用内容创作虾',
      defaultSkills: ['make-create', 'content-optimization']
    };
  }

  /**
   * 解析技能名称
   */
  parseSkills(skillName) {
    const map = {
      'content agent': ['make-create', 'content-optimization'],
      '内容创作': ['make-create', 'content-optimization'],
      'note agent': ['make-notes', 'web-search', 'file-reading'],
      '笔记虾': ['make-notes', 'web-search', 'file-reading'],
      'moment agent': ['make-moments'],
      '朋友圈': ['make-moments']
    };

    const lower = skillName.toLowerCase();
    for (const [key, skills] of Object.entries(map)) {
      if (lower.includes(key.toLowerCase())) {
        return skills;
      }
    }

    return ['all'];
  }

  /**
   * 创建工作空间
   */
  async createWorkspace(agentId) {
    const workspacePath = path.join(this.workspaceBase, `workspace-${agentId}`);
    
    return new Promise((resolve) => {
      if (fs.existsSync(workspacePath)) {
        console.log(`✅ 工作空间已存在：${workspacePath}`);
        resolve(workspacePath);
        return;
      }

      exec(`mkdir -p "${workspacePath}"`, (error) => {
        if (error) {
          console.error('❌ 创建工作空间失败:', error.message);
        } else {
          console.log(`✅ 工作空间已创建：${workspacePath}`);
        }
        resolve(workspacePath);
      });
    });
  }

  /**
   * 读取配置
   */
  readConfig() {
    try {
      const content = fs.readFileSync(this.openclawConfigPath, 'utf-8');
      return JSON.parse(content);
    } catch (error) {
      console.error('❌ 读取配置失败:', error.message);
      return null;
    }
  }

  /**
   * 写入配置
   */
  writeConfig(config) {
    try {
      fs.writeFileSync(this.openclawConfigPath, JSON.stringify(config, null, 2), 'utf-8');
      console.log('✅ 配置文件已更新');
      return true;
    } catch (error) {
      console.error('❌ 写入配置失败:', error.message);
      return false;
    }
  }

  /**
   * 添加 Agent
   */
  addAgent(config, botConfig) {
    if (!config.agents) {
      config.agents = {
        defaults: { model: { primary: 'ark/doubao' }, compaction: { mode: 'safeguard' } },
        list: []
      };
    }

    if (!config.agents.list) {
      config.agents.list = [];
    }

    const exists = config.agents.list.some(agent => agent.id === botConfig.agentId);
    if (exists) {
      console.log(`⚠️  Agent ${botConfig.agentId} 已存在，更新配置`);
      const agent = config.agents.list.find(a => a.id === botConfig.agentId);
      agent.name = botConfig.agentName;
      agent.workspace = `~/.openclaw/workspace-${botConfig.agentId}`;
      agent.skills = botConfig.skills;
    } else {
      config.agents.list.push({
        id: botConfig.agentId,
        name: botConfig.agentName,
        workspace: `~/.openclaw/workspace-${botConfig.agentId}`,
        model: { primary: 'ark/doubao' },
        skills: botConfig.skills
      });
      console.log(`✅ Agent 已添加：${botConfig.agentId} (${botConfig.agentName})`);
    }
    return true;
  }

  /**
   * 添加飞书账户
   */
  addFeishuAccount(config, botConfig) {
    if (!config.channels || !config.channels.feishu) {
      console.error('❌ 飞书渠道未配置');
      return false;
    }

    if (!config.channels.feishu.accounts) {
      config.channels.feishu.accounts = {};
    }

    config.channels.feishu.accounts[botConfig.agentId] = {
      appId: botConfig.appId,
      appSecret: botConfig.appSecret,
      botName: botConfig.robotName,
      dmPolicy: 'allowlist',
      allowFrom: ['*'],
      groupPolicy: 'open'
    };

    console.log(`✅ 飞书账户已配置：${botConfig.agentId} (${botConfig.robotName})`);
    return true;
  }

  /**
   * 添加路由绑定
   */
  addBinding(config, botConfig) {
    if (!config.bindings) {
      config.bindings = [];
    }

    const exists = config.bindings.some(
      b => b.agentId === botConfig.agentId && b.match.accountId === botConfig.agentId
    );

    if (exists) {
      console.log(`⚠️  路由绑定已存在，跳过`);
      return false;
    }

    config.bindings.push({
      agentId: botConfig.agentId,
      match: { channel: 'feishu', accountId: botConfig.agentId }
    });

    console.log(`✅ 路由绑定已添加：${botConfig.agentId}`);
    return true;
  }

  /**
   * 重启 Gateway
   */
  async restartGateway() {
    console.log('🔄 正在重启 Gateway...');
    
    return new Promise((resolve, reject) => {
      exec('openclaw gateway restart', (error) => {
        if (error) {
          console.error('❌ Gateway 重启失败:', error.message);
          reject(error);
          return;
        }
        console.log('✅ Gateway 重启成功');
        resolve();
      });
    });
  }

  /**
   * 生成报告
   */
  generateReport(botConfig) {
    return `
✅ 飞书机器人配置完成！

📋 配置信息:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
机器人名称：${botConfig.robotName}
Agent ID: ${botConfig.agentId}
Agent 名称：${botConfig.agentName}
工作空间：~/.openclaw/workspace-${botConfig.agentId}
App ID: ${botConfig.appId}
技能：${botConfig.skills.join(', ')}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🎯 已完成的配置:
✅ 创建工作空间目录
✅ 添加 Agent 配置
✅ 添加飞书账户配置
✅ 添加路由绑定
✅ 更新 openclaw.json
✅ 重启 Gateway

📱 下一步:
1. 在飞书开放平台完成应用配置
2. 配置事件订阅
3. 发布应用
4. 在飞书中搜索"${botConfig.robotName}"并测试
`;
  }

  /**
   * 主流程
   */
  async configure(message) {
    console.log('🤖 开始自动配置飞书机器人...\n');

    const botConfig = this.parseConfigCommand(message);
    
    if (!botConfig.robotName || !botConfig.appId || !botConfig.appSecret) {
      console.error('❌ 配置信息不完整，请提供：机器人名称、App ID、App Secret');
      return null;
    }

    console.log(`📋 解析到的配置:`);
    console.log(`   机器人名称：${botConfig.robotName}`);
    console.log(`   Agent ID: ${botConfig.agentId}`);
    console.log(`   Agent 名称：${botConfig.agentName}`);
    console.log(`   App ID: ${botConfig.appId}`);
    console.log(`   技能：${botConfig.skills.join(', ')}`);
    console.log('');

    await this.createWorkspace(botConfig.agentId);

    const config = this.readConfig();
    if (!config) {
      console.error('❌ 无法读取配置文件');
      return null;
    }

    this.addAgent(config, botConfig);
    this.addFeishuAccount(config, botConfig);
    this.addBinding(config, botConfig);

    if (!this.writeConfig(config)) {
      console.error('❌ 配置更新失败');
      return null;
    }

    await this.restartGateway();

    const report = this.generateReport(botConfig);
    console.log(report);

    return { success: true, config: botConfig, report };
  }
}

// CLI
async function main() {
  const args = process.argv.slice(2);
  
  if (args.includes('--help')) {
    console.log(`
🤖 飞书机器人配置助手 v1.0.0

用法:
  node scripts/auto-configure-bot.js --config "<配置文本>"

配置文本格式:
  配置飞书机器人：机器人名称
  飞书应用凭证：
  App ID: cli_xxx
  App Secret: xxx
  创建技能：技能名称（可选）
`);
    process.exit(0);
  }

  let configText = '';
  for (let i = 0; i < args.length; i += 2) {
    if (args[i] === '--config' && args[i + 1]) {
      configText = args[i + 1];
    }
  }

  if (!configText) {
    console.error('❌ 错误：必须提供 --config 参数');
    process.exit(1);
  }

  const helper = new FeishuBotConfigHelper();
  try {
    await helper.configure(configText);
  } catch (error) {
    console.error('❌ 配置失败:', error.message);
    process.exit(1);
  }
}

module.exports = FeishuBotConfigHelper;

if (require.main === module) {
  main().catch(console.error);
}


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