跳过正文
  1. 技术学习/

知乎收藏夹 Pro:用 AI 辅助整理知乎收藏

·2017 字·5 分钟· loading · loading · ·
目录
我的开源项目 - 这篇文章属于一个选集。
§ 1: 本文

知乎收藏夹 Pro:用 AI 辅助整理知乎收藏
#

常年刷知乎收藏的内容越来越多,随手丢进默认文件夹之后懒没有整理过……时间一长成屎山了……,查找特定类别变得困难。于是搓了一个脚本尝试解决这个问题,花了两天迭代三十多次,在Gemini的大力支持下达成了一个比较满意的效果……

主要功能
#

1. 为收藏夹生成描述
#

如果一个收藏夹里存放了大量文章,可能很难记清它的主要内容。这个功能可以帮助快速生成一个概括性的描述。

在收藏夹页面,脚本会添加一个按钮。点击后,它会读取当前页面上文章的标题和部分内容,然后调用 AI 生成一段描述。用户可以修改这段描述,确认后保存。

为收藏夹生成描述功能
点击“生成描述”按钮,AI 会自动总结收藏夹内容。

2. 智能整理收藏夹
#

这是脚本的核心功能,用于将文章从一个收藏夹自动分类到其他收藏夹。

用户首先需要选择一个或多个“源收藏夹”(待整理的)和“目标收藏夹”(分类目的地)。脚本会依次处理源收藏夹中的每篇文章,通过 AI 判断它最适合哪个目标收藏夹,然后执行移动操作。 移动等操作用到了从网页端分析获得的api端口,应该速度还可以。 这个过程包含几个辅助设计:

  • 试运行 (Dry Run):这是一个安全选项。勾选后,脚本只会分析并报告每篇文章建议的移动路径,不会真的移动文件。用户可以先查看 AI 的分类结果是否合理。
  • 进度仪表盘:整理过程是可视的。界面会显示一个仪表盘,包含图表和日志,用于展示整理进度、分类统计和每一项操作的详细记录。
  • 可筛选的日志:用户可以通过点击图表来筛选日志,方便查看特定分类的操作历史。
  • 撤销功能:所有被移动的文章都可以在日志中单独撤销,将文章移回原处。

整理收藏夹功能
点击“智能整理”按钮
整理收藏夹功能
选择填写弹出界面中的选项
整理收藏夹功能
界面转变成仪表盘

技术实现
#

1. 为什么用油猴脚本?
#

使用 Tampermonkey作为平台主要有以下几个原因:

  • 直接操作页面:脚本可以直接在知乎页面上运行,方便地添加按钮、窗口等 UI 元素。
  • 利用现有登录状态:脚本执行时,浏览器会自动携带用户的登录 Cookie。这意味着在调用知乎需要登录权限的 API(如添加或删除收藏)时,不需要额外处理复杂的登录和验证流程。
  • 绕过 API 签名:知乎的一些内容接口有 x-zse-96 签名保护,在前端脚本中逆向很困难。通过使用油猴提供的 GM_xmlhttpRequest,可以直接请求页面的 HTML,从而获取内容,绕开了调用这些受保护接口的需要,同时也降低了被封号的风险。

2. “生成描述”的流程
#

这个功能的实现分为三步:

  1. 数据采集:脚本遍历当前页面上的文章元素,提取标题和正文。如果内容被折叠,会模拟点击“展开”按钮。
  2. 构建 Prompt 并调用 AI:将采集到的文本数据整理后,发送给 AI,要求它生成一段总结性的文字。
  3. 应用更改:用户确认后,脚本通过知乎的官方 API (PUT /api/v4/collections/{id}) 来更新收藏夹的描述。

3. “智能整理”的技术细节
#

比较复杂的部分,它的工作流程如下:

a. 获取文章列表
#

首先需要拿到源收藏夹里的所有文章。通过分析网络请求,可以发现知乎有一个分页 API (/api/v4/collections/{collectionId}/items),通过循环调用这个 API 就可以获取完整的文章列表。

b. 抓取文章正文
#

拿到文章链接后,需要获取其正文内容以供 AI 分析。直接调用内容 API 不太可行,有签名限制。这里的解决方法是:

使用 GM_xmlhttpRequest 来请求每个文章链接的 HTML 全文。这是一个油猴脚本的特有函数,可以实现跨域的异步网络请求。

获取到 HTML 文本后,使用浏览器内置的 DOMParser API 将其转换为 DOM 对象,然后就可以用 querySelector 轻松提取出正文所在的元素(.RichText.ztext)了。

c. 并发控制
#

如果短时间内对大量文章发起请求,可能会被限制。为了避免这个问题,实现了一个简单的并发控制逻辑。

const taskQueue = [...all_articles];
const CONCURRENCY = 3; // 设置同时运行的任务数量

async function worker() {
    while (taskQueue.length > 0) {
        const task = taskQueue.shift(); // 从队列头部取一个任务
        await processTask(task); // 执行任务(抓取、分析、移动)
    }
}

// 启动 3 个 "worker" 并行处理任务
for (let i = 0; i < CONCURRENCY; i++) {
    worker();
}

这样可以保证脚本以一个稳定的速率执行任务。

d. 可视化界面
#

为了让整理过程可视化程度更高,用 Chart.js 这个库来制作图表,展示任务状态和分类结果。图表和日志列表是联动的,点击图表可以筛选日志,方便查看自己关心的信息。 不过Chart.js好像有缩放bug,ctrl+shift+移动滚轮有惊喜

后续计划
#

目前脚本功能已经可用,但还有一些可以改进的地方:

-[] 界面优化:适配知乎的夜间模式 -[] 增加模型选项:允许用户选择不同的 AI 模型,同时优化prompt生成,目前的版本还是有点费tokens -[] 功能扩展:一个长远的想法是尝试替换知乎原生的收藏按钮,简化收藏流程,在收藏时就介入AI分类建议 -[] 修复bug:已知的包括一篇文章处于多个收藏夹时会重复POST、左下类别太多时坐标y轴会显示不完整…… -[] 拓展平台csdn等文字平台也有类似的问题,不过还没成屎山就先放放……视频平台收藏分类管理得还不错,就算了先~

FINAL
#

这个脚本是一个临时起意的idea,目的是解决自己在使用知乎时遇到的一个具体问题,自我感觉还挺实用的……

查看源码 Greasy Fork 安装

Reply by Email
我的开源项目 - 这篇文章属于一个选集。
§ 1: 本文