OpenCLI 牛客网适配器实战指南:从热榜搜索到面试题库的命令行一体化
2026/9/20 6:40:09 网站建设 项目流程
  • 开发工具
  • CLI
  • 人工智能
  • AI 应用
  • 浏览器控制
  • GUI 自动化

【免费下载链接】OpenCLI

Make Any Website into CLI & Use your logged-in browser by AI agent.

项目地址:https://gitcode.com/gh_mirrors/ope/OpenCLI
点击查看免费下载

导读

本文面向需要在命令行中高效使用牛客网(nowcoder.com)的开发者和 AI Agent。OpenCLI 为牛客网提供了完整的 CLI 适配层(docs/adapters/browser/nowcoder.md),覆盖热搜榜单、动态流、面试经验、内推、薪资爆料、企业题库、练习进度与未读消息等 15 个命令。阅读本文后,你将掌握每条命令的参数与适用场景、公开接口与登录态接口的边界、牛客"内容帖(content)"与"动态帖(moment)"两种实体的身份区分规则,以及如何把列表命令返回的 ID 或 URL 安全地回传给详情命令。

命令总览

牛客网适配器共提供 15 条命令,全部以opencli nowcoder <command>形式调用。按功能可分为四类:

CommandDescription
opencli nowcoder hotHot search ranking
opencli nowcoder trendingTrending posts
opencli nowcoder topicsHot discussion topics
opencli nowcoder recommendRecommended feed
opencli nowcoder creatorsTop content creators leaderboard
opencli nowcoder companiesHot companies for interview prep
opencli nowcoder jobsCareer category listing
opencli nowcoder search <query>Search content and moment posts (type: post/all; default: post)
opencli nowcoder suggest <query>Search suggestions
opencli nowcoder experienceInterview experience posts
opencli nowcoder referralInternal referral posts
opencli nowcoder salarySalary disclosure posts
opencli nowcoder papersInterview question bank by company & job
opencli nowcoder practiceCategorized practice questions with progress
opencli nowcoder notificationsUnread message summary
opencli nowcoder detail <id>Content or moment detail (numeric ID, UUID, or canonical URL)

使用示例

以下示例覆盖了适配器的主要使用方式,可直接复制运行:

# Hot search ranking opencli nowcoder hot --limit 10 # Search for interview experiences opencli nowcoder search "bilibili" --type post --limit 5 # Search suggestions opencli nowcoder suggest "java" # Browse interview experience posts opencli nowcoder experience --limit 10 # View a specific post detail (use the ID or URL returned by list commands) opencli nowcoder detail 912885704667987968 # Interview question bank for Java at Huawei opencli nowcoder papers --job 11002 --company 239 # Practice questions for software development opencli nowcoder practice --job 11226 --limit 10 # Hot companies for C++ positions opencli nowcoder companies --job 11003 # JSON output opencli nowcoder trending -f json # Verbose mode opencli nowcoder hot -v

其中-f json输出结构化 JSON(便于脚本与 Agent 解析),-v开启详细日志,--limit控制返回条数。

前置条件:公开命令与 Cookie 命令的边界

牛客网适配器将命令划分为两种访问策略,前置条件完全不同:

  • Public commands(hot、trending、topics、recommend、creators、companies、jobs):无需登录即可使用。从源码看,这些命令的strategyStrategy.PUBLICbrowser: false(见 clis/nowcoder/hot.js、clis/nowcoder/trending.js),直接通过 HTTP 拉取公开网关接口,不依赖浏览器。
  • Cookie commands(其余全部命令):需要 Chrome 正在运行并已登录 nowcoder.com,且安装了 Browser Bridge 扩展(扩展安装与桥接原理见 docs/guide 目录)。

为什么需要 Browser Bridge?因为牛客的登录态绑定在浏览器 Cookie 中。适配器复用 AI Agent 已登录的浏览器会话,通过桥接扩展在页面上下文中执行请求,从而带上credentials: 'include'的会话凭证,无需单独管理账号密码。

登录身份验证机制:Cookiet与用户身份探针

对于需要登录的命令,clis/nowcoder/auth.js 实现了完整的会话检测与身份确认流程:

  1. Cookie 检测:检查https://www.nowcoder.com域名下是否存在非空的tCookie。源码注释明确指出,牛客登录态 token 就是名为t的 Cookie,而NOWCODERUID只是设备哈希,不包含可读的用户 ID。
  2. 用户 ID 解析:由于 Cookie 中读不到数字 UID,适配器在页面 DOM 中查找第一个a[href*="/users/"]导航链接,用正则/\/users\/(\d+)/提取 UID。这一选择基于"导航头像链接在 DOM 顺序中位于正文推荐之前"的页面结构。
  3. 网关确认:随后调用https://gw-c.nowcoder.com/api/sparta/user/profile/<uid>带 Cookie 请求,校验返回的successdata.iddata.nickname。HTTP 401/403 或返回匿名结构都会被判定为未登录并抛出AuthRequiredError
  4. 命令注册:通过 clis/_shared/site-auth.js 的registerSiteAuthCommands注册whoami等通用认证命令,登录页指向https://www.nowcoder.com/login

因此首次使用 Cookie 命令前,请确保浏览器已打开 nowcoder.com 并保持登录态;若会话过期,命令会明确报出"requires a logged-in Nowcoder session"。

公开命令详解(无需登录)

hot:热搜榜单

clis/nowcoder/hot.js 请求https://gw-c.nowcoder.com/api/sparta/hot-search/hot-content,从data.hotQuery提取热搜词列表,映射为ranktitle(关键词)、heat(热度值)三列:

opencli nowcoder hot --limit 10

trending:热门帖子

clis/nowcoder/trending.js 请求https://gw-c.nowcoder.com/api/sparta/hot-search/top-hot-pc,从data.result映射ranktitleheathotValueFromDolphin)以及id(优先取uuid,缺省回退到id)。返回的id可直接用于detail命令:

opencli nowcoder trending --limit 10 opencli nowcoder trending -f json # 结构化输出

companies:企业热度榜

clis/nowcoder/companies.js 请求https://gw-c.nowcoder.com/api/sparta/company-question/hot-company-list?jobId=<job>,返回rankcompanycompanyIdjobId通过--job传入,常用取值:11002=Java、11003=C++、11200=后端、11203=测试、11201=前端。

# C++ 方向的热门企业 opencli nowcoder companies --job 11003

topics / recommend / creators / jobs

topics(热议话题)、recommend(推荐流)、creators(内容创作者榜)、jobs(职业分类)同为公开命令,用法一致,均支持--limit控制条数。这类命令适合在未登录环境下快速了解牛客社区当前的热点与风向。

Cookie 命令详解(需登录)

search:混合内容搜索

clis/nowcoder/search.js 是适配器中最复杂的命令之一,向https://gw-c.nowcoder.com/api/sparta/pc/search发起 POST 请求,请求体为{ query, type, page: 1, pageSize: limit }

  • query(位置参数,必填):搜索关键词,非空校验由ArgumentError保证;
  • --type post|all:搜索范围,默认postpost只搜帖子,all同时覆盖帖子和动态,非法值会直接报错;
  • --limit:返回条数,取值 1–50,由 clis/nowcoder/posts.js 的requirePositiveInt校验。
# 搜索 bilibili 相关的面试经验(仅帖子) opencli nowcoder search "bilibili" --type post --limit 5 # 同时搜索帖子与动态 opencli nowcoder search "字节" --type all --limit 20

experience:面经列表

clis/nowcoder/experience.js 请求https://gw-c.nowcoder.com/api/sparta/home/tab/content,固定携带tabId=818categoryType=1参数,支持--page(1–1000)与--limit(1–50)分页:

# 浏览面经流,每页 10 条 opencli nowcoder experience --page 1 --limit 10

papers:企业真题题库

clis/nowcoder/papers.js 请求https://gw-c.nowcoder.com/api/sparta/company-question/get-paper-list,返回ranktitle(试卷名)、companypractitioners(练习人数)四列:

  • --job:岗位 ID,默认11002(Java),常用值11003=C++、11200=后端、11203=QA、11201=前端;
  • --company:企业 ID,例如139=百度、138=腾讯、239=华为;
  • --limit:试卷数量,默认 10。
# 华为 Java 真题 opencli nowcoder papers --job 11002 --company 239

practice:分类练习进度

clis/nowcoder/practice.js 请求https://gw-c.nowcoder.com/api/sparta/intelligent/getPCIntelligentList?jobId=<job>,把服务端按tags分类的题目汇总为categorysubjecttotaldoneremaining五列:

  • --job:职业 ID,默认11226(软件),常用值11227=硬件、11229=产品、11230=金融;
  • --limit:返回题目条目数,默认 20。
# 软件方向的练习进度 opencli nowcoder practice --job 11226 --limit 10

notifications:未读消息汇总

clis/nowcoder/notifications.js 请求https://gw-c.nowcoder.com/api/sparta/message/pc/unread/detail,将返回值拆分为 7 行:system(系统通知)、likes(点赞)、comments(评论)、follows(关注)、messages(私信)、job_apply(职位投递)、total(总计),每行输出typeunread两列:

opencli nowcoder notifications

referral / salary / suggest

referral(内推帖)、salary(薪资爆料)与experience结构类似,都是分页拉取指定栏目;suggest <query>则调用搜索建议接口,用于补全关键词。

关键概念:content 与 moment 双实体身份模型

牛客的帖子流中存在两种截然不同的实体,这是使用searchexperiencedetail时最容易踩坑的地方。clis/nowcoder/posts.js 通过服务端返回的contentType判别器区分二者,并完整映射出post_type、可回传的iduuidentity_id、规范url、稳定的作者字段与创建时间:

维度content(内容帖)moment(动态帖)
contentType 判别值250(实体类型874
id 形态数字 ID(如91288570466798796832 位十六进制 UUID
规范 URLhttps://www.nowcoder.com/discuss/<id>https://www.nowcoder.com/feed/main/detail/<uuid>
详情接口/api/sparta/detail/content-data/detail/<id>/api/sparta/detail/moment-data/detail/<uuid>
时间字段createTimecreatedAt
作者字段userBrief.userId/authorIduserBrief.userId/userId

需要注意的身份限制(原文档明确强调,源码中亦有强校验):

  • content 的 UUID 只是元数据,不能作为/discuss/标识符使用
  • moment 的数字entity_id不被 moment 详情接口接受,moment 的详情标识只能是 UUID。

这一规则在 clis/nowcoder/posts.test.js 中有完整验证:测试同时喂入 content 与 moment 混合记录,断言id/uuid/entity_id/urlpost_type一一对应,且各详情命令只清洗各自来源的正文字段(content 读richText,moment 读content)。

detail 命令的智能路由

clis/nowcoder/detail.js 的参数解析函数parseNowcoderPostTarget(clis/nowcoder/posts.js)实现了"输入即路由":

  1. 纯数字字符串 → 判定为 content,取/discuss/<id>
  2. 32 位十六进制字符串(不区分大小写,统一转小写)→ 判定为 moment,取/feed/main/detail/<uuid>
  3. URL 形式 → 强制要求https:协议、无用户名密码、无端口、无 hash,主机名必须为nowcoder.comwww.nowcoder.com,路径必须匹配/discuss/<数字>/feed/main/detail/<32位uuid>;否则抛出ArgumentError

因此以下三种调用等价:

opencli nowcoder detail 912885704667987968 opencli nowcoder detail https://www.nowcoder.com/discuss/912885704667987968 opencli nowcoder detail 24e01f1d510a486b92efa795b4835669 # moment UUID

同时适配器做了防御性校验(tests 中明确覆盖):请求返回后,若详情数据中的实体类型、身份与请求目标不一致,会抛出CommandExecutionError,杜绝"回显漂移"导致的错误数据。

输出字段与正文清洗

searchexperiencedetail三命令共享同一套字段投影逻辑(projectNowcoderFeed/projectNowcoderDetail)。以search为例,输出列包括:rankpost_typeiduuidentity_idurltitleauthorauthor_idauthor_urlschool(教育信息)、contentlikescommentsviewstime(ISO 8601 时间戳);detail额外多一列location(IP 归属地)。

其中content的清洗逻辑值得关注(clis/nowcoder/posts.js):

  • 剥离<script>/<style>等不安全标签;
  • <pre>代码块整体保护后再清洗,保留缩进与换行;
  • <img>图片替换为alt文本,<br>、块级元素转换为换行,<li>转换为列表符号,<td>转为制表符;
  • 完成 HTML 实体解码(&amp;&#x…;&#…;等)。

测试用例(clis/nowcoder/posts.test.js)验证了包含<h2>、有序列表、<pre>、图片alt<script>的富文本最终被清洗为结构清晰、可被 LLM 直接消费的纯文本。

错误处理与排障速查

适配器的错误处理非常工程化(见 clis/nowcoder/posts.js 与 clis/nowcoder/posts.test.js):

场景抛出的异常
未登录 / Cookie 缺失 / HTTP 401、403 / code 999 "need login"AuthRequiredError
返回包结构损坏(无success/codedata非对象)CommandExecutionError
服务端返回空列表EmptyResultError
参数非法(空 query、错误的--type、越界的 limit/page)ArgumentError
详情身份与请求目标不一致 / 未知 contentTypeCommandExecutionError

实测排障建议:

  1. 报"requires a logged-in Nowcoder session":先确认 Chrome 已打开并登录 nowcoder.com,再确认 Browser Bridge 扩展已安装;
  2. 报"malformed"类错误:多半是牛客服务端返回结构变化,可在-v模式下查看完整响应辅助定位;
  3. detail 返回身份不匹配:检查传入的 ID 是否来自列表命令输出,content 用数字 ID、moment 用 UUID,不要混用。

一个完整的工作流示例

将以上命令串联,即可实现"发现问题 → 深入阅读 → 沉淀到题库"的完整闭环:

# 1. 先看热搜,捕捉当前热点 opencli nowcoder hot --limit 10 # 2. 搜索目标公司面经 opencli nowcoder search "字节跳动 面经" --type all --limit 20 # 3. 打开某篇详情(id 直接取自列表输出) opencli nowcoder detail https://www.nowcoder.com/discuss/912885704667987968 # 4. 查看该岗位的真题与练习进度 opencli nowcoder papers --job 11002 --company 239 opencli nowcoder practice --job 11226 --limit 20 # 5. 检查是否有新的内推机会 opencli nowcoder referral --limit 10

所有列表命令输出的urliduuid均可作为detail的合法输入,配合-f json输出,AI Agent 可以无歧义地完成"浏览→抓取→总结"的自动化流水线。

小结

OpenCLI 的牛客网适配器是"网站 CLI 化"的典型样本:公开接口直连网关、登录接口复用浏览器会话、双实体身份模型严格校验、正文内容安全清洗。掌握本文内容后,你既可以在终端中零配置地浏览牛客热榜与企业题库,也可以让 AI Agent 借助稳定的post_type/id/url契约,安全、可回放地消费牛客社区内容。源码与测试分布在 clis/nowcoder/ 目录(核心逻辑见 posts.js,契约验证见 posts.test.js),可作为进一步扩展或排查问题的第一手依据。

  • 开发工具
  • CLI
  • 人工智能
  • AI 应用
  • 浏览器控制
  • GUI 自动化

【免费下载链接】OpenCLI

Make Any Website into CLI & Use your logged-in browser by AI agent.

项目地址:https://gitcode.com/gh_mirrors/ope/OpenCLI
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询