Skill: hanjin714/coze-workflow-runner (version 1.0.0)

--- name: coze-workflow-runner description: 调用 Coze 工作流执行自动化任务，支持生成图片、处理数据等操作 --- # Coze 工作流运行器 ## 概述 通过 Coze API 调用工作流，执行自动化任务。目前支持生成宠物知识卡片等图像生成工作流。 ## 快速开始 ### 1. 配置令牌 服务令牌存储在：`~/workspace-prod/coze/coze-tokens.md` 首次使用时确认令牌有效。 ### 2. 查看可用工作流 工作流列表存储在：`~/workspace-prod/coze/workflows.md` 包含每个工作流的 ID、链接和用途说明。 ### 3. 调用工作流 使用 `cozepy` 库调用： ```python import cozepy # 认证 auth = cozepy.TokenAuth([REDACTED_SECRET]') coze = cozepy.Coze(auth=auth, base_url='https://api.coze.cn') # 调用工作流 response = coze.workflows.runs.create( workflow_id='工作流ID', parameters={'input': '输入参数'} ) ``` ## 现有工作流 ### 短视频文案拆解（13层逻辑） - **工作流 ID**: 7610429408704413759 - **用途**: 通过13层逻辑拆解短视频文案，输入抖音口令链接即可提取并分析底层逻辑 - **输入**: 抖音口令链接（如 7:/ xxx） - **返回**: 短视频文案内容 + 13层逻辑拆解结果 **调用示例**: ```python import cozepy auth = cozepy.TokenAuth([REDACTED_SECRET]') coze = cozepy.Coze(auth=auth, base_url='https://api.coze.cn') response = coze.workflows.runs.create( workflow_id='7610429408704413759', parameters={'input': '7:/ xxx:】'} ) ``` ### 生成宠物知识卡片 - **工作流 ID**: 7610527662062665754 - **用途**: 生成宠物知识卡片图片（5张） - **输入**: 宠物名称和描述文本 - **返回**: 5个图片 URL（短链接形式） **调用示例**: ```python import cozepy auth = cozepy.TokenAuth([REDACTED_SECRET]') coze = cozepy.Coze(auth=auth, base_url='https://api.coze.cn') response = coze.workflows.runs.create( workflow_id='7610527662062665754', parameters={'input': '布偶猫宠物知识卡片：布偶猫又称布拉多尔猫，是体型和体重最大的猫品种之一。'} ) # 返回: {"output": ["https://s.coze.cn/t/xxx/", ...]} ``` ### 处理返回的短链接 工作流返回的是短链接，需要跟随跳转才能获取真实图片 URL： ```python import subprocess urls = response['data']['output'] for i, url in enumerate(urls, 1): # curl -L 自动跟随跳转，直接下载图片 subprocess.run(['curl', '-sL', url, '-o', f'pet_card_{i}.png']) ``` ## 资源 ### 配置目录 - `~/workspace-prod/coze/coze-tokens.md` - 服务令牌 - `~/workspace-prod/coze/workflows.md` - 工作流列表 --- *最后更新：2026-03-24*

path: scripts/run_workflow.py
content: #!/usr/bin/env python3
"""
Coze 工作流调用脚本 (使用 cozepy 库)

用法:
    python3 run_workflow.py <workflow_id> [input_text]

示例:
    python3 run_workflow.py 7610360135081295918 "姓名: 张三, 邮箱: [REDACTED_SECRET]"
"""

import sys
import json
from cozepy import COZE_CN_BASE_URL, Coze, TokenAuth

# 从 tokens.md 读取令牌
def get_auth_token():
    token_file = "/Users/hanjin/.openclaw/workspace-prod/coze/coze-tokens.md"
    try:
        with open(token_file, 'r') as f:
            content = f.read()
            for line in content.split('\n'):
                if 'Bearer' in line and 'sat_' in line:
                    return line.replace('Bearer ', '').strip()
    except Exception as e:
        print(f"Error reading token file: {e}", file=sys.stderr)
        return None
    return None

def run_workflow(workflow_id, input_text=None):
    """调用 Coze 工作流"""
    
    auth_token = get_auth_token()
    if not auth_token:
        print("Error: Could not read auth token", file=sys.stderr)
        return None
    
    try:
        coze = Coze(auth=TokenAuth([REDACTED_SECRET]), base_url=COZE_CN_BASE_URL)
        
        # 构建参数
        parameters = {"input": input_text} if input_text else {}
        
        # 调用工作流
        run_result = coze.workflows.runs.create(
            workflow_id=workflow_id,
            parameters=parameters
        )
        
        return run_result
        
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        return {"error": str(e)}

def extract_markdown_content(result):
    """从结果中提取 Markdown 内容"""
    if not result:
        return "无返回结果"
    
    # 如果是字典
    if isinstance(result, dict):
        data_str = result.get('data', '')
    else:
        data_str = getattr(result, 'data', '')
    
    # 解析 data_str 中的 JSON
    try:
        data_json = json.loads(data_str)
        markdown_content = data_json.get('data', '').strip()
        return markdown_content if markdown_content else str(result)
    except (json.JSONDecodeError, TypeError):
        return str(data_str) if data_str else str(result)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(__doc__)
        sys.exit(1)
    
    workflow_id = sys.argv[1]
    input_text = sys.argv[2] if len(sys.argv) > 2 else "测试"
    
    print(f"调用工作流 {workflow_id} ...")
    result = run_workflow(workflow_id, input_text)
    
    if result:
        # 尝试提取 Markdown 内容
        content = extract_markdown_content(result)
        print(content)
    else:
        print("调用失败", file=sys.stderr)
        sys.exit(1)

path: references/workflows.md
content: # Coze 工作流列表参考

## 工作流汇总

| 序号 | 工作流ID | 用途说明 | 链接 |
|:---:|:---|:---|:---|
| 1 | 7610360135081295918 | 邮件触发工作流 - 接收用户邮箱，触发特定业务逻辑 | [查看](https://www.coze.cn/space/7555350866765545515/project-ide/7610360135081295918) |

---

## 详情说明

### 1. 邮件触发工作流 (7610360135081295918)

- **用途**：接收用户提交的邮箱地址，触发后续业务处理
- **输入参数**：需要传入 `input` 参数，格式为字符串（如 "姓名等信息，联系邮箱: [REDACTED_SECRET]"）
- **调用方式**：POST 请求到 `/api/proxy/coze`，传递 `workflow_id` 和 `parameters`

---

## 调用示例

### 后端代理（Node.js）

```javascript
const COZE_API_URL = 'https://api.coze.cn/v1/workflow/run';
const COZE_AUTH_TOKEN = 'Bearer 你的服务令牌';

app.post('/api/proxy/coze', async (req, res) => {
  const { workflow_id, parameters } = req.body;
  const response = await fetch(COZE_API_URL, {
    method: 'POST',
    headers: {
      'Authorization': COZE_AUTH_TOKEN,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ workflow_id, parameters: parameters || {} })
  });
  const data = await response.json();
  res.status(response.status).json(data);
});
```

### Python 脚本调用

```bash
python3 run_workflow.py 7610360135081295918 "姓名: 张三, 邮箱: [REDACTED_SECRET]"
```

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