Skip to content

sunhouy/OJ-Assistant

Repository files navigation

OJ助手

解除头歌、力扣、牛客、洛谷等OJ平台禁止复制粘贴的限制。基于Python的Pyautogui/Keyboard库和Chrome拓展程序,调用AI实现自动完成OJ平台的编程题目。

本应用也可用于在任何禁止粘贴的应用或网页中粘贴文本。具备远程协助功能,可在手机或其他设备输入文本,将实时输入至计算机当前的活动编辑器中。

本应用在Windows系统完整可用。由于Linux系统限制,无法在浏览器中模拟键盘输入,但其他应用中模拟键盘输入可正常工作,其他功能也可正常使用。

功能

  1. Chrome/Edge拓展程序自动安装和启动。
  2. 浏览器拓展程序自动识别常见OJ平台并启动,可自动获取题目内容并调用AI生成代码解决方案,并自动输入到代码编辑器中。支持自动纠错,可自动收集OJ平台返回的错误信息发送给AI进行智能纠错。支持远程协助功能,启动该功能后会将代码自动发送至协助设备,并将协助设备的输入信息实时发送至OJ平台的编辑器中。
  3. 支持自定义AI模型和服务器获取服务器提供的AI模型,自定义编程语言,关闭应用最小化到托盘,开机自启等功能。
  4. 提供登录、注册、会员管理、更新检测等后端功能,使用PHP开发,可用于限制非会员用户使用开发者提供的apikey,节约成本。提供美观的前端演示代码,用于演示应用界面和功能。

快速开始

登录与注册

打开软件后,您将看到登录界面。输入用户名和密码进行登录。新用户需要注册账号。注册时,需要输入邀请码。成功注册后,邀请人和被邀请人均免费获得一天会员。同一设备上,注册的第一个账号输入邀请码可获得会员,第二个及之后的账号即使输入邀请码也不再赠送会员。 用户名与设备ID唯一绑定,一个账号只能在注册时的设备上使用。

安装浏览器扩展

  1. 自动安装:应用提供浏览器拓展安装程序,可自动安装拓展并启动浏览器。扩展会自动安装到Microsoft Edge浏览器。安装步骤会显示在界面左上角,您可以实时查看安装进程。

  2. 手动安装:打开Chrome或Edge等支持拓展的浏览器,点击网址栏最右侧三个点-拓展程序-管理拓展程序,然后打开右上角的开发者模式,再点击加载未打包的拓展程序,选择本应用目录的Chrome文件夹并确认,确认本应用的拓展程序是打开状态。

  3. 拓展安装成功后,点击本应用的“启动服务器”按钮以启动服务器。然后点击浏览器拓展的“自动答题”按钮,即开始自动答题。 打开OJ平台的答题界面后,拓展主界面才会显示出来。

主程序

输入测试

这个工具可以在所有阻止复制粘贴的浏览器网页或桌面客户端上进行模拟键盘输入,确保输入的准确性。

模型选择

您可以选择合适的AI模型,也可以自己添加模型。对于自己添加的模型,无需开通会员即可启动服务器。在一些AI模型的开放平台注册开发者账号以获得API Key,然后将模型添加到软件中使用。

启用复制粘贴模式

此功能仅在编辑器允许复制粘贴时可用。它可以一次性输入完整代码,大大提高输入速度。虽然我们的模拟键盘输入已经非常快速和准确,但我们仍然保留了复制粘贴模式,以满足不同场景的需求。

编程语言选择

在选择编程语言区域指定需要在编辑器中输入的编程语言。软件默认提供的编程语言经过充分测试,能够保证准确性。新增编程语言时会进行验证,如果不是常见的编程语言,会提醒用户是否继续添加。

其他设置与功能

  1. 显示日志 此功能仅在遇到问题需要反馈时使用。将日志提供给开发者,帮助诊断和解决问题。
  2. 开机自启 开启此功能后,软件会在每次开机时自动启动。部分杀毒软件可能会阻止此功能。
  3. 关闭时最小化到托盘 如果勾选此选项,关闭应用时,不会完全退出,而是最小化到桌面右下角的系统托盘。在托盘图标上点击右键,选择恢复主界面。
  4. 启动浏览器 建议始终通过主界面的"启动浏览器"按钮来启动浏览器,以确保浏览器扩展正常工作。

工作原理

OJ助手采用“桌面端 + 浏览器拓展 + 本地WebSocket通信 + AI推理 + 自动输入执行”的协同架构。整体目标是:在不改造OJ平台后端的前提下,自动完成题目采集、代码生成、代码输入与纠错闭环。

1. 系统架构分层

  1. 桌面端(Python/Tkinter)

    • 提供登录、模型管理、语言选择、服务器启动、输入测试、浏览器扩展安装等能力。
    • 启动本地WebSocket服务(默认 localhost:8000),作为浏览器拓展与AI逻辑的桥接层。
    • 内置输入执行器(pyautogui/keyboard/xdotool)用于回退输入。
  2. 浏览器拓展(Content Script)

    • 在OJ页面注入悬浮助手,提供“自动答题 / 智能纠错 / 远程协助 / 状态日志”。
    • 负责提取题面、读取当前编辑器代码、采集测试结果、显示进度与触发输入。
    • 与桌面端通过WebSocket实时通信。
  3. AI服务层(OpenAI兼容接口)

    • 桌面端将题目与上下文发送到用户配置的模型接口(可自定义 base_url / api_key / model)。
    • 返回纯代码后进行清洗和完整性检查,不完整时自动重试一次。
  4. 远程协助层

    • 本地远程协助:浏览器拓展可连接 localhost:8003,向远程协助窗口同步题目、测试结果与输入状态。
    • 云端远程协助:支持一次性密码/网页端协助模式,便于跨设备输入与协作。

2. 自动答题主流程(端到端)

  1. 建立连接

    • 拓展启动后自动连接桌面端 ws://localhost:8000,成功后进入可操作状态。
  2. 采集题目

    • Content Script 按多组选择器提取题面文本。
    • 同步提取题面图片URL,若检测到图片则调用OCR接口追加文字内容。
    • 同时读取编辑器“现有代码”(Monaco/CodeMirror/Ace/textarea 多策略),作为上下文输入。
  3. 发送请求

    • 拓展发送 educoder_content_auto_input(兼容 OJ_content_auto_input)消息。
    • 消息内包含题面、URL、时间戳、当前代码、多键冗余字段(current_code/existing_code/editor_code)以及来源元信息。
  4. 代码生成

    • 桌面端服务器收到请求后,调用LLM生成完整代码。
    • 系统提示词要求“只输出纯代码、禁止代码块标记、尽量保持已有代码不被破坏”。
    • 返回代码后执行清洗与完整性检测,必要时自动重试。
  5. 代码输入

    • 拓展优先尝试“页面内直写”(优先Monaco,其次CodeMirror/Ace/textarea/contenteditable)。
    • 若页面内直写失败,回退到桌面端输入模拟:优先整段粘贴,失败再逐段模拟键盘输入。
    • 输入完成后返回 input_complete,前端刷新状态并结束进度条。

3. 自动输入策略(稳定性核心)

为降低不同OJ编辑器实现差异带来的失败率,系统采用“分层回退”策略:

  1. 页面内直写(优先)

    • 在页面上下文中直接访问编辑器实例(如 Monaco API getEditors()/setValue())。
    • 先清空再写入,并做结果校验,避免旧代码残留。
  2. 桌面端输入模拟(回退)

    • 粘贴模式:Ctrl+A + Delete 后整段粘贴(速度快、缩进稳定)。
    • 逐段输入:按行/分块输入并同步进度,适合粘贴受限场景。
  3. Linux兼容策略

    • Linux下优先 xdotool,并检测会话环境。
    • Wayland场景通常无法可靠模拟浏览器输入,因此浏览器内自动输入受限;其他桌面应用输入仍可用。
  4. 中断与恢复

    • 输入过程中支持 ESC 终止。
    • 终止后统一恢复按钮状态与进度状态,避免卡死。

4. 智能纠错闭环

智能纠错不是简单重生,而是“测试结果驱动”的循环修复:

  1. 提取测试反馈

    • 拓展读取测试结果面板,结构化提取测试输入、预期输出、实际输出与错误信息。
  2. 发送纠错请求

    • 发送 test_results 消息,附带当前代码与测试失败详情。
  3. 服务端修复

    • AI根据“题目 + 当前代码 + 失败信息”生成修订后的完整代码。
    • 默认最多重试3次,防止无限循环。
  4. 自动回填

    • 将修订代码再次自动输入编辑器。
    • 用户可继续运行OJ测试,形成“测试-纠错-回填”闭环直到通过。

5. 进度与状态同步机制

为避免“长时间无反馈”,前后端实现了双通道进度机制:

  1. 服务端真实进度

    • 桌面端维护当前进度值,前端可主动发送 progress_request,服务端返回 progress_update
  2. 前端虚拟进度后备

    • 若短时间未收到服务端进度,拓展启用平滑虚拟进度,避免用户误判为卡死。
  3. 完成与异常态统一处理

    • input_complete / input_error / 用户取消都会触发统一收尾:停止计时器、恢复按钮、更新日志。

6. 浏览器扩展安装原理

安装工具支持Chrome与Edge,核心流程如下:

  1. 检测浏览器与驱动

    • Chrome优先本地驱动,缺失时回退Selenium Manager自动匹配。
    • Edge按版本自动下载/匹配对应WebDriver。
  2. 加载扩展目录

    • 按多个候选路径查找 manifest.json,兼容开发目录与打包目录。
  3. 防重复启动保护

    • 启动入口防抖、进程级单实例锁、安装任务锁、成功弹窗去重、已有会话检测。
    • 目标是避免“多开浏览器、多弹成功窗口”等重复触发问题。

7. 消息协议(核心类型)

前后端通信采用JSON消息,典型类型包括:

  1. 题目与生成

    • educoder_content_auto_input / OJ_content_auto_input
    • server_ack
    • code_solution
  2. 输入与进度

    • ready_for_input
    • input_progress
    • input_complete
    • input_error
    • progress_request
    • progress_update
  3. 纠错流程

    • test_results
    • test_results_response
    • code_revision
  4. 页面内直写确认

    • direct_input_complete

8. 设计取舍与可靠性思路

  1. 优先“页面内直写”

    • 直接操作编辑器实例可显著提升速度与准确性,减少焦点丢失导致的输入偏移。
  2. 保留“桌面端模拟输入”回退

    • 面对反自动化、编辑器封装差异或页面权限限制时,仍有可用兜底方案。
  3. 强化“已有代码保护”

    • 题目请求和纠错请求都会携带当前代码,尽量避免AI覆盖用户已有实现。
  4. 全链路可观测

    • 前端日志、桌面日志、进度状态三位一体,便于用户和开发者快速定位问题。

9. 边界与限制

  1. OJ页面结构会变更

    • 若目标平台DOM结构调整,题面提取与测试结果解析规则可能需要更新。
  2. Linux浏览器输入限制

    • Wayland等环境对全局输入控制限制严格,浏览器内自动输入能力可能下降。
  3. AI输出不确定性

    • 模型可能出现不完整输出或偏题,系统已提供清洗、校验和自动重试,但无法保证100%一次成功。
  4. 网络依赖

    • 模型接口、OCR接口、远程协助服务均依赖网络状态,弱网环境会降低体验。

部署与测试

GitHub Actions 自动构建与自动发布

项目已支持 GitHub Actions 自动构建并发布 Release,覆盖 Windows、Linux、macOS 三端安装包。

触发方式:

  1. 自动发布:推送标签(例如 v1.2.3)后自动构建并发布 Release。
  2. 手动发布:在 GitHub Actions 页面手动运行 Build And Release,并填写 release_tag

默认产物:

  1. Windows:Inno Setup 安装包(*-setup.exe)和便携版压缩包(*-portable.zip)。
  2. Linux:包含 install.sh/uninstall.sh 的安装包(*.tar.gz)。
  3. macOS:*.dmg*.zip 安装包。

本地构建(可选):

  1. 安装依赖:pip install -r requirements.txt
  2. 执行构建:python setup.py --version v1.2.3

说明:macOS 与 Windows 产物默认未签名,首次运行可能出现系统安全提示。

联系

18763177732@139.com

警告:本应用仅供学习交流使用,不得用于商业和非法用途。如您使用本应用造成账号封禁、处分、退学等后果,开发者不承担任何责任!

About

解除头歌、力扣、牛客、洛谷等OJ平台禁止复制粘贴的限制。基于Python的Pyautogui/Keyboard库和Chrome拓展程序,调用AI实现自动完成OJ平台的编程题目。 本应用也可用于在任何禁止粘贴的应用或网页中粘贴文本。具备远程协助功能,可在手机或其他设备输入文本,将实时输入至计算机当前的活动编辑器中。

Topics

Resources

License

GPL-3.0, Unknown licenses found

Licenses found

GPL-3.0
LICENSE
Unknown
license.txt

Stars

Watchers

Forks

Packages

 
 
 

Contributors