- 开发工具
- CLI
- 人工智能
- AI 应用
- 浏览器控制
- GUI 自动化
【免费下载链接】OpenCLI
Make Any Website into CLI & Use your logged-in browser by AI agent.
导读
本文面向需要在命令行中高效使用牛客网(nowcoder.com)的开发者和 AI Agent。OpenCLI 为牛客网提供了完整的 CLI 适配层(docs/adapters/browser/nowcoder.md),覆盖热搜榜单、动态流、面试经验、内推、薪资爆料、企业题库、练习进度与未读消息等 15 个命令。阅读本文后,你将掌握每条命令的参数与适用场景、公开接口与登录态接口的边界、牛客"内容帖(content)"与"动态帖(moment)"两种实体的身份区分规则,以及如何把列表命令返回的 ID 或 URL 安全地回传给详情命令。
命令总览
牛客网适配器共提供 15 条命令,全部以opencli nowcoder <command>形式调用。按功能可分为四类:
| Command | Description |
|---|---|
opencli nowcoder hot | Hot search ranking |
opencli nowcoder trending | Trending posts |
opencli nowcoder topics | Hot discussion topics |
opencli nowcoder recommend | Recommended feed |
opencli nowcoder creators | Top content creators leaderboard |
opencli nowcoder companies | Hot companies for interview prep |
opencli nowcoder jobs | Career category listing |
opencli nowcoder search <query> | Search content and moment posts (type: post/all; default: post) |
opencli nowcoder suggest <query> | Search suggestions |
opencli nowcoder experience | Interview experience posts |
opencli nowcoder referral | Internal referral posts |
opencli nowcoder salary | Salary disclosure posts |
opencli nowcoder papers | Interview question bank by company & job |
opencli nowcoder practice | Categorized practice questions with progress |
opencli nowcoder notifications | Unread 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):无需登录即可使用。从源码看,这些命令的
strategy为Strategy.PUBLIC且browser: 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 实现了完整的会话检测与身份确认流程:
- Cookie 检测:检查
https://www.nowcoder.com域名下是否存在非空的tCookie。源码注释明确指出,牛客登录态 token 就是名为t的 Cookie,而NOWCODERUID只是设备哈希,不包含可读的用户 ID。 - 用户 ID 解析:由于 Cookie 中读不到数字 UID,适配器在页面 DOM 中查找第一个
a[href*="/users/"]导航链接,用正则/\/users\/(\d+)/提取 UID。这一选择基于"导航头像链接在 DOM 顺序中位于正文推荐之前"的页面结构。 - 网关确认:随后调用
https://gw-c.nowcoder.com/api/sparta/user/profile/<uid>带 Cookie 请求,校验返回的success、data.id与data.nickname。HTTP 401/403 或返回匿名结构都会被判定为未登录并抛出AuthRequiredError。 - 命令注册:通过 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提取热搜词列表,映射为rank、title(关键词)、heat(热度值)三列:
opencli nowcoder hot --limit 10trending:热门帖子
clis/nowcoder/trending.js 请求https://gw-c.nowcoder.com/api/sparta/hot-search/top-hot-pc,从data.result映射rank、title、heat(hotValueFromDolphin)以及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>,返回rank、company、companyId。jobId通过--job传入,常用取值:11002=Java、11003=C++、11200=后端、11203=测试、11201=前端。
# C++ 方向的热门企业 opencli nowcoder companies --job 11003topics / 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:搜索范围,默认post。post只搜帖子,all同时覆盖帖子和动态,非法值会直接报错;--limit:返回条数,取值 1–50,由 clis/nowcoder/posts.js 的requirePositiveInt校验。
# 搜索 bilibili 相关的面试经验(仅帖子) opencli nowcoder search "bilibili" --type post --limit 5 # 同时搜索帖子与动态 opencli nowcoder search "字节" --type all --limit 20experience:面经列表
clis/nowcoder/experience.js 请求https://gw-c.nowcoder.com/api/sparta/home/tab/content,固定携带tabId=818、categoryType=1参数,支持--page(1–1000)与--limit(1–50)分页:
# 浏览面经流,每页 10 条 opencli nowcoder experience --page 1 --limit 10papers:企业真题题库
clis/nowcoder/papers.js 请求https://gw-c.nowcoder.com/api/sparta/company-question/get-paper-list,返回rank、title(试卷名)、company、practitioners(练习人数)四列:
--job:岗位 ID,默认11002(Java),常用值11003=C++、11200=后端、11203=QA、11201=前端;--company:企业 ID,例如139=百度、138=腾讯、239=华为;--limit:试卷数量,默认 10。
# 华为 Java 真题 opencli nowcoder papers --job 11002 --company 239practice:分类练习进度
clis/nowcoder/practice.js 请求https://gw-c.nowcoder.com/api/sparta/intelligent/getPCIntelligentList?jobId=<job>,把服务端按tags分类的题目汇总为category、subject、total、done、remaining五列:
--job:职业 ID,默认11226(软件),常用值11227=硬件、11229=产品、11230=金融;--limit:返回题目条目数,默认 20。
# 软件方向的练习进度 opencli nowcoder practice --job 11226 --limit 10notifications:未读消息汇总
clis/nowcoder/notifications.js 请求https://gw-c.nowcoder.com/api/sparta/message/pc/unread/detail,将返回值拆分为 7 行:system(系统通知)、likes(点赞)、comments(评论)、follows(关注)、messages(私信)、job_apply(职位投递)、total(总计),每行输出type与unread两列:
opencli nowcoder notificationsreferral / salary / suggest
referral(内推帖)、salary(薪资爆料)与experience结构类似,都是分页拉取指定栏目;suggest <query>则调用搜索建议接口,用于补全关键词。
关键概念:content 与 moment 双实体身份模型
牛客的帖子流中存在两种截然不同的实体,这是使用search、experience、detail时最容易踩坑的地方。clis/nowcoder/posts.js 通过服务端返回的contentType判别器区分二者,并完整映射出post_type、可回传的id、uuid、entity_id、规范url、稳定的作者字段与创建时间:
| 维度 | content(内容帖) | moment(动态帖) |
|---|---|---|
| contentType 判别值 | 250(实体类型8) | 74 |
| id 形态 | 数字 ID(如912885704667987968) | 32 位十六进制 UUID |
| 规范 URL | https://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> |
| 时间字段 | createTime | createdAt |
| 作者字段 | userBrief.userId/authorId | userBrief.userId/userId |
需要注意的身份限制(原文档明确强调,源码中亦有强校验):
- content 的 UUID 只是元数据,不能作为
/discuss/标识符使用; - moment 的数字
entity_id不被 moment 详情接口接受,moment 的详情标识只能是 UUID。
这一规则在 clis/nowcoder/posts.test.js 中有完整验证:测试同时喂入 content 与 moment 混合记录,断言id/uuid/entity_id/url与post_type一一对应,且各详情命令只清洗各自来源的正文字段(content 读richText,moment 读content)。
detail 命令的智能路由
clis/nowcoder/detail.js 的参数解析函数parseNowcoderPostTarget(clis/nowcoder/posts.js)实现了"输入即路由":
- 纯数字字符串 → 判定为 content,取
/discuss/<id>; - 32 位十六进制字符串(不区分大小写,统一转小写)→ 判定为 moment,取
/feed/main/detail/<uuid>; - URL 形式 → 强制要求
https:协议、无用户名密码、无端口、无 hash,主机名必须为nowcoder.com或www.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,杜绝"回显漂移"导致的错误数据。
输出字段与正文清洗
search、experience、detail三命令共享同一套字段投影逻辑(projectNowcoderFeed/projectNowcoderDetail)。以search为例,输出列包括:rank、post_type、id、uuid、entity_id、url、title、author、author_id、author_url、school(教育信息)、content、likes、comments、views、time(ISO 8601 时间戳);detail额外多一列location(IP 归属地)。
其中content的清洗逻辑值得关注(clis/nowcoder/posts.js):
- 剥离
<script>/<style>等不安全标签; - 将
<pre>代码块整体保护后再清洗,保留缩进与换行; <img>图片替换为alt文本,<br>、块级元素转换为换行,<li>转换为列表符号,<td>转为制表符;- 完成 HTML 实体解码(
&、&#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/code、data非对象) | CommandExecutionError |
| 服务端返回空列表 | EmptyResultError |
参数非法(空 query、错误的--type、越界的 limit/page) | ArgumentError |
| 详情身份与请求目标不一致 / 未知 contentType | CommandExecutionError |
实测排障建议:
- 报"requires a logged-in Nowcoder session":先确认 Chrome 已打开并登录 nowcoder.com,再确认 Browser Bridge 扩展已安装;
- 报"malformed"类错误:多半是牛客服务端返回结构变化,可在
-v模式下查看完整响应辅助定位; - 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所有列表命令输出的url、id、uuid均可作为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.
相关推荐
OpenCLI 36kr 适配器实战:用命令行获取 36氪热榜、快讯、搜索与正文
OpenCLI 36kr 适配器实战:用命令行获取 36氪热榜、快讯、搜索与正文 36kr 适配器是 OpenCLI「把任意网站变成 CLI」的典型示例,将 3
开发工具CLI人工智能AI 应用浏览器控制GUI 自动化OpenCLI 新浪博客适配器实战指南:用命令行热读、搜索与抓取新浪博客内容
OpenCLI 新浪博客适配器实战指南:用命令行热读、搜索与抓取新浪博客内容 导读 :本文围绕 OpenCLI 仓库中的新浪博客(Sina Blog)适配器文档
开发工具CLI人工智能AI 应用浏览器控制GUI 自动化OpenCLI Steam 适配器完全指南:用命令行查询 Steam 商店热销榜、搜索与游戏详情
OpenCLI Steam 适配器完全指南:用命令行查询 Steam 商店热销榜、搜索与游戏详情 导读 本文聚焦 OpenCLI 仓库中的 Steam 适配器(
开发工具CLI人工智能AI 应用浏览器控制GUI 自动化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考