Skill: lixiang92229/feishu-bot-task (version 1.0.2)

--- name: feishu-bot-task version: 1.0.0 description: "飞书任务（Bot身份）：使用Bot/应用身份管理飞书任务，创建任务、查询任务列表、更新状态、分配成员等。本Skill专门使用v1 API，Bot身份可直接调用，解决了lark-task官方Skill使用v2接口无法支持Bot身份的问题。当需要以Bot身份（应用身份）操作任务时使用本Skill。" metadata: requires: bins: ["python3"] env: ["FEISHU_APP_ID", "FEISHU_APP_SECRET"] openclaw: homepage: "https://github.com/lixiang92229/feishu-bot-task" --- # feishu-task (Bot身份) **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)，其中包含认证、身份选择和权限处理规则。** > **与 lark-task 的区别**：lark-task 使用 v2 接口，只支持用户身份。feishu-task 使用 v1 接口，支持 Bot 身份。 > **适用场景**：Agent 以 Bot/应用身份（如项目经理Agent）派发和管理任务时使用。 ## 背景 飞书官方 lark-cli 的 `task tasks list` 命令使用 v2 接口，该接口不支持 Bot 身份调用（会报错 `Invalid access token`）。 本 Skill 直接调用飞书 v1 API (`GET /task/v1/tasks`)，Bot 身份可以正常使用，可查询 Bot 自己作为负责人的任务列表。 ## Shortcuts - [`+bot-get-my-tasks`](./references/lark-task-bot-get-my-tasks.md) — Bot查询自己负责的任务列表（使用v1 API） ## API Resources 所有操作通过 Python 脚本调用 v1 API，不依赖 lark-cli： | 操作 | 脚本 | |------|------| | 查询Bot任务列表 | `scripts/lark-task-bot-list.py` | ## 权限说明 - Bot 身份只需在飞书开放平台开通对应权限（`task:task:read` / `task:task:write`） - 无需用户授权（`auth login`） - 凭证从环境变量 `FEISHU_APP_ID` / `FEISHU_APP_SECRET` 读取 ## 注意事项 - 所有脚本均读取 OpenClaw 飞书插件注入的环境变量，无需手动配置 - v1 API 与 v2 API 返回的数据格式略有差异，解析时注意字段名称（如 v1 用 `creator_id`，v2 用 `creator.id`）

path: README.md
content: # feishu-bot-task

[English](#english) | [中文](#中文)

---

## English

### Overview

`feishu-bot-task` is an OpenClaw Skill that enables Bot/Application identity operations on Feishu (Lark) Tasks.

This Skill solves a critical limitation: Feishu's official `lark-task` Skill uses the v2 API (`GET /task/v2/tasks`), which **does not support Bot identity** and will fail with `Invalid access token`. This Skill uses the v1 API (`GET /task/v1/tasks`) which **fully supports Bot identity**.

### Why This Exists

| Approach | API Version | Bot Identity | User Identity |
|----------|-------------|-------------|---------------|
| Official `lark-task` | v2 | ❌ Not supported | ✅ Supported |
| `feishu-bot-task` | v1 | ✅ Fully supported | ❌ Not needed |

### Features

- **List Bot Tasks**: Query all tasks where the Bot is the assignee
- **Bot-native**: No user login required — uses `tenant_access_token` directly
- **Pagination**: Automatically handles paginated results
- **v1 API compatible**: Works around v2 API limitations

### Requirements

- Python 3
- Environment variables:
  - `FEISHU_APP_ID` — Feishu application ID
  - `FEISHU_APP_SECRET` — Feishu application secret

These are automatically injected by the OpenClaw Feishu plugin.

### Usage

```bash
python3 skills/feishu-bot-task/scripts/lark-task-bot-list.py
```

Output (JSON):
```json
{
  "code": 0,
  "data": {
    "items": [
      {
        "id": "task_guid",
        "summary": "Task Title",
        "due": {"time": "1234567890", "is_all_day": true},
        "members": [...],
        "create_time": "...",
        "complete_time": "..."
      }
    ],
    "total": 10
  }
}
```

### File Structure

```
feishu-bot-task/
├── SKILL.md                                    # OpenClaw Skill definition
├── README.md                                   # This file
├── _meta.json                                  # ClawHub metadata
├── references/
│   └── lark-task-bot-get-my-tasks.md          # Command reference
└── scripts/
    └── lark-task-bot-list.py                  # Main script
```

### Installation

```bash
# From ClawHub
npx clawhub install feishu-bot-task

# Or from GitHub
npx skills add https://github.com/lixiang92229/feishu-bot-task -y -g
```

### Permissions

In Feishu Open Platform, grant these scopes to your application:

- `task:task:read` — Read task information
- `task:task:write` — Create/update tasks

No user login (`auth login`) is required.

---

## 中文

### 概述

`feishu-bot-task` 是一个 OpenClaw Skill，支持以 Bot/应用身份操作飞书任务。

### 为什么需要这个 Skill

飞书官方的 `lark-task` 使用 v2 API（`GET /task/v2/tasks`），该接口**不支持 Bot 身份**，会报错 `Invalid access token`。本 Skill 使用 v1 API（`GET /task/v1/tasks`），**完全支持 Bot 身份**。

### 功能

- **查询 Bot 负责的任务**：列出 Bot 作为负责人的所有任务
- **Bot 原生**：无需用户登录，直接使用 `tenant_access_token`
- **自动分页**：自动处理分页，获取完整结果

### 环境要求

- Python 3
- 环境变量（OpenClaw 飞书插件自动注入）：
  - `FEISHU_APP_ID` — 飞书应用 ID
  - `FEISHU_APP_SECRET` — 飞书应用密钥

### 使用方法

```bash
python3 skills/feishu-bot-task/scripts/lark-task-bot-list.py
```

### 权限配置

在飞书开放平台，为应用开通以下权限：

- `task:task:read` — 查看任务信息
- `task:task:write` — 创建和更新任务

无需进行用户授权（`auth login`）。

### 安装

```bash
# 从 ClawHub 安装
npx clawhub install feishu-bot-task

# 或从 GitHub 安装
npx skills add https://github.com/lixiang92229/feishu-bot-task -y -g
```

### 文件结构

```
feishu-bot-task/
├── SKILL.md                                    # OpenClaw Skill 定义
├── README.md                                   # 双语文档
├── _meta.json                                  # ClawHub 元数据
├── references/
│   └── lark-task-bot-get-my-tasks.md          # 命令参考文档
└── scripts/
    └── lark-task-bot-list.py                  # 主脚本
```

### 适用场景

- Agent 作为"包工头"角色，向其他 Agent 分发任务
- 主 Agent 查询各子 Agent 的任务进度
- 定时巡检 Bot 自己负责的任务完成状态


path: _meta.json
content: primaryEnv: FEISHU_APP_ID

path: references/lark-task-bot-get-my-tasks.md
content: # task +bot-get-my-tasks

> **功能**：Bot 身份查询自己作为负责人的任务列表。
> **背景**：标准的 `+get-my-tasks` 使用 v2 接口，只支持用户身份。Bot 身份调用会失败。本命令使用 v1 接口，Bot 身份可以正常使用。

> **前置条件**：请先阅读 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)，了解认证、身份选择和权限处理规则。

## 背景说明

飞书任务的 `GET /task/v2/tasks` 接口（v2）在设计上映射为"用户的任务列表"，因此不支持 Bot 身份调用。而 `GET /task/v1/tasks` 接口（v1）没有这个限制，Bot 身份可以直接查询。

本命令通过直接调用 v1 接口，解决 Bot 身份无法获取任务列表的问题。

## 推荐命令

```bash
# 查询 Bot 负责的所有任务（自动分页，最多20页）
python3 skills/lark-task/scripts/lark-task-bot-list.py
```

## 使用流程

1. 直接执行 Python 脚本
2. 解析 JSON 返回结果
3. 展示任务标题、GUID、截止时间、负责人等关键信息

## 输出格式

脚本返回 JSON 格式：
```json
{
  "code": 0,
  "data": {
    "items": [
      {
        "id": "任务GUID",
        "summary": "任务标题",
        "due": {"time": "1234567890", "is_all_day": true},
        "members": [{"id": "open_id", "role": "assignee", "type": "user/app"}],
        "followers": [{"id": "open_id"}],
        "create_time": "创建时间戳",
        "complete_time": "完成时间戳（0表示未完成）"
      }
    ],
    "total": 10
  }
}
```

## 适用场景

- Bot 作为包工头，需要查询自己派发了哪些任务
- Agent 团队中，主 Agent 查询各个子 Agent 的任务进度
- 定时巡检任务完成状态

## 注意事项

- 本命令使用 v1 接口，响应格式与 v2 不同
- Bot 身份（tenant_access_token）由脚本自动处理，无需额外配置
- 凭证从环境变量 `FEISHU_APP_ID` / `FEISHU_APP_SECRET` 读取，默认使用当前飞书机器人的应用凭证


path: scripts/lark-task-bot-list.py
content: #!/usr/bin/env python3
"""
lark-task-bot-list.py
Bot身份查询自己负责的任务列表（使用v1 API）
直接调用飞书v1任务接口，绕过lark-cli封装的v2接口对bot的身份限制
"""

import sys
import json
import urllib.request
import urllib.parse
import os

# 从环境变量读取飞书应用凭证（OpenClaw飞书插件会自动注入）
APP_ID = os.environ.get("FEISHU_APP_ID", "")
APP_SECRET = os.environ.get("FEISHU_APP_SECRET", "")

if not APP_ID or not APP_SECRET:
    print(json.dumps({"code": 1, "msg": "Missing FEISHU_APP_ID or FEISHU_APP_SECRET in environment"}, ensure_ascii=False))
    sys.exit(1)

def get_tenant_token():
    """获取tenant_access_token"""
    url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
    data = json.dumps({"app_id": APP_ID, "app_secret": APP_SECRET}).encode()
    req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
    with urllib.request.urlopen(req) as resp:
        result = json.load(resp)
    return result.get("tenant_access_token", "")

def list_bot_tasks(token, page_size=20, page_token=""):
    """调用v1接口获取bot自己作为负责人的任务"""
    base_url = "https://open.feishu.cn/open-apis/task/v1/tasks"
    params = {"page_size": page_size}
    if page_token:
        params["page_token"] = page_token
    
    url = f"{base_url}?{urllib.parse.urlencode(params)}"
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {token}"})
    with urllib.request.urlopen(req) as resp:
        return json.load(resp)

def main():
    # 获取token
    [REDACTED_SECRET])
    if not [REDACTED_SECRET]"code": 1, "msg": "Failed to get tenant_access_token"}, ensure_ascii=False))
        sys.exit(1)
    
    all_tasks = []
    page_token = ""
    
    # 分页获取所有任务
    while True:
        result = list_bot_tasks(token, page_size=20, page_token=page_token)
        if result.get("code") != 0:
            print(json.dumps(result, ensure_ascii=False))
            sys.exit(1)
        
        data = result.get("data", {})
        items = data.get("items", [])
        all_tasks.extend(items)
        
        has_more = data.get("has_more", False)
        if not has_more:
            break
        page_token = data.get("page_token", "")
        if not page_token:
            break
    
    # 输出完整结果
    print(json.dumps({
        "code": 0,
        "data": {
            "items": all_tasks,
            "total": len(all_tasks)
        }
    }, ensure_ascii=False))

if __name__ == "__main__":
    main()


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