一个面向 Chromium 浏览器的轻量扩展,用来在在线算法题页面上注入“复制题目”按钮,并将题面整理为 Markdown 后写入剪贴板。
当前仓库基于真实实现状态维护文档:已经可用的平台是 LeetCode 和 Codeforces;NowCoder、AcWing、洛谷、AtCoder 目前只有占位适配器,还没有完成页面提取与 UI 注入。
- 在支持的题目页面中注入“复制题目”按钮
- 一键复制整理后的 Markdown 到系统剪贴板
- 自动提取标题、链接、难度、标签和题面正文等信息
- 对常见富文本结构做 Markdown 转换,包括标题、列表、代码块、表格、引用与图片
- 适配单页应用场景下的路由切换与 DOM 变化,尽量保持按钮持续可见
- LeetCode
https://leetcode.com/problems/*https://leetcode.com/contest/*https://leetcode.cn/problems/*https://leetcode.cn/contest/*
- Codeforces
https://codeforces.com/contest/*/problem/*https://codeforces.com/problemset/problem/*
- NowCoder
- AcWing
- 洛谷
- AtCoder
说明:
- 源码中已经预留了上述平台的 handler 文件,但当前
ensureUI()和buildMarkdown()仍为空实现。 manifest.json目前只声明了 LeetCode 和 Codeforces 所需的站点权限,因此浏览器实际可加载的范围也以这两个平台为准。
在已支持平台上,扩展会尽量生成结构清晰的 Markdown,通常包含:
- 题目标题
- 题目链接
- 难度信息(如页面可提取)
- 标签信息(如页面可提取)
- 题面正文
- 示例、约束、输入输出说明、样例等页面正文中的结构化内容
实际输出会受目标站点 DOM 结构影响。如果题面页面更新了结构,提取结果可能出现缺项或格式偏差。
- 打开仓库的 Releases 页面
- 下载最新版本的扩展压缩包
copy-algo-problems-<version>.zip - 将压缩包解压到本地任意目录
- 打开 Chrome / Edge 扩展管理页
- 开启“开发者模式”
- 选择“加载已解压的扩展程序”
- 选择解压后的扩展目录
说明:
- Release 压缩包中已经包含运行所需的
manifest.json、assets/和dist/ - 普通使用者不需要安装 Node.js,也不需要自己执行构建命令
npm installnpm run build构建完成后,会生成内容脚本:
dist/content.js
以 Chrome / Edge 为例:
- 打开扩展管理页
- 开启“开发者模式”
- 选择“加载已解压的扩展程序”
- 选择当前项目根目录
copy-algo-problems
加载成功后,浏览器会读取根目录下的 manifest.json,并在匹配页面注入 dist/content.js。
- 进入已支持平台的题目页面
- 等待页面加载完成
- 点击页面中注入的“复制题目”按钮
- 扩展会将整理后的 Markdown 写入剪贴板
- 将内容粘贴到任意 Markdown 编辑器、Obsidian、笔记软件或本地文件中即可
如果复制失败:
- 先打开浏览器开发者工具的 Console 查看报错
- 确认当前页面属于支持的平台和 URL 范围
- 确认浏览器未阻止剪贴板权限
- 如目标站点页面结构发生变化,可能需要更新对应平台选择器
npm install
npm run build
npm run dev
npm run package说明:
npm run build:执行一次性构建npm run dev:以 watch 模式运行 esbuild,便于调试内容脚本npm run package:先构建,再生成可上传到 GitHub Releases 的扩展压缩包
如果你希望 GitHub 自动生成可下载的扩展包:
- 更新 manifest.json 中的版本号
- 提交并推送代码
- 创建并推送形如
v0.1.0的 tag - GitHub Actions 会自动执行构建,并在 Releases 中上传
release/*.zip
本仓库中的工作流文件位于:
.github/workflows/release.yml
copy-algo-problems/
├─ assets/ # 扩展图标资源
├─ dist/ # 构建输出目录
├─ src/
│ ├─ core/ # 剪贴板、DOM、Markdown、UI 基础能力
│ ├─ platform/ # 各 OJ 平台适配器
│ └─ content.ts # 内容脚本入口
├─ esbuild.config.mjs # 构建配置
├─ manifest.json # 浏览器扩展清单
└─ package.json # 项目脚本与依赖
- TypeScript
- esbuild
- Manifest V3 浏览器扩展
- 入口文件为
src/content.ts - 通过平台 handler 判断当前页面是否匹配
- 在匹配页面中注入复制按钮
- 将页面 DOM 转换为 Markdown 后调用剪贴板 API 写入
- 当前构建目标为
chrome120与edge120
当前扩展声明的权限很少,主要用于完成复制能力:
clipboardWrite- 用于将整理后的 Markdown 写入系统剪贴板
host_permissions- 仅声明 LeetCode 与 Codeforces 的题目页访问范围
- 目的是允许内容脚本在这些页面运行并读取可见题面内容
本项目的设计目标是本地执行页面提取与剪贴板复制,不包含远程上传逻辑,也没有内置服务端通信代码。
但请注意:
- 题面原始内容仍然来自第三方 OJ 平台
- 是否登录、是否能看到完整题面、页面里展示什么内容,都由目标平台决定
- 使用者应自行遵守目标平台的服务条款、版权规则与使用限制
- 当前仅适用于 Chromium 内核浏览器扩展环境,例如 Chrome、Edge
- 页面提取依赖目标站点的 DOM 结构,站点改版后可能需要更新选择器
- 占位平台虽然有源码文件,但尚未真正实现,不应视为已支持
- 当前仓库没有自动化测试;功能验证主要依赖手动在真实页面中检查
- 如果浏览器或页面环境阻止
navigator.clipboard,代码会退回到document.execCommand("copy")方案
后续可以继续补齐以下方向:
- 完成 NowCoder、AcWing、洛谷、AtCoder 的平台适配
- 为不同平台补充更稳定的 DOM 选择器和回退策略
- 增加更多 Markdown 清洗规则,减少格式噪声
- 补充自动化测试或最小化回归检查
- 在 README 中加入演示截图或示例输出
本项目代码基于 MIT License 开源。
补充说明:
- 本仓库中的源代码、构建脚本与文档遵循 MIT License
- 各 OJ 平台上的题面、样例、描述、标签等原始内容,其版权归对应平台及其权利人所有
- 本项目只提供页面内容整理与 Markdown 复制辅助,不转移、不授予原题面内容的版权
如果你准备继续完善这个项目,建议优先从以下方向入手:
- 为占位平台补全页面匹配、按钮注入和 Markdown 提取逻辑
- 在
manifest.json中补充与实际支持平台一致的站点权限 - 针对不同平台的 DOM 改版增加更稳健的容错逻辑
- 提交 issue 或 PR 时附上目标页面链接、失败现象和预期 Markdown 结果,便于复现与修复