← Back to Skills Marketplace
fengyily

文旅素材搜索

by F1 · GitHub ↗ · v1.0.22 · MIT-0
cross-platform ⚠ suspicious
287
Downloads
0
Stars
0
Active Installs
23
Versions
Install in OpenClaw
/install culturetour-skill
Description
指导智能体检索文旅素材(数游神州 data0086.com)并走通「搜索 → 列表 → 预览(HLS/MP4) → 选择/购买 → Mock交易返回 → 视频下载到本地」。搜索请求默认 3条,最多 5 条(pageSize≤5),用户可要求更少;列表用表格展示(颜色徽章状态 + img + video),用户通过...
README (SKILL.md)

文旅素材搜索(API)

搜索流程说明(每次搜索都适用)

用户每次发起搜索时(包括首次、后续、重新搜索、换关键词等),智能体都须按以下流程执行,不得省略或合并为一次

Step 1. 计算两次调用的 pageSize(成片优先配比)

设用户想要总条数为 N(默认 3,上限 5;用户可指定 1-5):

  • pageSize_finished = ceil(N / 2) — 成片
  • pageSize_material = floor(N / 2) — 素材
用户想要 N 成片条数 素材条数
1 1 0
2 1 1
3 2 1
4 2 2
5 3 2

Step 2. 两次 POST 调用(顺序执行)

  1. 第一次(成片):请求体 commodityCode = finished_commodity_code,URL pageSize = pageSize_finished
  2. 第二次(素材):请求体 commodityCode = null,URL pageSize = pageSize_material(若为 0 则跳过第二次)

Step 3. 兜底补齐(配比失败时)

若成片实际返回 \x3C pageSize_finished,用素材补齐到 N 条;反之亦然。目标是总条数尽量等于 N

Step 4. 合并与判定类别

  • 合并两次返回的 datas,按 businessCode/id 去重
  • 逐条以"返回数据本身"的 commodityCode 判定(不是按哪次调用):
    • item.commodityCode === finished_commodity_codecategory = "成片"
    • 否则 → category = "素材"

Step 5. 展示与汇总(统计必须基于 category 字段,不是请求参数!)

成片条数 = sum(1 for item in results if item.category == "成片")
素材条数 = sum(1 for item in results if item.category == "素材")
  • 汇总行(表格之前):📽 共找到 N 条资源:成片 **X** 条 | 素材 **Y** 条
    • XY 必须与表格里实际带 【成片】/【素材】 徽章的行数严格一致
    • 即使 X=0Y=0 也要写出(说明搜过了但无结果)
  • 表格每行:标题旁强制带 【成片】 / 【素材】 徽章(以 item.category 为准)

绝对禁止

  • ❌ 省略成片调用,只调一次接口就返回
  • ❌ 汇总行的数字与表格里实际徽章不一致(最常见错误:按"请求参数 commodityCode 是什么"算成片条数,而不是按"返回记录本身的 commodityCode"算)
  • ❌ 输出表格时省略类别徽章

此规则等同于主路径「步骤 1」,优先级最高。

购买流程说明(当前调试阶段)

本 Skill 处于调试阶段,真实交易 API 尚未上线。用户发出「购买」「下单」「买 N」等指令时,当前约定的完整响应流程为:

  1. 构造 mock 交易响应video_url = 搜索结果中该素材的 fragmentUrl(预览地址)
  2. 下载视频到本地:调用 bash scripts/download_video.sh "\x3Cvideo_url>" "downloads/{business_code}.mp4" [HLS|MP4],将视频保存到 downloads/ 目录
  3. 告知用户:输出下载完成状态及本地文件路径

此流程由用户购买指令显式触发,搜索和预览阶段不执行任何下载。 真实交易 API 上线(TRADE_API_BASE 非空)后,步骤 1 将替换为真实下单请求,步骤 2-3 保持不变。

输出格式规范

智能体应先判断客户端类型,再选择对应的输出格式:

客户端类型 判定依据 输出格式
桌面端 / Web(ArkClaw、OpenClaw、浏览器等) 默认 HTML 表格(\x3Ctable>\x3Cimg>\x3Cvideo> 等,仅限 index.jsonhtml_output.tags 声明的标签)
IM 手机应用(飞书、微信、钉钉、企业微信等) 用户提到在飞书/微信/钉钉中使用,或上下文/系统信息表明客户端为 IM 应用 Markdown 表格(`

桌面端 HTML 模式注意事项

  • 不要将 HTML 放在代码围栏内(围栏内的标签不会被渲染,只会显示源码)
  • 不要使用 \x3Cinput type="checkbox">(静态 HTML 环境中无法交互)
  • 不要使用 \x3Cbutton>(无 JS 运行环境,无法绑定事件)
  • 所有媒体 URL(\x3Cimg src>\x3Cvideo src>)须通过下文「安全:媒体来源校验」

IM 手机端 Markdown 模式注意事项

  • 使用 Markdown 表格语法(| col |
  • 缩略图用 ![封面](cover_url) 或省略(手机屏幕窄时可不显示缩略图列)
  • 视频预览无法内嵌,统一用 [▶ 预览](preview_url) 链接
  • 不要输出 HTML 标签(手机 IM 不渲染 HTML,会直接显示标签源码)

通用规则

  • 选择操作通过用户发送文本指令完成(如「选 1,3」「购买」),智能体重新渲染带状态标记的表格
  • 注:本文档内的 HTML 模板用代码块展示以防文档渲染器误执行;智能体输出给用户时应去掉代码围栏。 详见下文「搜索结果展示」。

安全:媒体来源校验

本 Skill 的 HTML 输出包含 \x3Cimg>\x3Cvideo> 等标签,客户端会直接向 src 地址发起请求。为防止向不可信主机泄露用户 IP / 元数据,智能体应在嵌入前校验媒体 URL 的来源

  1. 可信来源列表config.jsontrusted_media_origins 数组(默认仅包含 api_origin)。
  2. 校验规则\x3Cimg src="...">\x3Cvideo src="...">\x3Cvideo poster="..."> 中的 URL 必须以 trusted_media_origins 中某一项开头(协议 + 主机 + 端口完全匹配)。
  3. 不符合时的处理
    • cover_urlbreviaryPic)不在可信列表 → 缩略图列显示「—」,不输出 \x3Cimg>
    • video_urlfragmentUrl)不在可信列表 → 视频预览列不输出 \x3Cvideo>,改为纯文本「[需在浏览器中打开]」+ preview_url 超链接(preview_url 始终为同源站内页面)。
  4. API 响应中的 breviaryPicfragmentUrl 均为完整绝对 URL(指向 wenzhou.data0086.com:9443),须检查是否在 trusted_media_origins 中。
  5. trusted_media_originsconfig.json,当前包含 https://www.data0086.comhttps://test.data0086.comhttps://wenzhou.data0086.com:9443

简言之:只有 config 中声明的可信域名才允许直接嵌入媒体,其余一律用 preview_url 超链接代替。

目标

让智能体用自然语言检索数游神州平台(data0086.com)上的文旅素材资源。每条结果必须结构化保留下游交易要用的字段,尤其是 fragmentUrl(视频预览流)commodityCodebusinessCode

  • 解析后的搜索 URL 直接 POST 请求,并按本文「输出映射」组装标准 JSON。

流程总览:先调试「预览 → 选择/购买」

当前阶段(交易 API 未定时):智能体优先走通 搜索 → 列表 → 预览 → 选择/购买 → Mock 交易返回 → 视频下载。不在此阶段调用真实交易接口;购买后 mock 交易返回数据video_url 复用搜索 API 的 fragmentUrl),然后 将视频下载到本地 并输出文件路径。

真实交易 APITRADE_API_BASE / trade_api_base 配置为非空后将替换 mock 流程(见「交易 API」)。当前为空 → 使用 mock + 下载

智能体按顺序引导;上一步未就绪时不要进入下一步。用户可随时要求「重新搜索」。

主路径(调试优先)

步骤 行为要点
1. 搜索(两次调用) 针对同一关键词,智能体依次发起两次 POST {api_origin}/ms-base/home/getList?pageNum=1&pageSize=3 请求,合并结果:\x3Cbr>① 第 1 次:请求体 commodityCodeconfig.jsonfinished_commodity_code(当前 CommodityType-7bf0aa3057bc)。\x3Cbr>② 第 2 次:请求体 commodityCodenull。\x3Cbr>合并时按每条记录自身的 commodityCode 字段判定类别:若 item.commodityCode === finished_commodity_codecategory = "成片",否则 → category = "素材"。展示时可在标题后加 \x3Csmall> 徽章区分。pageSize每次调用独立生效,默认 3(最多 5);用户要更少时按用户数量传。保留 P0/P1 字段。
2. 列出结果 用表格展示(HTML 或 Markdown,取决于客户端类型),不要把工具/API 返回的整段 JSON 当作对用户的主回复(见下「搜索结果展示」与「展示与 JSON」):列 状态|标题|缩略图|视频预览|详情;首列用颜色徽章标记选中状态(非 checkbox)。表格下方附操作说明(见「选择与购买」)。
3. 预览 引导用户打开 preview_url(数游神州商品详情页 /#/multimodal?businessCode=…,统一处理视频播放);可同时说明 stream_type 与原始 video_url 供技术核对。预览仅用于选片,不等于已购原片
4. 选择 / 购买 支持两种操作模式,无需额外确认步骤:\x3Cbr>模式 A — 先选后买:用户先发送选择指令(「选 1、3」「全选」),智能体重新渲染表格标记选中状态;之后用户发送「购买」或「下单」,直接进入步骤 5,不再要求二次确认。\x3Cbr>模式 B — 直接购买:用户直接发送「购买 1,2」「下单 3」「买第1条」等包含序号的购买指令,智能体一步完成选中并立即进入步骤 5,跳过选择环节。\x3Cbr>⚠️ 禁止在用户发出购买指令后回复"接口未开放""暂不支持下单"等拒绝性文字——当前阶段购买指令的执行方式就是步骤 5 的 mock + 下载。\x3Cbr>用户在选择阶段可追加/移除(「加上第2条」「去掉第3条」),智能体每次都重新渲染完整表格。
5. Mock 交易返回 + 视频下载(必须执行) 用户发出购买/下单指令后,智能体必须立即执行以下操作,不得跳过或以"接口未就绪"为由拒绝:\x3Cbr>A. 构造 mock 交易响应:为每条选中素材生成 {"code":0, "resData":{"video_url":"..."}} ,其中 video_url = 该素材搜索结果的 fragmentUrl(预览地址)。\x3Cbr>B. 下载视频到本地:调用 bash scripts/download_video.sh "\x3Cvideo_url>" "\x3Coutput_path>" [HLS|MP4] 将视频保存到 downloads/ 目录,文件名为 {business_code}.mp4。\x3Cbr>C. 输出本地文件路径:下载完成后向用户展示每条素材的 local_path。\x3Cbr>详见「购买后输出」。

搜索结果展示 — 根据客户端类型选择输出格式

输出前应先判断客户端类型,选择对应格式。

桌面端 / Web 客户端(HTML 模式)

客户端(ArkClaw / OpenClaw)支持 HTML 渲染。展示搜索结果时,直接输出 HTML 标签(仅限 index.jsonhtml_output.tags 声明的标签)。

注意事项(HTML 模式):

  • 不要使用 \x3Cinput type="checkbox">\x3Cbutton>(聊天气泡无 JS,无法交互)
  • 不要把 HTML 放在代码块里(代码块只会显示源码,不会渲染)
  • 所有 \x3Cimg src>\x3Cvideo src> 的 URL 须属于 trusted_media_origins(见「安全:媒体来源校验」)

正确做法:在回复中直接书写 HTML 标签,不加代码围栏,让客户端渲染。选择状态用颜色徽章表示,用户通过发送文本指令选择/购买。 (本文档内的模板为防止文档自身渲染 \x3Cvideo> 导致页面刷新,使用了代码块包裹——这仅限于文档展示,智能体输出时应去掉代码围栏。)

IM 手机应用(Markdown 模式)

飞书、微信、钉钉等 IM 手机应用不渲染 HTML,会将标签作为纯文本显示。此时应使用 Markdown 表格。

注意事项(Markdown 模式):

  • 不要输出 HTML 标签(手机 IM 会直接显示标签源码)
  • 不要把表格放在代码围栏内

正确做法:使用 Markdown 表格语法,缩略图用 ![](url) 或省略,预览链接用 [▶ 预览](preview_url)

表格列定义(固定五列)

表格之前必须输出一行类别汇总,格式示例: 🎬 共找到 **5** 条资源:成片 **2** 条 | 素材 **3** 条 即便成片为 0 也要明示 成片 0 条,以表明已执行两次搜索。

HTML 模式(桌面端 / Web):

列名 HTML 元素 内容
状态 \x3Cspan> 带背景色 未选中:灰底序号 \x3Cspan style="background:#e0e0e0;padding:2px 8px;border-radius:4px;">1\x3C/span>;选中:绿底 ✅ \x3Cspan style="background:#67c23a;color:#fff;padding:2px 8px;border-radius:4px;">✅ 1\x3C/span>
标题 纯文本 + \x3Csmall> + 类别徽章 title + 必标 类别徽章:\x3Cbr>成片 → \x3Csmall style="background:#f56c6c;color:#fff;padding:1px 6px;border-radius:3px;margin-left:4px;">成片\x3C/small>\x3Cbr>素材 → \x3Csmall style="background:#909399;color:#fff;padding:1px 6px;border-radius:3px;margin-left:4px;">素材\x3C/small>\x3Cbr>可附 \x3Cbr>\x3Csmall style="color:#999;">id\x3C/small>
缩略图 \x3Cimg src="..." width="120"> cover_url;无封面写「—」
视频预览 \x3Cvideo controls width="240" poster="..." src="..."> src 用 video_url(fragmentUrl),poster 用 cover_url
详情 纯文本 + \x3Ca href="..."> 分辨率/时长/大小,附 preview_url 超链接兜底

Markdown 模式(IM 手机端):

列名 Markdown 写法 内容
状态 纯文本序号或 ✅ 未选中:1;选中:✅ 1
标题 纯文本 + 类别前缀 必标 类别:【成片】title【素材】title(即使列表只有一类也要标)
缩略图 ![封面](cover_url) 或省略 手机屏幕窄时可不显示此列
预览 [▶ 预览](preview_url) 链接到站内播放页
详情 纯文本 分辨率/时长/大小

选择与购买(表格下方操作区)

表格下方直接输出操作提示 HTML。

注意:以下模板在本文档中用代码块展示,防止文档渲染器误执行。智能体输出给用户时应去掉代码围栏,直接输出 HTML。

核心规则:无需二次确认,购买 = mock 交易 + 下载视频

  • 「购买 1,2」「下单 3」等带序号的购买指令→ 直接选中 → 立即执行 mock 交易返回 + 视频下载到本地 + 输出文件路径,一步到位
  • 「选 1,3」→ 仅标记选中,渲染表格;之后用户说「购买」/「下单」→ 立即执行 mock + 下载
  • 不要在用户已发出购买指令后再要求「请确认」或「确认购买」
  • 不要回复"接口未开放""暂不支持""请到官网购买"——当前阶段购买就是 mock + 下载

初始状态(无选中)— HTML 模式:

\x3Cdiv style="background:#f6f8fa; border-left:4px solid #409eff; padding:10px 14px; margin:10px 0; border-radius:4px;">
\x3Cb>💡 操作说明\x3C/b>\x3Cbr>
· 回复「\x3Cb>购买 1、3\x3C/b>」或「\x3Cb>下单 2\x3C/b>」直接购买并下载视频到本地\x3Cbr>
· 回复「选 1、3」先标记,之后回复「\x3Cb>购买\x3C/b>」一键下载\x3Cbr>
· 回复「取消 3」取消已选
\x3C/div>

初始状态(无选中)— Markdown 模式(IM 手机端):

💡 **操作说明**
· 回复「**购买 1、3**」或「**下单 2**」直接购买并下载视频到本地
· 回复「选 1、3」先标记,之后回复「**购买**」一键下载
· 回复「取消 3」取消已选

有选中时 — HTML 模式:

\x3Cdiv style="background:#f0f9eb; border-left:4px solid #67c23a; padding:10px 14px; margin:10px 0; border-radius:4px;">
✅ 已选 \x3Cb>N\x3C/b> 条素材 | 总时长 XXs | 总大小 \x3Cb>XXXM\x3C/b>\x3Cbr>\x3Cbr>
👉 回复「\x3Cb>购买\x3C/b>」或「\x3Cb>下单\x3C/b>」立即购买并下载到本地\x3Cbr>
👉 回复序号可继续追加或取消选择
\x3C/div>

有选中时 — Markdown 模式(IM 手机端):

✅ 已选 **N** 条素材 | 总时长 XXs | 总大小 **XXXM**
👉 回复「**购买**」或「**下单**」立即购买并下载到本地
👉 回复序号可继续追加或取消选择

当用户发送选择指令后,智能体重新渲染完整表格

  • 选中行首列显示绿色 ✅ 徽章,行背景加 style="background:#f0f9eb;"
  • 未选行首列显示灰色序号徽章
  • 表格下方显示选中汇总 + 购买提示

展示与 JSON(必读)

  • 对用户:搜索列表的默认形态是表格(桌面端用 HTML 表格,IM 手机端用 Markdown 表格)。禁止用 JSON 代码块替代。
  • 对程序/联调:若用户明确说「给我原始 JSON」「导出结构」或已进入购买阶段,再按「标准结果 JSON 形状」或「购买后输出」给出 JSON。
  • 条数:URL 参数 pageSize 默认传 5(上限),用户要求更少时按用户数量传;若接口返回超出请求数量,只取前 N 条映射为表格。

完整输出模板(直接复制替换真实值)

智能体输出搜索结果时,按照以下模板逐行输出 HTML,将 {变量} 替换为真实值。

注意:以下模板在本文档中用代码块展示,防止文档渲染器误加载 \x3Cvideo>/\x3Cimg> 导致页面刷新。智能体输出给用户时应去掉代码围栏,直接输出 HTML 标签。

初始状态(全部未选中)— HTML 模式:

\x3Ctable border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%;">
\x3Cthead style="background:#f5f7fa;">
\x3Ctr>\x3Cth>状态\x3C/th>\x3Cth>标题\x3C/th>\x3Cth>缩略图\x3C/th>\x3Cth>视频预览\x3C/th>\x3Cth>详情\x3C/th>\x3C/tr>
\x3C/thead>
\x3Ctbody>
\x3Ctr>
\x3Ctd>\x3Cspan style="background:#e0e0e0;padding:2px 8px;border-radius:4px;">1\x3C/span>\x3C/td>
\x3Ctd>{title}\x3Cbr>\x3Csmall style="color:#999;">{id}\x3C/small>\x3C/td>
\x3Ctd>\x3Cimg src="{cover_url}" width="120">\x3C/td>
\x3Ctd>\x3Cvideo controls width="240" poster="{cover_url}" src="{video_url}">\x3C/video>\x3C/td>
\x3Ctd>{resolution}\x3Cbr>{duration_seconds}s / {file_size}\x3Cbr>\x3Ca href="{preview_url}">浏览器播放\x3C/a>\x3C/td>
\x3C/tr>
\x3Ctr>
\x3Ctd>\x3Cspan style="background:#e0e0e0;padding:2px 8px;border-radius:4px;">2\x3C/span>\x3C/td>
\x3Ctd>{title}\x3Cbr>\x3Csmall style="color:#999;">{id}\x3C/small>\x3C/td>
\x3Ctd>\x3Cimg src="{cover_url}" width="120">\x3C/td>
\x3Ctd>\x3Cvideo controls width="240" poster="{cover_url}" src="{video_url}">\x3C/video>\x3C/td>
\x3Ctd>{resolution}\x3Cbr>{duration_seconds}s / {file_size}\x3Cbr>\x3Ca href="{preview_url}">浏览器播放\x3C/a>\x3C/td>
\x3C/tr>
\x3C/tbody>
\x3C/table>
\x3Cdiv style="background:#f6f8fa; border-left:4px solid #409eff; padding:10px 14px; margin:10px 0; border-radius:4px;">
\x3Cb>💡 操作说明\x3C/b>\x3Cbr>
· 回复「\x3Cb>购买 1、3\x3C/b>」或「\x3Cb>下单 2\x3C/b>」直接购买指定素材\x3Cbr>
· 回复「选 1、3」先标记,之后回复「\x3Cb>购买\x3C/b>」一键下单
\x3C/div>

初始状态(全部未选中)— Markdown 模式(IM 手机端):

| 状态 | 标题 | 预览 | 详情 |
|------|------|------|------|
| 1 | {title} | [▶ 预览]({preview_url}) | {resolution} / {duration_seconds}s / {file_size} |
| 2 | {title} | [▶ 预览]({preview_url}) | {resolution} / {duration_seconds}s / {file_size} |

💡 **操作说明**
· 回复「**购买 1、3**」或「**下单 2**」直接购买指定素材
· 回复「选 1、3」先标记,之后回复「**购买**」一键下单

选中第 1、2 条后(用户发送「选 1,2」后智能体重新渲染)— HTML 模式:

\x3Ctable border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%;">
\x3Cthead style="background:#f5f7fa;">
\x3Ctr>\x3Cth>状态\x3C/th>\x3Cth>标题\x3C/th>\x3Cth>缩略图\x3C/th>\x3Cth>视频预览\x3C/th>\x3Cth>详情\x3C/th>\x3C/tr>
\x3C/thead>
\x3Ctbody>
\x3Ctr style="background:#f0f9eb;">
\x3Ctd>\x3Cspan style="background:#67c23a;color:#fff;padding:2px 8px;border-radius:4px;">✅ 1\x3C/span>\x3C/td>
\x3Ctd>{title}\x3C/td>
\x3Ctd>\x3Cimg src="{cover_url}" width="120">\x3C/td>
\x3Ctd>\x3Cvideo controls width="240" src="{video_url}">\x3C/video>\x3C/td>
\x3Ctd>{resolution}\x3Cbr>{duration_seconds}s / {file_size}\x3C/td>
\x3C/tr>
\x3Ctr style="background:#f0f9eb;">
\x3Ctd>\x3Cspan style="background:#67c23a;color:#fff;padding:2px 8px;border-radius:4px;">✅ 2\x3C/span>\x3C/td>
\x3Ctd>{title}\x3C/td>
\x3Ctd>\x3Cimg src="{cover_url}" width="120">\x3C/td>
\x3Ctd>\x3Cvideo controls width="240" src="{video_url}">\x3C/video>\x3C/td>
\x3Ctd>{resolution}\x3Cbr>{duration_seconds}s / {file_size}\x3C/td>
\x3C/tr>
\x3C/tbody>
\x3C/table>
\x3Cdiv style="background:#f0f9eb; border-left:4px solid #67c23a; padding:10px 14px; margin:10px 0; border-radius:4px;">
✅ 已选 \x3Cb>2\x3C/b> 条素材 | 总时长 236.6s | 总大小 \x3Cb>273.9M\x3C/b>\x3Cbr>\x3Cbr>
👉 回复「\x3Cb>购买\x3C/b>」或「\x3Cb>下单\x3C/b>」立即下单\x3Cbr>
👉 回复序号可追加或取消选择
\x3C/div>

选中第 1、2 条后 — Markdown 模式(IM 手机端):

| 状态 | 标题 | 预览 | 详情 |
|------|------|------|------|
| ✅ 1 | {title} | [▶ 预览]({preview_url}) | {resolution} / {duration_seconds}s / {file_size} |
| ✅ 2 | {title} | [▶ 预览]({preview_url}) | {resolution} / {duration_seconds}s / {file_size} |

✅ 已选 **2** 条素材 | 总时长 236.6s | 总大小 **273.9M**
👉 回复「**购买**」或「**下单**」立即下单
👉 回复序号可追加或取消选择

其中:

  • {preview_url} = {api_origin}/#/multimodal?businessCode={businessCode}(数游神州商品详情页)。
  • {cover_url} = breviaryPic(已是完整 URL),{video_url} = fragmentUrl。嵌入前须校验来源属于 trusted_media_origins(见「安全:媒体来源校验」),不符合则不输出 \x3Cimg> / \x3Cvideo>

❌ 错误输出 vs ✅ 正确输出

错误(HTML 模式下使用 checkbox / 代码围栏):

| □ | # | 标题 | 缩略图 | 预览 |
|---|---|------|--------|------|
| □ | 1 | 雁荡山素材 | [封面](url) | [预览 · HLS](url) |

或使用 \x3Cinput type="checkbox">(渲染出来但无法勾选)、\x3Cbutton>(无法点击触发)。

错误(IM 手机端输出 HTML 标签): 在飞书/微信中输出 \x3Ctable>\x3Ctr>\x3Ctd>... — 用户看到的是一堆 HTML 源码文本。

✅ 正确 — HTML 模式(桌面端 / Web,无代码围栏):

智能体回复中应直接包含如下 HTML(不被 ``` 包裹):

<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse; width:100%;"> <tr> <td><span style="background:#e0e0e0;padding:2px 8px;border-radius:4px;">1</span></td> <td>雁荡山素材</td> <td><img src="https://…/cover.jpg" width="120"></td> <td><video controls width="240" src="https://…/index.m3u8"></video></td> <td>2560×1440<br>118.5s / 98.3M</td> </tr> </table>

✅ 正确 — Markdown 模式(IM 手机端):

状态 标题 预览 详情
1 雁荡山素材 ▶ 预览 240.9s / ¥45

\x3Cvideo> 标签用法

  • src 必须用 video_url(即 fragmentUrl,实际媒体流),不是 preview_url(商品详情页)。
  • 来源校验:嵌入前须确认 video_url 的来源在 trusted_media_origins 中(见「安全:媒体来源校验」)。不在列表中 → 不输出 \x3Cvideo>,改用 preview_url 超链接。
  • postercover_url(封面图)。无封面时省略 poster。同样须通过来源校验。
  • MP4:浏览器原生支持。
  • HLS(m3u8):Safari 原生支持;Chrome 依赖客户端 hls.js。若 \x3Cvideo> 无法播放,详情列的 preview_url 链接兜底。

预览与本地播放(能力边界)

SKILL 无法在对话气泡内嵌入可执行的 HLS 播放器(多数客户端会拦截脚本、iframe,且 OpenClaw / 飞书等需产品侧组件才能内嵌播放)。本 Skill 通过下列方式支持用户在本机观看预览

  1. 浏览器打开 preview_url(推荐)

    • 数游神州商品详情页已统一处理视频播放,用户直接点击表格中的「预览」链接即可。
    • 若需在系统播放器中打开原始流,再使用 video_url + stream_type(见下文)。
  2. 仅当无可用 HTML 播放页、且必须直接拉流时:再考虑 video_url

    • stream_typeMP4:多数浏览器可直接打开直链。
    • stream_typeHLS:裸 m3u8 在 Chrome 常下载或无法播放;Safari 相对友好。
    • 智能体应优先推 preview_url,避免向非技术用户丢裸 m3u8 链。
  3. 本仓库脚本(本地用浏览器打开某 URL)

    • 路径:scripts/open_preview.sh(相对本 Skill 根目录)。
    • 用法:优先 bash scripts/open_preview.sh "\x3Cpreview_url>" MP4(播放页为 HTML 时按 HTTP 打开即可);若需直接拉流,再传入 video_urlHLS/MP4
    • 适用于 Cursor / 终端;飞书/OpenClaw 仍以点击 preview_url 为主。
  4. 可选:本机播放器(原始流)

    • VLC / ffplay 可粘贴 video_url;日常选片以 preview_url 为主。

飞书 / OpenClaw:卡片按钮 URL 与表格一致,指向 preview_url(即 {api_origin}/#/multimodal?businessCode={businessCode});若产品另有独立 H5 域名,以产品为准,但须能播同一条素材。

购买后输出(调试 / 联调)⚠️ 必须执行

强制规则:用户发出「购买」「下单」等购买指令后,智能体必须立即执行下述步骤 A + B禁止回复"交易接口未开放""暂不支持""请到官网购买"等拒绝性、引导性文字。当前阶段的"购买"就是 mock + 下载。

触发条件:仅当用户显式发送「购买」「下单」「买第 N 条」等购买指令时触发,搜索、浏览、预览阶段不写入任何本地文件。

在未接真实交易 API 时,用户发出购买指令后智能体执行以下两步:

步骤 A:构造 Mock 交易响应

为每条选中素材构造 mock 交易返回数据。核心字段 video_url 直接复用搜索 API 返回的 fragmentUrl(预览地址),模拟交易成功后服务端返回的视频下载链接。

单条 mock 交易响应示例:

{
  "code": 0,
  "msg": "mock: 交易成功(模拟)",
  "resData": {
    "video_url": "https://wenzhou.data0086.com:9443/res/hls/preview/product/77758f136a4648888d1acd615ec24dbe"
  }
}

说明video_url 的值 = 搜索结果中该素材的 fragmentUrl。当交易 API 真正上线后,此字段将由服务端返回真实的原片/授权下载地址。

批量购买时,智能体为每条素材分别构造一个 mock 响应,汇总后输出完整的购买结果 JSON:

{
  "stage": "purchase_mock_completed",
  "items": [
    {
      "id": 459,
      "title": "雁荡山-飞拉达雾天-一镜到底-无人机航拍",
      "commodity_code": "CommodityType-e744a1044794",
      "business_code": "Commodity-20260406211854879",
      "video_url": "https://wenzhou.data0086.com:9443/res/hls/preview/product/77758f136a4648888d1acd615ec24dbe",
      "stream_type": "HLS",
      "duration_seconds": "240.9",
      "price": 45.0,
      "local_path": ""
    },
    {
      "id": 461,
      "title": "雁荡山-飞拉达-云雾多视频2-无人机航拍",
      "commodity_code": "CommodityType-948a39e64144",
      "business_code": "Commodity-20260406212609534",
      "video_url": "https://wenzhou.data0086.com:9443/res/hls/preview/product/b68efe02182c436dbcf35f045b94ed30",
      "stream_type": "HLS",
      "duration_seconds": "30.5",
      "price": 45.0,
      "local_path": ""
    }
  ],
  "summary": {
    "total_items": 2,
    "total_duration_seconds": "271.4",
    "total_price": 90.0
  }
}

local_path 在步骤 B 下载完成后填入。

步骤 B:视频下载到本地

获得 mock 交易响应中的 video_url 后,智能体 调用下载脚本将视频保存到本地

  1. 下载目录downloads/(位于 Skill 根目录下;不存在时自动创建)。也可通过 config.jsondownload_dir 配置。
  2. 文件命名{business_code}.{ext}(如 Commodity-20260406211854879.mp4)。扩展名由 stream_type 决定:MP4 → .mp4;HLS → .mp4(ffmpeg 转封装后输出)。
  3. 下载命令:调用 bash scripts/download_video.sh "\x3Cvideo_url>" "\x3Coutput_path>" [HLS|MP4]
    • MP4:直接用 curl 下载。
    • HLS:用 ffmpeg 下载 m3u8 并转封装为 MP4(需本机安装 ffmpeg)。
  4. 输出:下载完成后,将 local_path 填入结果 JSON 并向用户输出文件路径

下载完成后的最终输出示例:

{
  "stage": "download_completed",
  "items": [
    {
      "id": 459,
      "title": "雁荡山-飞拉达雾天-一镜到底-无人机航拍",
      "commodity_code": "CommodityType-e744a1044794",
      "business_code": "Commodity-20260406211854879",
      "video_url": "https://wenzhou.data0086.com:9443/res/hls/preview/product/77758f136a4648888d1acd615ec24dbe",
      "stream_type": "HLS",
      "local_path": "downloads/Commodity-20260406211854879.mp4",
      "duration_seconds": "240.9",
      "price": 45.0
    },
    {
      "id": 461,
      "title": "雁荡山-飞拉达-云雾多视频2-无人机航拍",
      "commodity_code": "CommodityType-948a39e64144",
      "business_code": "Commodity-20260406212609534",
      "video_url": "https://wenzhou.data0086.com:9443/res/hls/preview/product/b68efe02182c436dbcf35f045b94ed30",
      "stream_type": "HLS",
      "local_path": "downloads/Commodity-20260406212609534.mp4",
      "duration_seconds": "30.5",
      "price": 45.0
    }
  ],
  "summary": {
    "total_items": 2,
    "total_duration_seconds": "271.4",
    "total_price": 90.0,
    "downloaded": 2,
    "failed": 0
  }
}

向用户展示时,在 JSON 之前/之后用自然语言说明:

已完成 2 条素材的模拟购买与下载:

  1. 雁荡山-飞拉达雾天-一镜到底-无人机航拍 → downloads/Commodity-20260406211854879.mp4
  2. 雁荡山-飞拉达-云雾多视频2-无人机航拍 → downloads/Commodity-20260406212609534.mp4

错误处理:若某条素材下载失败(网络错误、ffmpeg 未安装等),local_path 设为空字符串 ""summary.failed 计数 +1,并向用户说明失败原因与重试建议。

单条选择同样使用此结构(items 数组长度为 1),保持输出格式统一。

交易 API(预留,未来替换 mock)

以下仅在 TRADE_API_BASEtrade_api_base 已配置为非空值 且产品已约定路径/鉴权后执行。

  1. 基址:环境变量 TRADE_API_BASE 优先;否则 config.jsontrade_api_base 非空字符串。
  2. 调用:用已锁定资源的 idcommodityCodebusinessCode 按产品约定发起请求;鉴权勿泄露到对话。
  3. 接入后替换 mock:交易 API 上线后,步骤 A 的 mock 响应将被真实接口响应替换;video_url 以服务端返回为准。步骤 B 的下载逻辑保持不变。

当前状态trade_api_base 为空 → 不调用真实交易 API,但必须执行 mock + 下载流程(见上文「购买后输出」)。绝不能因为交易 API 未就绪就拒绝用户的购买指令。

API 基址配置(可更换)

单一默认值:与本 Skill 同目录的 config.jsonapi_origin + search_path)。

解析规则

  1. 若存在环境变量 WENLV_API_ORIGIN(仅站点根,如 https://test.data0086.com),则以其为 api_origin
  2. 否则使用 config.json 中的 api_origin
  3. search_url = api_origin(去掉末尾 /)+ search_path(默认 /ms-base/home/getList)+ ?pageNum={pageNum}&pageSize={pageSize}
项目 说明
基址 {api_origin},当前值见 config.jsonhttps://test.data0086.com
搜索 POST {api_origin}/ms-base/home/getList?pageNum=1&pageSize=5
鉴权 无(公开接口,token 头可为空)
Content-Type application/json

换环境时:改 config.json 或部署侧设置 WENLV_API_ORIGIN 即可,无需改 Skill 正文中的长 URL。交易相关另设 TRADE_API_BASEconfig.jsontrade_api_base(非空时生效)。

详情页地址(用户点击「预览」)⚠️ 拼接规则

统一使用数游神州前端的商品详情页(与原始 fragmentUrl 区分)。

拼接公式(唯一正确形式):

preview_url = {api_origin} + {detail_path} + "?businessCode=" + {businessCode}
  • api_originWENLV_API_ORIGINconfig.jsonapi_origin(当前 https://test.data0086.com末尾 /)。
  • detail_path:默认 /#/multimodal(见 config.jsondetail_path)。
  • businessCode:搜索结果中每条素材的 businessCode 字段。

✅ 正确格式:

https://test.data0086.com/#/multimodal?businessCode=Commodity-20260406211854879

❌ 错误格式 —— 不要用 fragmentUrl 当预览链接:

https://wenzhou.data0086.com:9443/res/hls/preview/product/77758f136a4648888d1acd615ec24dbe

表格「预览」列、飞书卡片按钮、OpenClaw 内链均应使用 preview_url(商品详情页)。video_url(fragmentUrl)仍须保留在结构化结果中,供交易、调试与核对原始流。

播放页与裸流(必读:避免一点就下载 m3u8)

  • video_urlfragmentUrl 指向的是 媒体流(常见为 HLS 预览地址),不是给用户点的「网页预览」。在 Markdown 里若写成 [预览](video_url),浏览器对 HLS 往往会 下载 m3u8 或无法内联播放。禁止video_url 作为表格「预览」列或卡片按钮的主链接。
  • preview_url 对应数游神州的商品详情页(SPA 页面,内含视频播放器),用户点击后在浏览器页面里播放,而不是下载清单文件。
  • 映射preview_url 一律只由 {api_origin}{detail_path}?businessCode={businessCode} 按上文公式拼接(见 config.json),不得fragmentUrl 填进 preview_url,也不得用 video_url 顶替。

请求 URL 参数

分页通过 URL query 传递:

参数 必填 说明
pageNum 页码,默认 1
pageSize 每页条数,接口默认 18;智能体侧默认传 5(上限),用户要求更少时按用户数量传(如 1、2、3)

请求体

{
  "commodityCode": null,
  "sceneType": "",
  "tradeType": "",
  "search": "雁荡山飞拉达",
  "city": "330300"
}
字段 必填 说明
search 关键词,支持中文自然语言
city 城市行政区划代码,默认 "330300"(温州)
commodityCode 按商品编码精确筛选。本 Skill 通过此字段区分「成片 / 素材」两类资源(见下)
sceneType 场景类型筛选,如 "慢直播",默认 ""
tradeType 交易类型筛选,如 "cash",默认 ""

两次搜索:成片 + 素材

同一关键词下,本 Skill 依次发起两次搜索,并按"成片优先 50:50"配比分配条数:

pageSize 分配(用户想要总数 N,默认 3,上限 5)

顺序 请求 commodityCode URL pageSize
第 1 次(成片) config.jsonfinished_commodity_code(当前 CommodityType-7bf0aa3057bc ceil(N / 2)
第 2 次(素材) null floor(N / 2)(为 0 则跳过)

配比参考表(N=1~5):

N 成片 素材
1 1 0
2 1 1
3 2 1
4 2 2
5 3 2

兜底补齐:某一类返回不足时(如成片只返回 1 条而期望 2 条),用另一类补齐,总条数尽量达到 N

类别判定规则(核心)

以返回的每条记录自身的 commodityCode 字段为准,而不是按哪一次调用:

if item.commodityCode === finished_commodity_code:
    item.category = "成片"
else:
    item.category = "素材"

这样即便两次调用返回数据有重复或交叉,最终每条记录的类别依然由其自身 commodityCode 决定,去重与标记逻辑一致。

合并策略

  1. 两次调用按配比表分配 pageSize(不是各自独立的 N)。
  2. 合并两次返回的 resData.datas,按 businessCodeid 去重(避免两次调用返回同一条记录时重复展示)。
  3. 按上述判定规则为每条记录打 category 标签。
  4. 排序:成片在前、素材在后;同类内部保留接口返回顺序。
  5. 若某一类无数据,用另一类兜底补齐到 N 条;两类都无数据时,向用户说明"未找到相关资源"。

展示要求(强制)

  1. 汇总行(必须,统计口径以 category 字段为准)
    • 格式示例:📽 共找到 5 条资源:**成片 3 条** | **素材 2 条**
    • 即使某类为 0 也要写出(如 📽 共找到 3 条资源:**成片 0 条** | **素材 3 条**),让用户知道两次搜索确实都执行过。
    • ⚠️ 统计算法成片条数 = 表格里 category == "成片" 的行数素材条数 = 表格里 category == "素材" 的行数不要按"请求参数里 commodityCode 是什么"来算,以免出现"请求成片 3 条但返回的有 1 条实际是素材"时汇总错位。
    • 自检:汇总行的 X 和 Y 必须等于表格里实际打 【成片】/【素材】 徽章的行数,加起来 = 总条数。
  2. 类别徽章(必须,每行都标)
    • HTML 模式:标题旁追加 \x3Csmall style="background:#f56c6c;color:#fff;padding:1px 6px;border-radius:3px;margin-left:4px;">成片\x3C/small>\x3Csmall style="background:#909399;color:#fff;padding:1px 6px;border-radius:3px;margin-left:4px;">素材\x3C/small>
    • Markdown 模式:标题前加 【成片】【素材】 文本前缀
    • 不允许只在混合类型时才标注;即使全部是同一类别也要每行标出。

finished_commodity_code 可配置

  • 修改 config.jsonfinished_commodity_code 即可调整成片归类的商品编码,无需改 Skill 正文。
  • 值为空字符串或未配置时,跳过第 1 次搜索,仅按「素材」单次搜索——此时所有返回记录都标记为 category: "素材"

响应约定

  • 业务成功:code === 0,列表在 resData.datas,总数 resData.total
  • HTTP 非 2xx 或 code !== 0:向用户说明错误,勿伪造结果。

更完整的原始字段说明见 references/api_reference.md。标准接口规范(含交易下单)见 api.md

字段优先级

P0 — 核心(交易直连,缺一不可)

来源字段 输出键名 说明
id id 素材唯一 ID(数字)
commodityName title 标题
fragmentUrl video_url 原始预览流(HLS),交易/核对用,表格「预览」列不用作主链
commodityCode commodity_code 商品编码,交易下单必需
businessCode business_code 业务编码,交易下单必需,也用于详情页 URL

派生(必选,用于展示与点击)

派生规则 输出键名 说明
{api_origin}{detail_path}?businessCode={businessCode} preview_url 表格「预览」列、卡片按钮统一用此链接(商品详情页);detail_path 默认 /#/multimodal,见 config.json

同时必须输出 stream_type(由 video_url / fragmentUrl 判定):

  • URL 含路径片段 /hls/"HLS"(需 HLS 播放器,如 hls.js)
  • URL .mp4 结尾"MP4"(浏览器可直接播)
  • fragmentUrl 为空:不要编造 video_url;可省略 stream_type 或标为无法判定(勿写假链接)

P1 — 重要(展示与交易辅助)

来源 输出键名
explain description(HTML 格式,包含清晰度/格式等信息)
fragmentTime duration_seconds(建议保留一位小数,字符串或数字均可)
price price(元)
breviaryPic cover_url:已是完整 URL,嵌入前须属于 trusted_media_origins
sceneType scene_type(逗号分隔的场景类型)
tag(JSON.parse) tags:逗号分隔或数组
createUser merchant(商家名称)

P2 — 辅助(可选)

videoProductCodecontactNamecontactPhonemerchantBusinessCodepriceJsonlocation 等,在用户需要排查或对接数据源时再输出。

标准结果 JSON 形状(解析/转发用)

智能体整理输出时,每条结果建议符合:

{
  "total": 185,
  "pageNum": 1,
  "pageSize": 5,
  "results": [
    {
      "#": "1",
      "id": 459,
      "title": "雁荡山-飞拉达雾天-一镜到底-无人机航拍",
      "commodity_code": "CommodityType-e744a1044794",
      "business_code": "Commodity-20260406211854879",
      "preview_url": "https://test.data0086.com/#/multimodal?businessCode=Commodity-20260406211854879",
      "video_url": "https://wenzhou.data0086.com:9443/res/hls/preview/product/77758f136a4648888d1acd615ec24dbe",
      "stream_type": "HLS",
      "duration_seconds": "240.9",
      "price": 45.0,
      "cover_url": "https://wenzhou.data0086.com:9443/res/covers/77758f136a4648888d1acd615ec24dbe.jpg",
      "scene_type": "慢直播,创作素材,无人机航拍",
      "tags": "视频创作, 无人机航拍",
      "merchant": "温州鼎诚体育发展有限公司"
    }
  ]
}

curl 示例

默认站点根须与 config.jsonapi_origin 保持一致(换域名时改 config 并同步下面默认值,或只用 export)。

# 环境变量优先;未设置时读取 config.json 的 api_origin(当前为 https://test.data0086.com)
ORIGIN="${WENLV_API_ORIGIN:-https://test.data0086.com}"
FINISHED_CODE="CommodityType-7bf0aa3057bc"  # config.json finished_commodity_code

# 第 1 次:成片
curl -sS "${ORIGIN}/ms-base/home/getList?pageNum=1&pageSize=5" \
  -H 'Content-Type: application/json' \
  -H "Origin: ${ORIGIN}" \
  -H "Referer: ${ORIGIN}/" \
  -H 'token;' \
  --data-raw "{\"commodityCode\":\"${FINISHED_CODE}\",\"sceneType\":\"\",\"tradeType\":\"\",\"search\":\"雁荡山\",\"city\":\"330300\"}"

# 第 2 次:素材
curl -sS "${ORIGIN}/ms-base/home/getList?pageNum=1&pageSize=5" \
  -H 'Content-Type: application/json' \
  -H "Origin: ${ORIGIN}" \
  -H "Referer: ${ORIGIN}/" \
  -H 'token;' \
  --data-raw '{"commodityCode":null,"sceneType":"","tradeType":"","search":"雁荡山","city":"330300"}'

合并两次返回的 resData.datas(按 businessCode/id 去重),然后对每条记录按其自身的 commodityCode 判定:commodityCode === finished_commodity_codecategory = "成片",否则 → category = "素材"。最终输出 results 数组(成片在前、素材在后)。

智能体行为要点

  1. 须同时保留 preview_url(详情列超链接兜底)与 video_url\x3Cvideo> 播放源)列表展示须用五列表格:状态(颜色徽章)|标题|缩略图|视频预览|详情(见「搜索结果展示」)。桌面端用 HTML 表格,IM 手机端用 Markdown 表格。不要使用 \x3Cinput>\x3Cbutton> 等需要 JS 交互的元素。
  2. 面向用户的列表:桌面端以 HTML 表格 为主(含颜色徽章状态、\x3Cimg>\x3Cvideo> 元素),IM 手机端以 Markdown 表格 为主;结构化字段在表格列中体现。不要用整段 JSON 代替表格。仅在用户索要导出、或购买后的约定 JSON 块中再输出 JSON。
  3. 分页:默认只拉第 1 页且 pageSize 默认 5(上限),用户要求更少时按用户数量传;用户要「更多」时递增 pageNum,注意 total 边界。跨页选择:翻页时保留已选中条目;若用户在第 1 页选了第 1、3 条,翻到第 2 页后再选第 2 条,最终选中列表包含累计选中的所有条目。
  4. 两次搜索 + 成片优先配比(每次搜索都必须执行,无例外)不管是用户第 1 次搜索还是第 N 次搜索、同一关键词还是换关键词,智能体对每一次搜索都顺序发起两次 POST,按 50:50 成片优先 配比分配 pageSize
    • 成片:commodityCode = config.finished_commodity_codepageSize = ceil(N / 2)
    • 素材:commodityCode = nullpageSize = floor(N / 2)
    • 示例:N=3 → 成片 2 条 + 素材 1 条;N=5 → 成片 3 条 + 素材 2 条
    • 禁止因为"已经搜过""连续搜索""结果相似"等理由跳过成片那次调用
    • 合并两次返回的 datas(按 businessCode/id 去重),按每条记录自身的 commodityCode 判定 category;某类不足时用另一类兜底补齐到 N 条
    • 展示时强制输出:(a) 汇总行 📽 共找到 N 条资源:成片 X 条 | 素材 Y 条X/Y 必须按 category 字段统计而非请求参数,即便 X=0 也要写;(b) 每行标题带 【成片】/【素材】 徽章
    • finished_commodity_code 为空时才可跳过第一次调用,汇总行写明 未配置 finished_commodity_code,仅搜素材
    • 详见「两次搜索:成片 + 素材」
  5. 预览与成单分离:用户点击的预览必须是 preview_url(商品详情页)不要video_url(HLS 流) 做成主链接以免下载或无法播放。预览仅用于选片。当前调试阶段:用户发出购买指令后,智能体必须执行 mock 交易 + 视频下载(步骤 5),不得以"接口未就绪"为由拒绝或引导用户去官网手动购买。
  6. 交易安全(启用交易 API 后):不在对话中输出完整密钥;失败时返回接口错误摘要,不猜测成功。
  7. 多选与购买(无需二次确认):支持两种下单方式:① 直接购买——用户发送「购买 1,3」「下单 2」等带序号的购买指令,智能体一步完成选中 + mock 交易 + 视频下载;② 先选后买——用户先「选 1,3」标记,再发送「购买」/「下单」直接执行 mock 交易 + 下载,不再要求二次确认。选择过程中用户可随时追加(「加上第2条」)或移除(「取消 3」),智能体每次都重新渲染完整表格,用绿色/灰色徽章标记选中状态。
  8. Mock 交易与视频下载:购买确认后,智能体构造 mock 交易响应(video_url = 搜索结果的 fragmentUrl),然后调用 scripts/download_video.sh 将视频下载到 downloads/ 目录(HLS 用 ffmpeg 转 MP4,MP4 用 curl 直接下载),最终向用户输出每条素材的本地文件路径。详见「购买后输出」。
  9. 交互约束:聊天气泡是静态 HTML(无 JavaScript),禁止使用 \x3Cinput>\x3Cbutton>\x3Cform> 等需要 JS 交互的元素。所有用户操作通过发送文本消息完成,智能体解析后重新渲染表格。
  10. 客户端适配:智能体应根据客户端类型选择输出格式(HTML 或 Markdown)。判定方式见文首「输出格式规范」。若无法确定客户端类型,默认使用 HTML 模式;当用户反馈看到 HTML 源码时,切换为 Markdown 模式。

具体包名与发布流程以实际 npm 包为准;本 Skill 约束 行为、配置解析顺序、API 路径与输出字段

Usage Guidance
This skill appears internally consistent, but review a few things before installing: 1) inspect config.json trusted_media_origins and don't add domains you don't trust; 2) the download script will write files to downloads/ only after you trigger a purchase—ensure you are comfortable with that directory and its permissions; 3) setting TRADE_API_BASE to a non-empty value will make the skill call a real order API (which may require Authorization headers) — only set it if you trust the endpoint and provide proper credentials; 4) the scripts use python3, curl and optionally ffmpeg (for HLS). Consider running the skill in an environment where network/file writes are acceptable and limit network permissions to the declared domains.
Capability Analysis
Type: OpenClaw Skill Name: culturetour-skill Version: 1.0.22 The skill provides functionality to search for and download video media from the data0086.com platform. It requires high-risk permissions, including shell execution (scripts/download_video.sh), filesystem write access (downloads/), and network access. While the download script implements a security validation check to ensure URLs match a whitelist in config.json (e.g., wenzhou.data0086.com), the inherent risk of using shell commands to process remote content via curl and ffmpeg, combined with instructions in SKILL.md that direct the agent to bypass standard transaction flows using 'mock' responses, warrants a suspicious classification.
Capability Assessment
Purpose & Capability
Name/description match the implementation: SKILL.md, api.md, config.json and included scripts all target data0086.com search/preview/download flows. Declared dependency on python3 and optional ffmpeg aligns with the download script's behavior.
Instruction Scope
Runtime instructions are specific and scoped to searching the API, rendering results, and performing a mock/real purchase + download only when the user issues a purchase command. The skill reads its bundled config.json and calls local scripts; it does not instruct the agent to read unrelated files or exfiltrate arbitrary data.
Install Mechanism
No install spec or remote downloads; code is provided in the bundle. Scripts are simple shell utilities (curl/ffmpeg) and parse config.json with python3. No external arbitrary URL downloads or extract steps during install.
Credentials
No required secrets or credentials. Optional env vars (WENLV_API_ORIGIN, TRADE_API_BASE) are justified: WENLV_API_ORIGIN can override the API origin/trusted download origins; TRADE_API_BASE switches mock purchases to real order API. The documentation explains auth needs for the real trade API.
Persistence & Privilege
always is false; skill writes only to its own downloads/ directory and only after an explicit purchase command. It does not modify other skills or global agent settings.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install culturetour-skill
  3. After installation, invoke the skill by name or use /culturetour-skill
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.22
No changes detected in this version. - Version 1.0.22 released with no updates to files or documentation. - Functionality and usage remain unchanged from the previous version.
v1.0.21
culturetour-skill 1.0.21 Changelog - 调整了「搜索流程」默认策略,实现成片/素材条数优先配比逻辑:根据用户请求数量自动分配两次调用的 pageSize(成片优先)。 - 搜索流程新增补齐机制:当成片或素材不足时自动用另一类补齐,确保总条数贴合用户需求。 - 汇总行与表格类别徽章的数值必须完全一致,类别统计按每条实际 category 字段判定,不再以请求参数为准。 - 强化了禁止事项说明,避免合并调用或统计错误带来的表格展示与统计不一致。 - 其他文档优化,细化了客户端适配与输出规则说明。
v1.0.20
culturetour-skill 1.0.20 - 强化搜索策略:每次用户发起检索都必须分别请求“成片”和“素材”,并合并结果,避免只查单一类型。 - 结果展现前增加统计汇总行,明确标示成片/素材条数(即使某类为 0 也须明示)。 - 搜索结果表格中每行都必须显式标注“成片”或“素材”类别,不再省略。 - 规范输出要求,严禁省略双路检索或类别标识,确保流程与说明文档一致。 - 其余流程(mock 下单、视频下载、输出格式适配、媒体安全校验等)未改。
v1.0.19
culturetour-skill 1.0.19 - 搜索流程重大升级:每次用户搜索时,智能体将对同一关键词「分别调用两次搜索接口」,一次限定成片(commodityCode),一次为素材(无 commodityCode),并在结果列表中自动合并、分类展示。 - 增加成片与素材分类提示,按条目自身的 commodityCode 区分类型,表头/标题可加徽章辅助识别。 - 其余交互、选择、mock 购买与本地下载流程不变。 - 兼容输出规则未改动:桌面端/Web 默认 HTML 表格,IM 手机端用 Markdown 表格。
v1.0.18
culturetour-skill 1.0.18 - 扩充了 config.json 的 trusted_media_origins 可信域名列表:新增 https://test.data0086.com。 - SKILL.md 文档内容同步补充,确保媒体嵌入严格限制于更新后的所有可信域名。 - 其余流程、表格规范和安全校验说明未变。
v1.0.17
No file changes detected in this version. - No code or content changes made; documentation and skill logic remain unchanged. - Behavior and user experience are consistent with the previous release.
v1.0.16
No changes detected in this version. - Version 1.0.16 was released with no detected changes to the files. - All features, behaviors, and documentation remain the same as the previous version.
v1.0.15
审查问题 修复内容 forced immediate local download index.json 新增 filesystem.write: ["downloads/"] 权限声明,明确告知安装者此 skill 会向 downloads/ 写入文件 config inconsistencies config.json 的 trusted_media_origins 补入 https://test.data0086.com(与 api_origin 一致);index.json domains 补入 test.data0086.com unchecked URLs at runtime download_video.sh 下载前读取 config.json 的 trusted_media_origins,逐条比对 URL 前缀——不在可信列表中的 URL 直接拒绝(exit 4)
v1.0.14
# Changelog for culturetour-skill v1.0.14 - Major change: Purchase action now triggers local video download after mock transaction. - Added scripts/download_video.sh to handle downloading selected video files to a local directory. - Updated SKILL.md: "购买"/"下单"等指令将 mock 交易返回且自动下载视频到本地目录(并输出文件路径)。 - 用户操作指引、流程及表格底部提示均已同步强调购买=mock+下载,严禁回复“暂不支持”等推迟/拒绝性提示。 - 默认搜索条数由5条降为3条,最多仍支持5条。 - 其他业务、输出格式和安全校验规则未变。
v1.0.13
culturetour-skill 1.0.13 - 对接数据源切换为「数游神州 data0086.com」文旅素材平台,API 字段/流程全面调整。 - 搜索接口和字段从自研平台迁移,支持新平台标准(如 `pageSize`,`breviaryPic`,`fragmentUrl`)。 - 新增「直接购买」操作:用户发「购买 1,2」等指令时,无需二次确认,即刻生成批量订单结构。 - 精简和更新操作引导说明,支持两种操作路径(先选后买 & 直接下单)。 - 强化媒体 URL 校验逻辑,适配新数据源的可信域名与字段映射。 - 调整表格展示模板及操作提示文案,更清晰贴合新业务。
v1.0.12
culturetour-skill 1.0.12 - 新增自动适配输出格式:根据客户端类型判断,桌面端(Web/ArkClaw/OpenClaw)用 HTML 表格,IM 手机端(如飞书、微信、钉钉)用 Markdown 表格。 - 列表展示方式优化:HTML/Markdown 各自用状态颜色徽章/符号表示选中,去除无法交互的 `<input type="checkbox">` 和 `<button>`。 - 支持用户通过文本指令选择、多选、取消素材,表格每次操作后完整渲染。 - 搜索条数调整:默认最多 5 条,用户可指定更少。 - 全面提升移动端体验,避免手机端直接显示 HTML 源码,统一用 Markdown 交互。 - 嵌入媒体严格校验域名,提升安全性。
v1.0.11
culturetour-skill v1.0.11 - 文档中增加了对环境变量 WENLV_API_ORIGIN 和 TRADE_API_BASE 的说明,可用于覆盖默认配置(见 SKILL.md description 和说明段落)。 - 精简并优化了文档顶部和 description,强调了媒体来源必须严格符合 trusted_media_origins 设置。 - 保持 HTML 表格强制展示、媒体嵌入安全性校验等核心原则不变。 - 其余内容结构未变化,主要为表意优化和易用性调整。
v1.0.10
- 补充说明:文档模板中所有 HTML 标签示例已用代码块包裹,强调「回复用户时必须去掉代码围栏」,以避免误渲染和格式错误。 - 增加了特别提醒:「注:本文档内的 HTML 模板用代码块展示以防文档渲染器误执行;智能体输出给用户时必须去掉代码围栏」。 - 明确表格操作区 HTML 模板、输出模板等区块在文档中用代码块包裹,在对用户回复时不应带代码围栏。 - 其余功能、流程和用法保持未变。
v1.0.9
- 简化了流程文档,去除对 MCP Server 和工具调用的依赖,明确仅采用底层 API 直连 POST 请求资源。 - 删除所有关于 MCP 工具 search_resources 的推荐与说明,将主流程统一为直接调用 API 基址。 - 文档标题与流程说明中统一使用“API”,不再区分 MCP/工具调用路径。 - 搜索流程细节和格式化 HTML 展示要求保持一致,去除了与多路径相关的混淆描述。 - 其余核心展示、校验和用户交互逻辑未变。
v1.0.8
**1.0.8 - 添加可信媒体来源校验** - 新增对媒体资源可信源的严格校验机制:仅允许 `config.json` 里 trusted_media_origins 域名下的图片和视频被嵌入 HTML。 - 若图片/视频资源不在可信地址,仅显示占位(缩略图列显示“—”;视频预览用浏览器链接代替,不嵌入 `<video>`)。 - 规范 cover_url(封面)、video_url(视频流)等的拼接与校验,杜绝外链或非白名单 CDN 嵌入,防止信息泄露。 - 文档细化嵌入规则和处理逻辑,加强平台安全性。
v1.0.7
culturetour-skill 1.0.7 - 强化输出格式要求,搜索结果**必须用原始 HTML 标签输出(<table>、<input type="checkbox">、<img>、<video>)**,严禁用 Markdown 表格/图片/链接和 Unicode 复选框符号,严禁包裹在代码块内。 - 文档新增专门「搜索结果展示」强提醒,给出错误 vs 正确 HTML 用法对照。 - 详情列说明更清晰:预览优先用 `<video>` 播放 video_url,兜底提供 preview_url 超链接。 - 购买流程及多选交互流程描述一致,所有场景都明确以原始 HTML 交互为唯一默认形态。 - 示例与表格下方操作区同步至最新交互样式,确保输出符合最新客户端渲染要求。 本版重点清理规范所有表格/预览输出格式,避免因 Markdown/Unicode 导致前端不可
v1.0.6
culturetour-skill 1.0.6 - 改变搜索结果展示为**HTML表格**,包含可点击复选框、缩略图(img)、视频预览(video)、详情等6列。 - 表格「视频预览」列默认内嵌 `<video>`,直接用 `video_url` 预览 HLS/mp4,客户端需支持 HLS(如通过 hls.js)。 - 复选和购买入口改为 HTML,选中行自动高亮,表格下方以样式块汇总选中内容。 - 禁止用 Markdown 表格或 JSON 作为首屏搜索列表,只能用标准 HTML 表格。 - 其他流程、参数和结构化 JSON 返回格式未变。
v1.0.5
culturetour-skill 1.0.5 - 支持多选:用户可批量选择素材进行统一购买请求,支持序号多选、全选、追加/取消选择。 - 表格列新增复选框(☐/☑),选中状态实时反馈,已选汇总显示条数、总时长与总大小。 - 新的用户流程:搜索 → 表格预览 → 多选 → 购买确认,替代原有单条锁定。 - 「确认购买」操作将输出包含所有已选素材详情及汇总信息的批量交易请求 JSON(未实际下单,仅供联调与后续对接)。 - 文档及交互全面更新,所有结果展示采用 Markdown 复选表,首屏不再输出纯 JSON。
v1.0.4
culturetour-skill 1.0.4 - 明确要求预览列必须用站内 HTML 播放页(preview_url),防止将 m3u8 直链错当预览入口导致下载或不可播。 - 强调 fragment_url(video_url)仅供技术核对或播放器使用,严禁作为主表格/卡片的点击链接。 - 增加「播放页与裸流」的规范说明,指导如遇预览页路径配置错误应联系后端修正,而非“凑合”用 m3u8 直链替代。 - 补充 Markdown/HTML 语法下的视频预览能力边界说明,杜绝误用图片/视频语法导致体验问题。 - 优化表格列说明和用户操作指引,避免对话中展示裸 JSON 或不易用的预览方式。
v1.0.3
culturetour-skill 1.0.3 - 搜索请求默认只取 5 条,`page_size=5`,应主动限制每次搜索结果数量。 - 强制搜索结果使用 Markdown 表格展示(选择|标题|缩略图|预览);严禁将工具/API 的原始 JSON 作为主回复。 - 补充「展示与 JSON」要求,表格为用户唯一默认视图,只有在用户明确要求时或锁定环节才输出结构化 JSON。 - MCP 工具调用参数及接口搜索请求均固定传 `page_size=5`,保持一致性。 - 文档细化智能体展示和交互流程,明确输出边界与表格形式约束,提升易用性。
Metadata
Slug culturetour-skill
Version 1.0.22
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 23
Frequently Asked Questions

What is 文旅素材搜索?

指导智能体检索文旅素材(数游神州 data0086.com)并走通「搜索 → 列表 → 预览(HLS/MP4) → 选择/购买 → Mock交易返回 → 视频下载到本地」。搜索请求默认 3条,最多 5 条(pageSize≤5),用户可要求更少;列表用表格展示(颜色徽章状态 + img + video),用户通过... It is an AI Agent Skill for Claude Code / OpenClaw, with 287 downloads so far.

How do I install 文旅素材搜索?

Run "/install culturetour-skill" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is 文旅素材搜索 free?

Yes, 文旅素材搜索 is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does 文旅素材搜索 support?

文旅素材搜索 is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created 文旅素材搜索?

It is built and maintained by F1 (@fengyily); the current version is v1.0.22.

💬 Comments