OpenCLI V2EX 适配器实战:从公开 API 到登录态签到的完整命令行工作流
OpenCLI V2EX 适配器实战从公开 API 到登录态签到的完整命令行工作流【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI导读本文以 OpenCLI 仓库中 V2EX 适配器文档 为核心系统讲解如何通过opencli v2ex系列命令在终端中完成 V2EX 社区的全部常用操作浏览热门/最新话题、按节点与用户筛选、查看主题详情与回复、检索节点列表以及依托登录态浏览器实现每日签到、个人余额查询与未读提醒抓取。读完本文你将掌握每个命令的参数、输出列与底层实现原理能直接在终端或 AI Agent 工作流中无缝接入 V2EX 数据。命令总览V2EX 适配器共注册 11 个命令覆盖只读浏览与登录态操作两类场景命令注册代码集中在 clis/v2ex/ 目录。其中 8 个命令hot、latest、topic、node、user、member、replies、nodes直接走 V2EX 公开 API无需浏览器与登录3 个命令daily、me、notifications依赖已登录的 Chrome 与 Browser Bridge 扩展。CommandDescriptionopencli v2ex hotHot topicsopencli v2ex latestLatest topicsopencli v2ex topic idTopic detailopencli v2ex node nameTopics by nodeopencli v2ex user usernameTopics by useropencli v2ex member usernameUser profileopencli v2ex replies idTopic repliesopencli v2ex nodesAll nodes (sorted by topic count)opencli v2ex dailyDaily hotopencli v2ex meMy profile (auth required)opencli v2ex notificationsMy notifications (auth required)快速上手公开 API 命令公开命令的完整用法如下# Hot topics opencli v2ex hot --limit 5 # Browse topics in a node opencli v2ex node python # View topic replies opencli v2ex replies 1000 # Users topics opencli v2ex user Livid # User profile opencli v2ex member Livid # List all nodes opencli v2ex nodes --limit 10 # JSON output opencli v2ex hot -f json注意daily对应文档表中 Daily hot 的描述实际源码 daily.js 实现的是每日签到并领取铜币access: write与hot的每日热门含义不同属于文档描述与实现存在出入的地方实际以源码行为为准。所有命令均支持-f json或--format json输出结构化结果方便管道传递给jq或接入 Agent 工具调用。hot / latest热门与最新话题这两个命令共用同一套输出结构与取数逻辑仅 API 端点不同项hotlatestAPI 端点https://www.v2ex.com/api/topics/hot.jsonhttps://www.v2ex.com/api/topics/latest.jsonlimit 默认值2020输出列id, rank, title, node, replies, url同左从 hot.js 与 latest.js 的源码可以看到两者均声明strategy: Strategy.PUBLIC、browser: false通过 pipeline 的fetch拉取公开 API再用map将响应字段映射为表格列rank为index 1计算出的排行序号node取自item.node.title。底层 fetch 走 OpenCLI 的注册表解析机制jackwener/opencli/registry因此文档中的命令名opencli v2ex hot与源码注册的site: v2ex, name: hot一一对应。topic / replies主题详情与回复topic命令接收必填位置参数id请求https://www.v2ex.com/api/topics/show.json?idid输出列比列表类命令更完整id, title, content, member, created, node, replies, url其中created是 API 返回的 Unix 时间戳member映射为item.member.username。由于 show 接口本身就按 id 返回单条主题命令在 map 后直接{ limit: 1 }截断为一行。replies命令请求https://www.v2ex.com/api/replies/show.json?topic_idid输出floor, author, content三列floor用index 1模拟楼层号limit默认 20。这组命令适合做读帖工作流先用replies拿到楼层列表再配合topic取正文即可在终端完成 V2EX 帖子的完整阅读。node / user按维度筛选话题两个命令都复用topics/show.json端点只是查询参数不同nodenode_namename如python、javascript、apple输出rank, title, author, replies, urluserusernameusername输出rank, title, node, replies, url。二者的limit默认值均为 10且源码 help 中明确标注 API returns max 20——即 V2EX 公开 API 单次最多返回 20 条超过部分由本地{ limit }截断而非翻页拉取这是使用这两个命令时的实际边界。member / nodes用户资料与节点全景member请求https://www.v2ex.com/api/members/show.json?usernameusername输出username, tagline, website, github, twitter, location即用户主页的公开资料卡信息。nodes是唯一带排序逻辑的公开命令请求https://www.v2ex.com/api/nodes/all.json拿到全量节点后先执行{ sort: { by: topics, order: desc } }按话题数降序排序再映射为rank, name, title, topics, stars并应用limit默认 30。因此opencli v2ex nodes输出的即是按话题数排名的节点热度榜适合发现值得关注的社区板块。登录态命令前置条件与身份认证daily、me、notifications三个命令在文档中标注auth required其使用前提是Chrome 正在运行且已登录v2ex.com已安装 Browser Bridge 扩展。从源码看这三个命令均声明strategy: Strategy.COOKIE、browser: true运行时由 OpenCLI 通过 Browser Bridge 接管已登录的 Chrome 页面。登录态的身份基础是 V2EX 的A2httpOnly 会话 Cookie——这一点在 auth.js 的hasV2exAuthCookie中有明确注释A2 is V2EXs httpOnly logged-in session cookie。登录与身份校验login / whoami除文档列出的 11 个命令外auth.js 还通过registerSiteAuthCommands见 site-auth.js为 v2ex 站点注册了两个认证命令opencli v2ex login [--timeout 秒]打开https://www.v2ex.com/signin登录页默认轮询等待 300 秒DEFAULT_TIMEOUT_SECONDS 300轮询间隔 2 秒期间不断调用poll检查 A2 Cookie 是否出现登录成功返回status: login_complete与用户名opencli v2ex whoami快速探测当前会话输出logged_in, site, username三列。verifyV2exIdentity会先检查 A2 Cookie再访问首页并查找#Top a[href^/member/]顶栏链接提取用户名若链接缺失则抛出AuthRequiredError提示当前为匿名会话。这意味着登录态命令在 Cookie 失效时会得到明确的请先登录错误而非静默失败。daily每日签到领取铜币daily.js 是唯一access: write的写操作命令流程为跳转https://www.v2ex.com/mission/dailyCloudflare 挑战等待循环最多 5 次、每次间隔 1.5 秒检测页面标题是否包含Just a moment若仍处于挑战页则继续等待直到标题不再匹配在页面内查找input.super.normal.button按钮若按钮不存在或其 value 不含领取判定为今日奖励已发/无需领取否则从按钮onclick属性中用正则/once(\d)/提取一次性 token跳转https://www.v2ex.com/mission/daily/redeem?oncetoken完成签到等待 3 秒重定向后再次探测按钮若按钮消失则读取a.balance_area的余额文本返回 签到成功 / 当前余额若按钮仍在则返回签到失败提示。命令最终输出status, message两列。整个流程的失败分支找不到 once token、无法确认结果都会抛出带调试信息的CommandExecutionError方便在OPENCLI_VERBOSE1环境下定位问题。me个人资料与余额me.js 跳转https://www.v2ex.com/首页同样先做 Cloudflare 等待然后通过 DOM 提取username从a.top顶栏链接数组取第二项首页之后的用户名链接失败时回退到a[href^/member/]balancea.balance_area链接的文本节点内容unread_notifications从a[href/notifications]的文本中用/(\d)\s*未读提醒/正则提取数字daily_reward_ready检测是否存在a[href^/mission/daily]且文本包含领取今日的登录奖励。输出列固定为username, balance, unread_notifications, daily_reward_ready。若用户名无法识别未登录或 Cookie 失效会抛出提示请先登录 V2EX的CommandExecutionError。notifications未读提醒列表notifications.js 跳转https://www.v2ex.com/notifications并固定等待 1.5 秒源码注释说明waitForLoadState不够可靠随后解析#Main .box .cell[id^n_]节点根据文本关键词分类关键词输出 type回复了你回复感谢了你感谢收藏了你收藏提及你提及其他通知内容优先取.payload节点回复正文无 payload 时回退为清洗后的整段文本并剥离时间戳时间取自.snow节点。输出列type, content, timelimit默认 20。应用场景与工作流建议结合公开 API 与登录态命令可以搭建典型的 V2EX 终端工作流信息监控opencli v2ex hot -f json输出结构化热门榜可定时执行并做关键词过滤例如跟踪某个节点或某类技术话题帖子阅读opencli v2ex topic id取正文 opencli v2ex replies id取楼层形成完整的读帖链路用户画像opencli v2ex user Livid看发帖史opencli v2ex member Livid看资料卡GitHub、Twitter、个人站日常签到opencli v2ex login完成一次登录后opencli v2ex me检查余额与未读opencli v2ex daily领取铜币再opencli v2ex notifications处理提醒——四个命令即可覆盖 V2EX 的每日例行操作。实现原理小结从源码结构看V2EX 适配器呈现清晰的分层设计公开 API 命令采用声明式 pipelinefetch → map → limit/sort由 registry 统一解析执行适合数据读取登录态命令采用命令式func(page)直接驱动浏览器配合Strategy.COOKIE与 Browser Bridge 复用已登录会话。这种公开数据走 API、私有数据走浏览器的双通道设计正是 V2EX 适配器文档 中Prerequisites一节所描述架构的落地实现也是理解 OpenCLI 大量站点适配器如 zhihu、xiaohongshu通用模式的范本。【免费下载链接】OpenCLIMake Any Website into CLI Use your logged-in browser by AI agent.项目地址: https://gitcode.com/gh_mirrors/ope/OpenCLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考