P01 · 竞品日报推送飞书(工作流)
本系列最重要的一课:在应用「竞品日报实战」里编排工作流 daily_competitor_report,
用 LLM 生成四所交易所竞品日报 → Python Code 安全编码 JSON → HTTP 推送到飞书(或 httpbin 演示)。
前置:已完成 P07 应用 IDE(应用和工作流空壳已建好)。
daily_competitor_report 编成 开始 → LLM → Code(json.dumps) → HTTP(RAW_TEXT) → 结束,试运行成功(演示可用 httpbin),并理解飞书 400/19001 为何必须用 Code 转义。总流程与最终节点链
节点链(必须按此顺序连线): 开始 → 生成竞品日报(大模型)→ 编码飞书消息(代码 Python)→ 推送飞书(HTTP)→ 结束
| 本课产物 | 固定命名(照抄) |
|---|---|
| 应用 | 竞品日报实战 |
| 工作流英文名 | daily_competitor_report(仅字母数字下划线) |
| 开始节点输出 | report_date、lark_hint、webhook_url |
前置条件
| 项 | 要求 | 怎么检查 |
|---|---|---|
| 服务 | http://localhost:8888 可访问 | 浏览器能打开登录页 |
| 启动 | coze-studio 根目录 make web 或 make debug | Docker 容器健康 |
| 模型 | 管理后台至少启用 1 个大模型 | /admin/#model-management 有绿色已启用 |
| 应用 | 已创建 竞品日报实战 | P07 或本课第 2 步补做 |
| 工作流 | 应用内已有 daily_competitor_report | 左侧树能看到,画布有开始→结束 |
登录并进入项目开发
- 打开
http://localhost:8888/sign - 输入邮箱密码 → 点 登录
- 左侧 工作空间 → Personal Space → 项目开发
- 地址变为 /space/<space_id>/develop
图 1:登录页 — 用自建账号登录本地 Coze。
数字 1→2→3 = 操作顺序 · 请按编号依次点击 / 填写
图 2:项目开发列表 — 应能看到「竞品日报实战」应用卡片。
数字 1→2→3 = 操作顺序 · 请按编号依次点击 / 填写
打开应用「竞品日报实战」
2.1 补建应用(仅当列表里没有时)
- 项目开发页右上角 + 创建
- 选右侧 创建应用(不是智能体)
- 名称:
竞品日报实战 - 介绍:
每日生成四所交易所竞品日报并推送飞书(教程演示) - 点 创建 → 自动进入应用 IDE
2.2 从项目开发进入应用 IDE
- 在项目开发列表,单击「竞品日报实战」卡片
- 进入应用 IDE,URL 含
project-ide
图 3:从项目开发页点进应用 IDE 的路径示意。
数字 1→2→3 = 操作顺序 · 请按编号依次点击 / 填写
打开工作流 · 学会「添加节点」
3.1 补建工作流(仅当左侧树里没有时)
- 应用 IDE 左侧 工作流 旁点 +
- 名称(英文):
daily_competitor_report - 描述(中文):
每日竞品日报生成并推送飞书 - 确认 → 进入画布
每日竞品日报 会红字报错。✅ 只用 daily_competitor_report。3.2 打开已有工作流
- 左侧树 工作流 → daily_competitor_report,单击
- 中间出现画布,默认 开始 连 结束
- 若弹出「画布交互模式」说明,点 知道了 关掉
图 4:完整五节点画布总览(做完后应长这样)。先对照认节点名,再回到空壳画布按下面步骤逐个加。
数字 1→2→3 = 操作顺序 · 请按编号依次点击 / 填写
3.3 添加节点面板(后面三步共用)
- 看画布底部工具栏,点蓝色 + 添加节点(也可在空白处右键)
- 弹出节点库:搜索框可输入「大模型」「代码」「HTTP」
- 本课只要三类:大模型、代码、HTTP 请求
图 5:添加节点面板示意 — ① 底部「+ 添加节点」→ ② 大模型 → ③ 代码 → ④ HTTP 请求。
此图为界面配置示意,方便对照字段位置;实操以你本地开源版文案为准。
配置「开始」节点 — 三个输入参数
{{变量名}} 传给下游 LLM。4.1 逐步操作
- 画布上单击「开始」节点(左侧第一个)
- 右侧出现配置面板,找到 输入 / 输出变量(有的版本叫「输入参数」)
- 点 + 添加,按表新增 3 行,类型一律选
String / 字符串 - 每行填完后回车或失焦确认;不要用中文做变量名
| 变量名(英文,严格一致) | 必填 | 说明 | 试运行示例值 |
|---|---|---|---|
report_date | 是 | 日报日期,注意是 date 不是 data | 2026-07-16 |
lark_hint | 是 | 飞书群备注,会出现在消息前缀 | 增长情报群 |
webhook_url | 否 | Webhook 地址(也可写死在 HTTP 节点 URL) | https://httpbin.org/post |
图 6:开始节点配置示意 — ① 点开始节点 → ② +添加 → ③ 三个字符串变量齐备。
{{report_date}},若写成 report_data 会取不到值。report_date / lark_hint / webhook_url 三个输出。添加「大模型」节点 — 生成竞品日报
5.1 放入画布并连线
- 底部 + 添加节点 → 选 大模型 / LLM
- 新节点出现后,拖到「开始」右侧、「结束」左侧
- 连线:从「开始」右侧小圆点拖到 LLM 左侧;LLM 右侧先暂时连到「结束」(后面再改接到 Code)
- 双击或单击节点标题,改名为
生成竞品日报
5.2 右侧面板逐项配置
| 配置项 | 填什么 | 注意 |
|---|---|---|
| 节点名称 | 生成竞品日报 | 后面 Code 引用时靠这个名字 |
| 模型 | 管理后台已启用的模型(实录常用 claude-v1) | Tokens=0 多半是模型未启用 |
| 系统提示词 | 可选:你是加密货币交易所竞品分析师 | 可留空 |
| 用户提示词 | 下方整段原样粘贴 | 必须含 {{report_date}} {{lark_hint}} |
| 输出变量 | 默认 output | Code 节点会引用 生成竞品日报.output |
| 技能 / Skills | 保持「未配置」 | 本课不需要挂插件 |
请生成今日竞品日报。报告日期:{{report_date}}。飞书群备注:{{lark_hint}}。
覆盖交易所:Binance、Bybit、Bitget、Gate.io。
输出结构(Markdown):
1. 一句话摘要
2. 四所交易所各一段:活动 / 上新 / 费率 / 推广动态
3. 对 BitMart 的启示(2~3 条)
若无实时检索能力,请基于公开行业认知生成,并在文末标注「部分内容为模型推断」。
图 7:大模型节点配置示意 — ① 模型下拉 → ② 用户提示词(含双花括号变量)→ ③ 输出 output。
{{...}}、输出为 output。添加「代码」节点(Python)— 编码飞书 JSON
飞书自定义机器人要求 POST Body 是合法 JSON:
{"msg_type":"text","content":{"text":"..."}}。日报含换行、双引号。若在 HTTP 用 JSON 模板直接塞 LLM 长文本,不会自动转义,飞书返回
400 / errcode 19001。正确做法:Python
json.dumps() → HTTP 用 RAW_TEXT 原样发送。6.1 放入画布
- + 添加节点 → 代码 → 语言选 Python 3(开源版仅 Python)
- 节点名称改为
编码飞书消息 - 描述可写:
把日报安全编码成飞书 webhook JSON - 重新连线:开始 → 生成竞品日报 → 编码飞书消息 →(暂)结束
6.2 输入 / 输出映射(最容易配错)
| 方向 | 本节点变量名 | 引用上游 | 类型 |
|---|---|---|---|
| 输入 | report | 生成竞品日报.output | String |
| 输入 | hint | 开始.lark_hint | String |
| 输出 | payload | (本节点产出) | String |
6.3 代码全文(覆盖默认模板)
import json
async def main(args: Args) -> Output:
params = args.params
report = params.get('report') or ''
hint = params.get('hint') or ''
# 飞书文本前缀:含「竞品日报」可过关键词安全设置
text = '【竞品日报】' + str(hint) + '\n\n' + str(report)
# 飞书单条文本建议不超过约 4000 字,保守截断
if len(text) > 3500:
text = text[:3500] + '\n...(内容过长已截断)'
payload = json.dumps({
'msg_type': 'text',
'content': {'text': text}
}, ensure_ascii=False)
ret: Output = {'payload': payload}
return ret
图 8:代码节点配置示意 — ① 输入映射 report/hint → ② 输出 payload → ③ Python 编辑区。
| 代码做了什么 | 对应飞书要求 |
|---|---|
json.dumps(..., ensure_ascii=False) | 中文保留,且自动转义引号换行 |
前缀 【竞品日报】 | 机器人若开「自定义关键词」必须含该词 |
| 截断 3500 字 | 避免超长被飞书拒绝 |
输出 payload | 给 HTTP 节点当 RAW_TEXT 整体发送 |
payload、代码含 json.dumps 与 【竞品日报】。添加「HTTP」节点 — POST 推送
payload 原样 POST 出去。演示用 httpbin;上线换飞书 Webhook。7.1 放入画布并连线
- + 添加节点 → HTTP 请求
- 节点名称:
推送飞书 - 描述可写:
推送竞品日报到飞书自定义机器人 webhook - 最终连线:开始 → LLM → Code → HTTP → 结束(删掉多余连线,保证无分叉)
7.2 右侧面板逐项填写(对照表)
| 配置项 | 试运行(演示) | 上线(真飞书) |
|---|---|---|
| Method | POST | |
| URL | https://httpbin.org/post | https://open.feishu.cn/open-apis/bot/v2/hook/<token>国际版: open.larksuite.com |
| 鉴权 Auth | 关闭 / None(token 已在 URL 里) | |
| Headers | 新增:Content-Type = application/json | |
| Body 类型 | RAW_TEXT(也叫 Raw / 纯文本)← 关键 | |
| Body 内容 | 引用 编码飞书消息.payload | |
图 9:HTTP 节点配置示意 — ① Method+URL → ② Body 类型选 RAW_TEXT → ③ 引用 payload。
{"text":"{{output}}"}。httpbin.org/post:会把收到的 JSON echo 回来,且不需要真飞书 token。7.3 httpbin 返回怎样算成功?
{
"json": {
"msg_type": "text",
"content": { "text": "【竞品日报】增长情报群\n\n..." }
}
}
节点输出应有 statusCode: 200,以及 body / headers。
配置「结束」节点 — 暴露结果
8.1 逐步配置
- 单击「结束」节点
- 输出模式选 返回变量(不要选「直接回答」之类对话模式)
- 在输出变量里 + 添加 两行:
report← 引用生成竞品日报.outputlark_status← 引用推送飞书.statusCode
- 确认连线为:开始 → 生成竞品日报 → 编码飞书消息 → 推送飞书 → 结束
- 点顶部或画布旁 保存(多数版本也会自动保存)
图 10:结束节点配置示意 — 输出 report 与 lark_status。
图 11:完整画布实录 — 五个节点名称、输入输出应与上表一致。
数字 1→2→3 = 操作顺序 · 请按编号依次点击 / 填写
试运行 — 填写示例参数
- 画布右上角或右侧栏点 试运行(或 ▶ 图标)
- 弹出参数表单,逐字填写:
| 字段 | 填入(复制) |
|---|---|
report_date | 2026-07-16 |
lark_hint | 增长情报群 |
webhook_url | https://httpbin.org/post(若开始节点有该字段;URL 也可只配在 HTTP 节点) |
- 点 运行 / 开始运行
- 等待每个节点变绿(LLM 可能 1~3 分钟,视模型速度)
- 点开各节点查看输入输出;重点看 HTTP 节点
statusCode: 200 - 结束节点应能看到完整
reportMarkdown 和lark_status: 200
图 12:试运行侧栏 — 三个开始参数 + 运行按钮。
数字 1→2→3 = 操作顺序 · 请按编号依次点击 / 填写
lark_status: 200 · 结束节点 report 含四所交易所内容 · Token 消耗 > 0。换成真实飞书 Webhook
- 飞书桌面端 → 进入目标群 → 右上角 设置
- 群机器人 → 添加机器人 → 自定义机器人
- 名称随意,安全设置若开「自定义关键词」,填
竞品日报(与 Code 前缀一致) - 复制 Webhook 地址,形如:
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - 回到 Coze 画布 → 单击 推送飞书 HTTP 节点
- 把 URL 从 httpbin 换成刚复制的飞书 Webhook
- 保存 → 再次 试运行(参数同上,report_date 改成今天)
- 飞书群应收到带
【竞品日报】增长情报群前缀的长消息
关于「每日自动」— 无内置 Cron
- 本课目标:手动试运行跑通 — 已完成
- 若要每天 9:00 自动推:需先 发布应用,再用 crontab 调 OpenAPI
- 具体 curl、PAT Token、workflow_id 获取 → 见 P08 发布 · PAT · OpenAPI
# P08 会详讲,这里仅预览(每天 9:00)
0 9 * * * curl -sS -X POST 'http://localhost:8888/v1/workflow/run' \
-H 'Authorization: Bearer <你的PAT>' \
-H 'Content-Type: application/json' \
-d '{"workflow_id":"<工作流ID>","parameters":{"report_date":"'"$(date +%F)"'","lark_hint":"增长情报群"}}' \
>> /tmp/coze-comp-daily.log 2>&1
工作流 ID:打开画布时 URL 末尾数字,如 .../workflow/7662919178956832768
踩坑清单(速查表)
| 现象 | 原因 | 处理 |
|---|---|---|
| 工作流名红色报错 | 用了中文名 | 改成 daily_competitor_report |
LLM 变量是字面量 {{report_date}} | 开始节点未定义或名写错 | 检查开始输出是否 report_date |
推送飞书 400 / 19001 | 无 Code 节点,JSON 未转义 | 按第 6 步加 Python + RAW_TEXT |
| HTTP Body 选了 JSON 模板 | 长文本再次破坏 JSON | 改 Body 类型为 RAW_TEXT,引用 payload |
| Tokens = 0 | 模型未启用 / Key 无效 | 管理后台检查模型配置 |
| httpbin 200 群无消息 | 仍是演示 URL | HTTP URL 换飞书 Webhook |
| 飞书无消息但 HTTP 200 | 机器人关键词过滤 | 文案含「竞品日报」或关关键词限制 |
| 想每天自动跑 | 无内置 cron | P08 外部 crontab + OpenAPI |
- □ 五节点链:开始 → LLM → Code → HTTP → 结束
- □ 开始输出:report_date / lark_hint / webhook_url
- □ Code:json.dumps + 3500 截断 + 【竞品日报】前缀
- □ HTTP:POST + RAW_TEXT + Content-Type application/json
- □ 试运行 httpbin 200,换飞书后群收到消息