核桃 OJ for VS Code
在 VS Code 里刷核桃OJ:浏览题目 / 题单 / 比赛,用本地文件写代码,一键提交并直接看到评测结果与测试点明细。
这是一个第三方非官方扩展,与核桃编程官方无关。
功能
- 题目:列表浏览、关键词搜索、难度与通过率展示,点击打开题面
- 题单:题单列表,展开后按章节显示题目与参与进度;未参加的题单可直接在树里「开始练习」
- 比赛:比赛列表(赛制 / 状态 / 剩余时间),展开查看比赛题目;未报名的比赛可直接报名,密码场次会提示输入;已报名但未开始的比赛可在树里「开始比赛」(会提示确认并开启计时)
- 按链接添加:小组题 / 小组题单 / 带
gid 的小组赛都不在列表接口的返回里。用视图标题栏的 +(或命令面板的「添加题目 / 添加题单 / 添加比赛(粘贴链接)」)把链接粘进去,它们会固定在对应视图顶部的「已添加」分组里,和列表里的条目完全等价(展开、报名、提交、倒计时都能用),右键可移除,重启后仍在
- 链接里带的
cid / tid / gid 会被一起记住——小组题目缺了这些参数打开就是「该题目不可见」
- 比赛成绩:展开比赛(或查过一次榜单)后,比赛行与详情块会显示我的当前得分和排名;OI 赛制不显示
- 比赛倒计时:状态栏常驻显示比赛剩余时间,最后 5 分钟转为警示配色,点击在浏览器打开该场比赛
- 可选「跟随自动」(自动盯我参与的、最快结束的一场)、关闭,或在比赛节点右键「设为倒计时目标」指定某一场
- 灵活时间制的比赛按后端的
remainTime 走个人计时(不是拿比赛窗口结束时间硬算);还没点「开始比赛」时显示的是比赛窗口剩余,并会在状态栏里标明
- 客观题 / 选择题:非编程题也能在面板里作答提交——客观题按题面里的
{{ select(1) }}、{{ input(2) }} 占位符渲染成选项与填空,选择题直接列出选项;提交后逐题显示对错、正确答案与得分
- 题目详情面板:Markdown 渲染题面(表格 / 引用 / 公式都补了样式),样例的输入输出自动并成左右两栏并标注「输入 #1 / 输出 #1」;时间限制、内存限制、输入输出方式、通过率做成卡片展示,文件 IO 题要求的读入/输出文件名单独高亮;默认开在右侧分屏,左边留给代码;内置提交与刷新按钮
- 一键提交:读取当前文件内容提交,轮询评测结果,测试点表格原地回填(在题面面板里点提交时焦点不在代码上,会自动去分屏里找这道题的代码文件;分屏也找不到就让你选文件)
- 本地代码管理:按题目自动生成代码文件,文件头写入
pid 标记,提交时自动识别题目
- 提交记录:题面面板底部按时间倒序列出本题历史提交,最新一条默认展开;折叠时只显示状态(AC / WA / TLE / MLE…)、得分和时间,展开才拉该次的测试点明细
- 自测运行:不提交也能跑代码——题面面板里有自测区,粘贴输入后一键运行,就地显示输出 / 报错 / 用时内存;也可以在代码文件里右键「运行自测」,从文件读取测试数据(手动输入上限 1MB)。自测不产生提交记录
- 超大文件保护:待提交的代码超过
htoj.maxSubmitBytes(默认 100KB)时不会提交,而是提示改用自测验证
安装
在 VS Code 的扩展面板里搜「核桃 OJ」安装,或在本页右上角点 Install。
需要离线安装时:从 GitHub Release 下载 htoj-vscode-<版本>.vsix,然后 Ctrl+Shift+P → Extensions: Install from VSIX... 选中它,装完执行一次 Developer: Reload Window。
登录
所有入口(侧边栏「登录」按钮、状态栏左下角 →「打开菜单」→「登录」、命令面板 核桃OJ: 登录、以及未登录时的各处提示)都是同一个入口:先选登录方式,再走对应流程。
| 方式 |
说明 |
| 微信扫码 |
推荐。弹出二维码,用微信扫码并在手机上确认即可 |
| 手机号 + 密码 |
需要账号已设置密码 |
| 粘贴 Token |
兜底方案,见下方步骤 |
三种方式各自也有独立命令(核桃OJ: 登录(微信扫码) / 登录(手机号 + 密码) / 登录(粘贴 Token)),默认不在命令面板里显示,需要的话可以自己绑快捷键。
token 过期自动续期
用手机号 + 密码登录时,手机号和密码会存进 VS Code 的 SecretStorage(Windows 走凭据管理器、macOS 走钥匙串、Linux 走 libsecret,不写入工作区文件)。此后每次请求前都会检查 token 自带的过期时间,剩余不足 5 分钟就自动重新登录换一个新 token,无需手动重登。
判断依据是 JWT 里的 exp,不看接口报错——核桃的 errCode: 401 也用于「每页最多显示20条记录」这类业务错误,拿它当登录失效会误判。
不想留密码:执行一次 核桃OJ: 退出登录 就会清除;改用微信扫码或粘贴 Token 登录也会清除(否则换了账号之后,续期会把登录态悄悄切回上一个账号)。续期失败时(比如密码改过了)会弹一次提示并清掉凭据,让你重新登录。
关于短信验证码登录
插件内无法实现短信验证码登录。 核桃OJ 的发送验证码接口强制校验腾讯验证码票据:
空 ticket → {"errCode":1011,"errMsg":"参数异常"}
伪造 ticket → {"errCode":2024,"errMsg":"票据校验异常"}
票据只能由腾讯 TCaptcha 组件在已备案域名的浏览器页面中生成,扩展的 Webview 域名无法通过校验。请改用微信扫码登录。
手动获取 Token
- 浏览器登录 https://htoj.com.cn
- 打开 DevTools → Application → Local Storage →
https://htoj.com.cn
- 复制
KEY_USER_LOGIN_TOKEN 的值
- 在 VS Code 执行
核桃OJ: 登录(粘贴 Token),粘贴进去
Token 使用 VS Code 的 SecretStorage 保存,不会写入工作区文件。
使用
- 点击活动栏的核桃图标(若未登录,侧栏会显示登录引导)
- 在「题目」视图点开一道题,详情面板在编辑器区域打开
- 点「新建/打开代码文件」,插件会在工作区
htoj/ 下生成 P1000.cpp(或 .py)
- 写代码,然后
Ctrl+Alt+Enter 提交(或点面板上的「提交当前文件」)
- 评测完成后结果会显示在面板底部,包含每个测试点的状态 / 分数 / 用时 / 内存
生成的代码文件头部带标记,提交时会自动识别题目:
// @htoj pid=22169438826624 problemId=P1000
// 题目:P1000
// 链接:https://htoj.com.cn/cpp/oj/problem/detail?pid=22169438826624
命令
| 命令 |
说明 |
核桃OJ: 登录 |
统一入口:选择登录方式(微信扫码 / 手机号 + 密码 / 粘贴 Token) |
核桃OJ: 退出登录 |
清除本地 token |
核桃OJ: 切换题库语言(C++ / Python) |
切换 cpp / python 分区 |
核桃OJ: 搜索题目 |
按编号或名称过滤题目列表 |
核桃OJ: 提交当前文件 |
提交当前编辑器内容 |
核桃OJ: 运行自测 |
自测运行(输入从文件 / 手动 / 空值里选),不产生提交记录 |
核桃OJ: 查看本题提交记录 |
打开题面面板并滚到提交记录列表 |
核桃OJ: 新建/打开本地代码文件 |
为当前题目创建代码文件 |
核桃OJ: 查看日志 |
打开输出面板中的调试日志 |
核桃OJ: 添加题目(粘贴链接) |
按链接把题目钉进题目视图(小组题、比赛题这类翻不到的) |
核桃OJ: 添加题单(粘贴链接) |
按链接把题单钉进题单视图(小组题单) |
核桃OJ: 添加比赛(粘贴链接) |
按链接把比赛钉进比赛视图(带 gid 的小组赛) |
核桃OJ: 选择倒计时比赛 |
指定状态栏倒计时盯哪一场比赛(或改为自动 / 关闭) |
核桃OJ: 打开菜单 |
状态栏入口 |
快捷键:编辑器获得焦点且当前文件带 @htoj 标记时,Ctrl+Alt+Enter(macOS Cmd+Alt+Enter)提交。
设置
| 配置项 |
默认值 |
说明 |
htoj.zone |
cpp |
题库语言分区,对应站点 /cpp/ 与 /py/ |
htoj.apiBase |
https://api.htoj.com.cn |
接口网关地址 |
htoj.pageSize |
20 |
每页加载条数。注意服务端对每页条数有上限,超出会被截断 |
htoj.defaultLanguage |
C++17 With O2 |
提交使用的语言名称 |
htoj.codeDirectory |
htoj |
代码文件存放目录(相对工作区根目录) |
htoj.maxSubmitBytes |
102400 |
提交代码的大小上限(字节)。超过时改为提示运行自测,0 表示不限制 |
htoj.pollIntervalMs |
2000 |
评测结果轮询间隔 |
htoj.pollTimeoutMs |
60000 |
评测结果轮询超时 |
排查问题
扩展的调试日志会写入 输出 → 核桃OJ(核桃OJ: 查看日志)。日志包含环境信息、每次 HTTP 请求的完整 URL / 状态码 / errCode / 耗时,以及各视图的加载决策,遇到问题先看这里。
已知限制
- 比赛报名若需要填写额外报名信息(
registerState = 1),仍需到网页端完成
- 短信验证码登录无法在插件内完成(原因见上),请改用微信扫码
- 测试点明细接口
get-submission-case-list 被网关屏蔽(返回 403),结果表格数据取自 get-submission-detail
- 评测结果只能轮询,服务端不提供推送
许可
GNU General Public License v3.0 or later。源码与开发说明见 GitHub 仓库。