OCTest 的头像OCTestGitHub

本项目完全使用 AI 开发,作者只起到充钱和测试的作用 q

浏览器插件 · 2026-10

PTA 助手

一个帮你在 PTA 上刷编程题的浏览器插件。

Chrome / Edge / Firefox / Zen 通吃的浏览器扩展,专门用来帮学生完成 PTA 上的编程题。内置 C 编译环境、agent loop 和一整套 PTA 页面工具,点一下图标就会在页面上方弹出聊天悬浮窗。

  • TypeScript
  • React
  • MV3
  • MIT
  • v1.0 已发布
主要语言
TypeScript
开源协议
MIT
最新版本
v1.0
支持浏览器
Chromium 系 / Gecko 系
发布包
zip(解压加载)、xpi
签名状态
未签名

它能干什么

不是简单套个聊天框,下面这些是真正花时间的地方。

点图标就有聊天窗

点击工具栏图标,在当前页面正上方弹出一个可拖动、可缩放的悬浮窗:上面是聊天区,下面是输入框。位置和尺寸会被记住,双击标题栏或双击图标即可恢复默认。

内置编译环境

不需要本地装 GCC,插件自带 C / C++ 编译环境,模型写完的代码可以直接编译运行,拿到真实的报错文本再回去改。

自己会循环的工具调用

内置一个自定义 agent loop:请求模型 → 执行工具 → 把结果回灌 → 再来一轮。支持多轮追问、流式输出,回答里的 Markdown 和数学公式都会渲染。

只走真实键盘事件

PTA 的 onpaste 是平台反抄袭控制,实测「写剪贴板 + 真 Ctrl+V」编辑器纹丝不动。所以写代码这条路,键盘事件是唯一通道。

判题结论不会报错

判题状态归一化的顺序即优先级:先 AC/WA/RE/TLE/MLE/CE/PE/OLE,再中文词表,而且具体状态排在泛化词前面——否则「编译错误」会被当成「错误」报成 WA,模型就会一直改算法而不碰那句语法错误。

和页面隔开,不打架

content script 注入 Shadow DOM 宿主节点再挂载 React,悬浮窗的样式不会和 PTA 自己的样式互相污染。

工具清单

模型能调用的基础工具,agent loop 会自己决定什么时候用哪个。

  • js_inject直接注入 JS 代码到浏览器页面。
  • complie_and_run_C编译并运行 C 语言代码。
  • simulate_keyboard_input模拟键盘输入,是写代码进编辑器的唯一可靠通道。
  • read_problem获取题目要求。
  • read_editor_code获取用户代码。
  • write_editor_code覆写用户代码。
  • write_document编写文档并下载到用户的浏览器。
  • date获取当前日期。
  • url获取当前页面的 url。

安装

插件没有签名,两个内核的装法不一样,别混着来。

这里只列了步骤。想要每一步都对着截图做,看图文版使用教程。

插件没有签名,所以每个浏览器的装法都不一样。先记住:Chromium 系只认「解压后的文件夹」,Gecko 系可以直接选 xpi。解压后一定要选到「里面有 manifest.json 的那一层」,别选到套了两层目录的,也别选项目根目录。

  1. 下载 Release 里的 pta-assist-v1.0.zip 并解压。Windows 右键「全部解压缩」,macOS 双击会自动解压出一个文件夹。直接选 zip 会报「无法加载清单」。
  2. 地址栏打开对应管理页:chrome://extensions、edge://extensions、brave://extensions、vivaldi://extensions、opera://extensions。
  3. 打开「开发者模式」/「开发人员模式」。
  4. 点「加载已解压的扩展程序」/「加载解压缩的扩展」,选中解压出来、里面有 manifest.json 的那个文件夹。
  5. 成功后卡片上会出现「PTA 助手」,到拼图图标里把它固定到工具栏。

工程结构

background 跑 agent loop,content script 管界面。

manifest/manifest.json   手写清单(Chrome 用),Firefox 版本构建时按差异打补丁
vite.config.ts         一次构建一个入口(background / content),target 决定产物目录
src/
  background/
    index.ts           图标点击、消息路由、维护进行中的请求
    agent.ts           agent loop:请求模型 → 执行工具 → 回灌结果 → 再来一轮
    deepseek.ts        调用 /chat/completions,解析 SSE 文本增量与 tool_calls 分片
    js-inject.ts       在页面主世界执行模型给的 JS(含超时与隔离世界回退)
    settings.ts        设置读写(chrome.storage.local),API Key 只留在这里
  content/
    index.tsx          注入 Shadow DOM 宿主节点并挂载 React
    App.tsx            悬浮窗主体(对话 / 设置两个视图)
    pageTools.ts       页面侧工具:url 取当前地址,write_document 触发下载
    hooks/             useChat(消息、流式增量、工具事件)、useSettings
    components/        消息列表、输入框、设置面板等

常见问题

点图标没反应

页面是在装插件之前打开的,刷新一下页面即可。另外 chrome:// 这类浏览器内部页面不允许注入,这是正常现象。

图标不在工具栏

它默认不固定。点拼图图标 → 找到「PTA 助手」→ 点图钉。

想换悬浮窗的位置或大小

拖标题栏移动、拉右下角改大小,位置与尺寸会被记住。双击标题栏或双击工具栏图标恢复默认。

第一次用

点右上角齿轮填 API Key,默认接硅基流动,接口地址旁边有「教程」按钮。API Key 只存在 chrome.storage.local 里。

悬浮窗打不开(LibreWolf / Waterfox 等)

这类纯净浏览器默认会拦截部分扩展 API,多半是隐私设置把站点权限挡了,给站点权限即可。

开发计划

来自仓库 README 的路线图。

  1. v0.1基础环境 + UI
  2. v0.2接入 ai-agent,单轮流式聊天
  3. v0.3多轮追问,实时渲染 Markdown
  4. v0.4js_inject / date / url / 写文档下载
  5. v0.5simulate_keyboard_input
  6. v0.6complie_and_run_C
  7. v0.7适配 PTA:读题面、读代码、覆写代码
  8. v0.8继续打磨 UI