案例二:万象云档书目速查

万象云档书目速查是把一个现有内容站点(wanxiangyundang.top,一个 BookStack 电子书站点)做成 GenUI 小工具的实战。它最大的价值在于演示了「已有网站如何合规地变成小工具」——答案是内置数据快照,而不是套壳跳转。

起点:一个被否决的直觉

最初诉求是「把网站直接做成小工具」。但平台明确禁止外链 / iframe / 跳转(development-rules),「直接打开网站」被判违规。于是路线调整为:把网站的核心数据抓成快照,在本地做搜索/筛选,结果以「复制链接」交付给用户。

数据通道:能用的源

站点没有公开的 REST API(/api/* 会 302 跳登录需 token)。可用数据源是:

  • sitemap/books-0.xml:约 2960 条图书 URL;
  • 分类探索页 /explore?cid=X&page=N:每页 24 本,a.book-card 上的 title 属性带书名。

据此写了抓取脚本,产出一份离线快照 data.json:15 个分类 × 前 30 本 = 440 本,约 29.8KB,直接打进产物。

形态 A 骨架照搬

小工具采用形态 A(画布 + 操作区):照搬官方 layout.html 骨架,搜索框与分类 chips 放在操作区,主画布展示书目列表。顶部表头用 cos-icon 图标(如 cos-icon-refresh 做重置、cos-icon-info-source 做功能说明 tooltip)。

关键合规写法:剪贴板复制

用户点某本图书时,工具不跳转,而是把该书直达链接写入剪贴板,由用户自行去浏览器粘贴打开:

function copyBook(slug, name) {
    var url = SITE + '/books/' + slug;
    sendLog('custom');
    if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
        navigator.clipboard.writeText(url).then(function () { done(true); });
    }
}

这里用到了第三章讲的两点:剪贴板写入合规(读取才被禁) + sendLog 调用前判存在性。

验证

  • genui check 通过(exit 0);
  • genui preview 起端口,用无头 Edge 截图核对布局正常;
  • cos-icon 在平台外显示为方块属正常现象,不影响平台内渲染。

边界说明

快照是「离线书目速查」,数据不含站内全文,且需定期刷新(站点上新后重新抓取快照)。它解决的是「快速找到某本书的直达链接」,而不是「在小工具里读完整本书」——后者本就不是小工具的定位。

小结

万象云档案例证明:已有网站做成小工具的正确姿势 = 内置数据快照 + 本地搜索筛选 + 剪贴板交付,而不是套壳外链。这条路线可复制到任何「内容检索类」需求。