ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OpenCLI Medium 适配器实战:四命令打通 feed / search / user / tag 的混合模式抓取

OpenCLI Medium 适配器实战:四命令打通 feed / search / user / tag 的混合模式抓取 OpenCLI Medium 适配器实战四命令打通 feed / search / user / tag 的混合模式抓取【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI本篇技术指南聚焦 OpenCLI 开源仓库中的 Medium 站点适配器系统讲解opencli medium的四个核心命令——feed热门 Feed、search关键词搜索、user用户文章、tag标签 RSS——的用法、输出列、参数约束与底层实现原理。读完本文你将掌握如何在已登录浏览器Browser Bridge与无浏览器公共 RSS两种模式下获取 Medium 内容并理解适配器注册、Strategy 策略与页面抽取逻辑的源码级细节。适配器概览 Mixed 模式Medium 适配器在 docs/adapters/browser/medium.md 中定义其运行模式为 Mixed混合模式域名锁定为medium.com。混合模式的含义是同属一个站点的命令并不共享同一种数据获取方式而是按数据源特点分别选择浏览器渲染抽取或公共接口直取Command说明数据获取方式opencli medium feed获取 Medium 热门文章可按话题topic限定范围Browser Bridge需要已登录浏览器opencli medium search按关键词搜索 Medium 文章Browser Bridge需要已登录浏览器opencli medium user获取某个用户的近期文章Browser Bridge需要已登录浏览器opencli medium tag tag获取某 Medium 标签的最新文章公共 RSS无需浏览器直接请求公共 RSS其中feed、search、user三个命令在注册时声明为Strategy.COOKIE策略必须携带已登录的浏览器上下文访问medium.com而tag命令声明为Strategy.PUBLIC且显式设置browser: false直接通过fetch请求medium.com/feed/tag/tag的公开 RSS 源完成抓取是四个命令中速度最快、依赖最少的一个。前置条件opencli medium search与opencli medium tag无需浏览器即可运行前者通过页面 URL 拼接与渲染页抓取后者直接解析medium.com/feed/tag/tag的 RSS XML。opencli medium feed与opencli medium user需要Browser Bridge能够访问medium.com即本地需运行已登录的浏览器桥接服务命令执行时会在该浏览器上下文中打开对应页面并抽取文章数据。命令详解与使用示例以下示例与官方文档保持一致可直接在终端中运行。# 获取 Medium 通用热门 Feed默认返回 20 条 opencli medium feed --limit 10 # 按关键词搜索文章 opencli medium search ai # 获取某个用户的近期文章username 与 username 写法均可 opencli medium user username # 以 JSON 格式输出某话题的 Feed opencli medium feed --topic programming -f json # 获取某个标签的最新文章公共 RSS无需浏览器速度最快 opencli medium tag programming --limit 10 opencli medium tag artificial-intelligence --limit 20opencli medium feed热门 Feed可限定话题feed命令注册于 clis/medium/feed.js支持两个参数参数类型默认值说明topicstring空话题标签如technology、programming、ailimitint20返回的文章数量未指定topic时工具函数buildMediumTagUrl会回退到https://medium.com/tag/technology这个默认话题页指定后则拼接为https://medium.com/tag/topic。输出列为rank, title, author, date, readTime, claps。opencli medium search关键词搜索search命令注册于 clis/medium/search.js参数为参数类型必填说明keywordstring是位置参数搜索关键词limitint否默认 20返回的文章数量该命令通过buildMediumSearchUrl拼接https://medium.com/search?qkeyword关键词经encodeURIComponent编码输出列比feed多出url字段rank, title, author, date, readTime, claps, url。opencli medium user用户文章列表user命令注册于 clis/medium/user.js参数为参数类型必填说明usernamestring是位置参数Medium 用户名username与username均可limitint否默认 20返回的文章数量注意buildMediumUserUrl对用户名做了归一化若已以开头则直接拼接https://medium.com/username否则补上变成https://medium.com/username因此两种写法都能正确命中用户主页。输出列为rank, title, date, readTime, claps, url不含 author。opencli medium tag tag标签 RSS无浏览器tag命令注册于 clis/medium/tag.js是四个命令中唯一走公共 RSS 通道、完全不需要浏览器的命令。参数为参数类型必填说明tagstring是位置参数小写标签 slug如programming、machine-learninglimitint否默认 20上限 25最大返回条数受限于单个 RSS 页opencli medium tag programming --limit 10 opencli medium tag artificial-intelligence --limit 20tag命令输出列说明输出列为rank, title, author, description, categories, published, url各字段语义如下descriptionRSS 中完整的description内容不会被静默截断若只想预览可自行通过管道交给head处理categories将每个条目中所有category块解析出来用逗号拼接而成的 Medium 标签列表published当pubDate可用时转换自原始pubDate的 ISO 字符串。tag命令的标签格式约束源码requireTag使用正则/^[a-z0-9][a-z0-9-]*$/i校验标签必须是小写字母或数字开头可含连字符的 slug非法输入会抛出参数错误例如不能带空格或大写字符的 URL 编码形式。limit则通过requireBoundedInt限制在正整数且不超过 25——因为 Medium 单个 RSS 页本身只提供固定数量的条目超出上限没有意义。输出处理与字段解析原理浏览器类命令feed / search / user共用 clis/medium/utils.js 中的loadMediumPosts页面抽取逻辑其工作原理值得展开打开目标页并等待渲染page.goto(url)进入页面后先wait({ selector: article, timeout: 5 })等待文章节点出现再在页面内延迟 3 秒等待懒加载内容就绪。逐条抽取文章卡片遍历页面中所有article元素取h2 / h3 / h1作为标题通过标题元素的closest(a)或a[href*/], a[href*/p/]定位文章链接相对链接统一补齐为https://medium.com开头的绝对地址。去重与字段提取用Set对 URL 去重author 取自a[href^/]中非标题的文本日期优先取time标签的文本或datetime属性缺失时回退到Dec 3或3d ago这类文本模式匹配阅读时长通过(\d)\s*min\s*read正则提取claps通过(\d(?:\.\d)?[KkMm]?)\s*claps?提取支持 K/M 缩写。描述截断描述文本取h3 / p中首个非标题非作者的段落并截断到 150 个字符这是浏览器类命令唯一的分寸截断与tag命令完整保留 description的行为不同。limit在浏览器类命令中会被钳制到150之间Math.max(1, Math.min(limit, 50))超出范围的值按边界处理而不是直接报错。tag命令的 RSS 解析细节tag命令则走完全不同的解析管线clis/medium/tag.js请求https://medium.com/feed/tag/tag携带user-agent: opencli-medium-adapter与accept: application/rssxml, application/xml请求头用正则/ item[^]*([\s\S]*?)\/item /g切分出每个 RSS 条目块每个字段的解析同时兼容 CDATA 包裹与纯文本两种写法extractTag先匹配![CDATA[...]]失败再回退普通标签匹配内建 HTML 实体解码表amp;、lt;、gt;、quot;、apos;、#39;、nbsp;以及#xHH;/#NNN;数字实体解码categories通过遍历所有category块同样兼容 CDATA收集后以,拼接published经isoDateFromRfc822将 RFC 822 格式的pubDate解析为YYYY-MM-DD的 ISO 日期字符串。模式背后的注册机制Strategy 与 browser 标志以上两种模式的分流并非魔法而是由 src/registry.ts 中的策略枚举驱动export enum Strategy { PUBLIC public, LOCAL local, COOKIE cookie, INTERCEPT intercept, UI ui, }注册表中browser字段的默认推导逻辑是strategy ! PUBLIC strategy ! LOCAL时默认需要浏览器。因此tag命令同时显式声明了strategy: Strategy.PUBLIC与browser: falsefunc签名即无page参数的非浏览器函数而feed / search / user声明为Strategy.COOKIE其func首参即为浏览器page对象执行时由 Browser Bridge 提供已登录上下文。这套机制同样适用于仓库中其他站点适配器理解 Medium 适配器等于理解了 OpenCLI 适配器体系的公共骨架。边界处理与错误语义从源码可以看到适配器对异常路径做了明确处理HTTP 404tag命令遇到 RSS 不存在时抛出EmptyResultError提示Medium tag 不存在其他非 2xx抛出CommandExecutionError附带 HTTP 状态码网络失败fetch异常被捕获后包装为CommandExecutionError并提示检查medium.com是否可达空 FeedRSS 拉取成功但无item条目时同样抛EmptyResultError缺失浏览器会话loadMediumPosts在没有page对象时直接抛出CommandExecutionErrorBrowser session required for medium posts明确告知浏览器类命令的前提条件。这些错误类型ArgumentError、CommandExecutionError、EmptyResultError来自jackwener/opencli/errors是 OpenCLI 适配器的标准错误体系便于上层 CLI 统一呈现与 Agent 自动修复autoresearch 模块可据此重试。实战建议优先用tag做轻量抓取需要跟踪某个技术话题如machine-learning、artificial-intelligence的最新文章时opencli medium tag tag无需浏览器、延迟最低且description字段完整适合喂给下游 NLP 或信息聚合管线。用feed做话题监控配合--topic与-f json可把热门 Feed 转成结构化 JSON 供脚本消费。用user追踪作者动态传入username即可拿到该作者最新文章的标题、日期、阅读时长与 claps。限制结果规模浏览器类命令 limit 上限为 50tag上限为 25规划抓取量时需注意单次命令的吞吐边界。组合head预览tag输出的description为完整 RSS 描述长文本可用opencli medium tag tag | head快速预览。参考实现适配器文档docs/adapters/browser/medium.md命令实现clis/medium/feed.js、clis/medium/search.js、clis/medium/user.js、clis/medium/tag.js共享工具clis/medium/utils.jsURL 构造与页面抽取注册机制src/registry.tsStrategy 枚举与 cli() 注册接口【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进