Skip to main content
vincentor

lark-cli

by vincentorv0.1.0

飞书(Lark)机器人CLI集成 - 发送消息、监听事件、管理多租户配置

Installation guide →
1 skill 6 commands GitHub

Commands

lark-card

发送飞书卡片消息

lark-config

查看或管理飞书机器人配置

lark-listen

监听飞书事件(WebSocket)

lark-notify-group

发送结构化通知到配置的群聊并 @指定用户。每次任务完成或需要用户输入时必须调用。

lark-notify

快速发送通知消息给默认接收者

lark-send

发送飞书消息给指定用户或群聊(支持 @ 功能和群聊)

Documentation

# lark-cli 插件

飞书(Lark)机器人 CLI 集成插件,支持发送消息、**AI Agent 自动回复**、监听事件、管理多租户配置。

## 前置依赖

### 基础依赖

- [uv](https://docs.astral.sh/uv/) - Python 包管理器
- Python >= 3.10

插件包含完整的 lark-cli 源码,无需额外安装。

### AI Agent 额外依赖

使用 `lark-cli agent` 命令启动 AI Agent 功能需要以下额外条件:

1. **Claude Code CLI** - AI Agent 使用 `claude-agent-sdk` 与 Claude 交互
   - SDK 已自动包含在插件依赖中(无需手动安装)
   - SDK 内部会自动管理 Claude Code CLI 进程

2. **Anthropic API 密钥** - Claude Code 需要有效的 API 访问权限
   - 确保已完成 `claude` 命令的初始设置
   - 或设置 `ANTHROPIC_API_KEY` 环境变量

3. **飞书机器人配置** - 需要配置 `~/.lark_cli/config.yaml`
   - 参见下方「配置」章节

**验证方法**:
```bash
# 检查 Claude Code 是否可用
claude --version

# 检查飞书配置是否正确
lark-cli config show
```

## 功能

- **AI Agent 自动回复**(使用 Claude 自动回复飞书消息)
- 发送飞书消息(文本、富文本、卡片等)
- @ 人功能(支持 @某人 和 @所有人)
- 发送到群聊(支持通过群名称发送)
- 群聊管理(同步群列表、按名称查找)
- 回复消息
- 表情回复(给消息点赞、添加表情)
- 卡片消息模板(通知、告警、成功、任务、报告)
- 监听飞书事件(WebSocket)
- 管理多租户配置

## 安装

首先添加 marketplace:

```bash
claude plugin marketplace add https://github.com/vincentor/claude-code-plugins
```

然后安装插件:

```bash
claude plugin install lark-cli
```

> **注意**:如果遇到 marketplace 路径问题,也可以尝试:
> ```bash
> claude plugin marketplace add github:vincentor/claude-code-plugins
> ```

## 使用

安装后,可以通过以下方式使用:
- 对 Claude 说 "启动飞书 AI Agent"
- 对 Claude 说 "让机器人自动回复消息"
- 对 Claude 说 "发消息给xxx"
- 对 Claude 说 "@ 某人发消息"
- 对 Claude 说 "发送卡片消息"
- 对 Claude 说 "发消息到某某群"
- 对 Claude 说 "查看群列表"
- 对 Claude 说 "给消息点赞"
- 对 Claude 说 "监听飞书事件"
- 对 Claude 说 "查看飞书配置"
- 使用 `/lark` 命令直接调用

### AI Agent 自动回复

AI Agent 采用**双层 LLM 架构**,实现快速响应:

1. **快速 LLM**(如豆包 Flash):意图路由和简单闲聊(~1-2s)
2. **Claude Code**:复杂任务执行(~10-30s)

```bash
# 启动 AI Agent(自动回复 @ 机器人的消息)
lark-cli agent

# 监听所有消息
lark-cli agent --filter all

# 仅监听私聊
lark-cli agent --filter p2p

# 禁用快速 LLM(仅使用 Claude Code)
lark-cli agent --no-fast-llm

# 启用群聊自主回复(根据话题相关性自动回复)
lark-cli agent --group-auto-reply

# 自定义 persona
lark-cli agent --persona "你是一个专业的技术助手"
```

**Agent 性能指标**:

| 场景 | 响应时间 | 说明 |
|------|---------|------|
| 简单闲聊 | ~1-2s | 由快速 LLM 直接回复 |
| 复杂任务 | ~10-30s | 由 Claude Code 执行 |

**快速 LLM 配置**:

需要在配置文件中添加 `fast_llm` 配置,并设置相应的 API Key 环境变量。参见下方「AI Agent 专用配置」章节。

### 常用命令示例

```bash
# 发送文本消息
lark-cli message send "消息内容"

# 发送到群聊(通过群名称,需要先 sync)
lark-cli chat sync                              # 同步群列表
lark-cli message send --chat "群名称" "消息内容"

# 发送到群聊(通过 chat_id)
lark-cli message send -r "oc_xxx" --receiver-type chat_id "消息内容"

# 发送消息并 @ 某人
lark-cli message send --at ou_xxx "请审核"

# 群聊中 @所有人
lark-cli message send --chat "群名称" --at-all "全体通知"

# 发送富文本消息
lark-cli message post --title "通知" "富文本内容"

# 发送卡片消息
lark-cli card template notify --title "通知" --content "内容" -o send

# 卡片消息 @ 某人
lark-cli card template alert --title "告警" --content "请处理" --at ou_xxx -o send

# 群聊管理
lark-cli chat sync     # 同步群列表到本地
lark-cli chat list     # 列出缓存的群聊
lark-cli chat find "关键词"  # 按名称搜索群聊

# 获取最近消息(用于获取 message_id)
lark-cli message list --chat "群名称" --limit 10  # 按群名称
lark-cli message list --chat oc_xxx --limit 5     # 按 chat_id
lark-cli message list --user ou_xxx --limit 5     # 私聊消息(需要先 listen)
lark-cli message list --user [email protected] --limit 5  # 私聊消息(通过邮箱)

# 私聊管理(需要先 listen 获取缓存)
lark-cli chat private       # 查看已缓存的私聊映射
lark-cli chat private-id ou_xxx  # 获取用户的私聊 chat_id
lark-cli chat private-id [email protected]  # 通过邮箱获取

# 表情回复
lark-cli message react om_xxx THUMBSUP   # 给消息点赞
lark-cli message reactions om_xxx        # 查看消息的表情回复
lark-cli message emoji-list              # 查看支持的表情类型

# 监听事件
lark-cli listen
```

## 配置

安装插件后,需要配置飞书机器人租户信息。配置文件位于 `~/.lark_cli/config.yaml`。

### 添加租户

```bash
# 使用命令添加租户
lark-cli config add-tenant my_bot \
  --app-id "cli_xxx" \
  --app-secret "your_app_secret" \
  --receiver-id "ou_xxx" \
  --description "我的飞书机器人"

# 设置为默认租户
lark-cli config set-default my_bot
```

或者手动创建配置文件 (`~/.lark_cli/config.yaml`):

```yaml
cli:
  default_tenant: my_bot
  log_level: INFO

tenants:
  my_bot:
    name: my_bot
    app_id: "cli_xxx"
    app_secret: "your_app_secret"
    default_receiver_id: "ou_xxx"
    default_receiver_type: "open_id"
    description: "我的飞书机器人"
```

### 获取配置信息

1. 登录[飞书开放平台](https://open.feishu.cn/)
2. 创建或选择一个应用
3. 获取 App ID 和 App Secret
4. 在「权限管理」中开启相关权限:
   - `im:message` - 发送消息
   - `im:message.group_at_msg` - 群聊 @所有人
   - `im:message:send_as_bot` - 以机器人身份发送消息
   - `im:chat:readonly` - 获取群组信息(群列表功能)
   - `im:message.reactions:write` - 添加/删除表情回复
   - `contact:user.email:readonly` - 通过邮箱查询用户(可选)
5. 获取接收者 ID(用户 Open ID 或群聊 ID)

### AI Agent 专用配置

为 AI Agent 配置机器人个性和双层 LLM:

```yaml
tenants:
  my_bot:
    name: my_bot
    app_id: "cli_xxx"
    app_secret: "your_app_secret"
    default_receiver_id: "ou_xxx"
    description: "我的 AI 助手"

    # AI Agent 基础配置
    bot_name: "Kira"
    bot_identity: "你是 Kira,一个友好、专业的 AI 助手"
    bot_capabilities: "回答问题、编程辅助、文档编写、代码审查"
    persona: |
      - 用友好的语气回复
      - 回复要简洁但完整
      - 适当使用 emoji
    model: sonnet  # Claude 模型: haiku, sonnet, opus

    # 群聊自主回复(可选)
    group_auto_reply: false
```

### 快速 LLM 配置(可选但推荐)

快速 LLM 用于双层架构,可以显著提升简单对话的响应速度(~10s → ~1-2s)。

**不配置快速 LLM**:所有消息都由 Claude Code 处理(约 10 秒响应)

**配置快速 LLM 后**:
- 简单闲聊由快速 LLM 直接回复(约 1-2 秒)
- 复杂任务仍由 Claude Code 处理(约 10-30 秒)

#### 方式一:使用豆包(火山引擎 Ark)

1. 访问 [火山引擎控制台](https://console.volcengine.com/ark) 创建推理接入点
2. 设置环境变量:`export ARK_API_KEY=your_api_key`
3. 配置:

```yaml
    fast_llm:
      enabled: true
      provider: "ark"
      base_url: "https://ark.cn-beijing.volces.com/api/v3"
      model: "ep-your-endpoint-id"  # 推理接入点 ID
      api_key_env: "ARK_API_KEY"
```

#### 方式二:使用 OpenAI

```bash
export OPENAI_API_KEY=your_api_key
```

```yaml
    fast_llm:
      enabled: true
      provider: "openai"
      base_url: "https://api.openai.com/v1"
      model: "gpt-4o-mini"
      api_key_env: "OPENAI_API_KEY"
```

#### 方式三:使用 DeepSeek

```bash
export DEEPSEEK_API_KEY=your_api_key
```

```yaml
    fast_llm:
      enabled: true
      provider: "deepseek"
      base_url: "https://api.deepseek.com/v1"
      model: "deepseek-chat"
      api_key_env: "DEEPSEEK_API_KEY"
```

> **提示**:快速 LLM 是可选的。如果不配置,Agent 仍然可以正常工作,只是响应速度会稍慢。

## 群通知(group-notify)

`message group-notify` 命令用于让 Claude Code 在任务完成或需要用户输入时,自动发送结构化通知到飞书群聊并 @ 指定用户。

### 配置

在 `~/.lark_cli/config.yaml` 的租户配置中添加 `notification` 段:

```yaml
tenants:
  my_bot:
    name: my_bot
    app_id: "cli_xxx"
    app_secret: "your_app_secret"
    # ... 其他配置 ...

    notification:
      chat: "群聊名称"    # 目标群聊名称(需先 lark-cli chat sync)
      at: "张三"          # @ 的群成员姓名
```

### 手动使用

```bash
# 发送群通知(群聊和 @ 从 config.yaml 读取)
lark-cli message group-notify --title "标题" "正文内容"
```

### 配合 Claude Code Stop Hook 自动触发

通过 Claude Code 的 [Stop Hook](https://docs.anthropic.com/en/docs/claude-code/hooks) 机制,可以**强制** Claude 在每次停下来前发送通知,避免遗漏。

#### 1. 创建 Hook 脚本

将以下脚本保存到 `~/.claude/hooks/require-notification.sh`:

```bash
#!/bin/bash
# Stop hook: 强制 Claude 在停下来前发送飞书通知
# 检查 transcript 中是否已调用过 group-notify,没有则阻止停止

INPUT=$(cat)

# 防止死循环:如果已经因为 hook block 继续过一次,直接放行
STOP_HOOK_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false')
if [ "$STOP_HOOK_ACTIVE" = "true" ]; then
  exit 0
fi

# 从 transcript 检查是否已经发过通知
TRANSCRIPT=$(echo "$INPUT" | jq -r '.transcript_path // empty')
if [ -n "$TRANSCRIPT" ] && [ -f "$TRANSCRIPT" ]; then
  if grep -qE 'lark-notify-group|group-notify' "$TRANSCRIPT" 2>/dev/null; then
    exit 0
  fi
fi

# 没发通知,阻止停止并提醒
jq -n '{
  "decision": "block",
  "reason": "停下来前必须调用 /lark-cli:lark-notify-group 发送群通知。它会自动读取配置并发到群聊。用法:/lark-cli:lark-notify-group 总结做了什么、为什么停下来"
}'
```

```bash
chmod +x ~/.claude/hooks/require-notification.sh
```

#### 2. 注册到 Claude Code settings

在 `~/.claude/settings.json` 的 `hooks.Stop` 数组中添加:

```json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "/Users/你的用户名/.claude/hooks/require-notification.sh",
            "timeout": 10
          }
        ]
      }
    ]
  }
}
```

#### 3. 工作原理

```
Claude 完成任务想停下来
        │
        ▼
  Stop Hook 触发
        │
        ▼
  检查 transcript 中是否调用过 group-notify
        │
   ┌────┴────┐
   │ 已调用   │ 未调用
   │         │
   ▼         ▼
 放行     阻止停止,返回提醒
          Claude 自动调用
          /lark-cli:lark-notify-group
          然后再次尝试停止 → 放行
```

**防死循环机制**:如果 Claude 因 hook block 继续执行后再次触发 Stop,`stop_hook_active` 标志会被设为 `true`,hook 直接放行。

## 安全说明

- 配置文件 (`~/.lark_cli/config.yaml`) 包含敏感的 App Secret,请妥善保管
- 建议设置文件权限为 600:`chmod 600 ~/.lark_cli/config.yaml`
- 插件源码不包含任何私钥信息