🔥 10秒解决USACO Training新域名解析问题:Competitive Companion适配指南
你是否遇到这些痛点?
- 升级USACO Training新域名后插件突然失效
- 无法自动抓取
usaco.training域名下的题目数据 - 手动复制样例输入输出浪费宝贵训练时间
本文将详解如何通过Competitive Companion最新特性解决这些问题,5分钟配置完成后即可无缝解析USACO所有训练题目。
问题根源:域名变更与解析逻辑
USACO(USA Computing Olympiad,美国信息学奥林匹克竞赛)在2023年完成了训练平台重构,将原域名train.usaco.org迁移至usaco.training,导致大量工具出现解析异常。
Competitive Companion通过两类解析器支持USACO平台:
// 两类解析器的职责划分
import { USACOProblemParser } from './USACOProblemParser'; // 主站赛事解析
import { USACOTrainingProblemParser } from './USACOTrainingProblemParser'; // 训练平台解析
新域名解析失败的核心原因是域名匹配规则未及时更新。我们通过源码分析发现关键匹配模式:
// USACOTrainingProblemParser.ts 中的匹配规则
public getMatchPatterns(): string[] {
return ['https://usaco.training/usacoprob2*']; // 仅支持新域名特定路径
}
技术解析:新域名适配实现方案
解析流程时序图
核心解析代码详解
USACOTrainingProblemParser的工作原理可分为三个阶段:
- URL匹配阶段
// 精准匹配新域名的题目路径格式
public getMatchPatterns(): string[] {
return ['https://usaco.training/usacoprob2*'];
}
- DOM解析阶段
// 从HTML中提取关键信息
const elem = htmlToElement(html);
const task = new TaskBuilder('USACO').setUrl(url);
// 智能选择标题元素(兼容不同页面布局)
const nameSelectors = ['center > h1', 'center > b > font'];
const names = nameSelectors
.map(sel => elem.querySelector(sel))
.filter(el => el !== null)
.map(el => el.textContent.trim());
- 任务构建阶段
// 设置题目ID(用于生成输入输出文件名)
const taskId = [...elem.querySelectorAll('h3')]
.find(el => el.textContent.includes('PROGRAM NAME'))
.textContent.substr(14);
// 配置IO参数(符合USACO竞赛规范)
task.setInput({
fileName: taskId + '.in',
type: 'file',
});
task.setOutput({
fileName: taskId + '.out',
type: 'file',
});
配置指南:3步完成环境搭建
1. 确认插件版本
确保Competitive Companion版本≥2.4.0,可通过以下方式验证:
- Chrome/Edge:
chrome://extensions/→ 查看版本号 - Firefox:
about:addons→ 查看扩展详情
2. 验证解析器注册状态
解析器需在parsers.ts中正确注册才能生效:
// parsers.ts 中的注册代码
export const parsers = [
// ...其他解析器
new USACOProblemParser(), // 主站赛事解析器
new USACOTrainingProblemParser(), // 训练平台解析器
// ...其他解析器
];
3. 测试解析功能
访问测试题目验证解析效果:
- 测试URL:
https://usaco.training/usacoprob2?a=exampleProblem - 预期结果:插件图标变为彩色,点击后显示题目信息卡片
常见问题解决方案
问题1:解析器不触发
| 可能原因 | 解决方案 | 验证方法 |
|---|---|---|
| 域名匹配错误 | 检查URL是否符合usaco.training/usacoprob2*格式 | 对比浏览器地址栏与匹配规则 |
| 页面加载延迟 | 等待页面完全加载(≥3秒)再点击插件 | 观察Network面板确认资源加载完成 |
| 扩展权限不足 | 在扩展管理页面启用"访问所有网站"权限 | 检查chrome://extensions/权限设置 |
问题2:题目信息不完整
若出现缺少样例输入/输出的情况,可尝试:
// 备选样例提取方案(当主方案失败时)
const sampleSections = elem.querySelectorAll('.sample');
if (sampleSections.length >= 2) {
task.addTest(
sampleSections[0].textContent.trim(),
sampleSections[1].textContent.trim()
);
}
开发指南:贡献新域名适配
如果你发现未支持的USACO子域名,可以通过以下步骤贡献代码:
- 创建解析器
// 新建解析器文件 USACONewDomainParser.ts
export class USACONewDomainParser extends Parser {
public getMatchPatterns(): string[] {
return ['https://new.usaco.training/*']; // 新域名匹配规则
}
public async parse(url: string, html: string): Promise<Sendable> {
// 实现自定义解析逻辑
}
}
- 注册解析器
// 在parsers.ts中添加
import { USACONewDomainParser } from './problem/USACONewDomainParser';
export const parsers = [
// ...现有解析器
new USACONewDomainParser(),
];
- 编写测试用例
// tests/data/usaco/new-domain/problem/normal.json
{
"url": "https://new.usaco.training/example",
"expected": {
"name": "Example Problem",
"timeLimit": 1000,
"memoryLimit": 16
}
}
总结与展望
Competitive Companion对USACO Training新域名的支持,体现了插件模块化解析器架构的优势。通过独立的USACOTrainingProblemParser类,实现了:
- 关注点分离:训练平台与主站赛事解析逻辑分离
- 可扩展性:新增域名支持无需修改核心代码
- 容错性:单一解析器故障不影响其他平台功能
未来版本计划增强以下特性:
- 支持USACO竞赛日历自动同步
- 实现训练进度与题目难度分析
- 添加多语言代码模板自动生成
通过本文介绍的技术方案,你现在已经掌握了Competitive Companion解析USACO新域名的核心原理和配置方法。立即更新插件,体验无缝的USACO训练题目解析功能吧!
提示:定期关注项目更新,获取更多竞赛平台的解析支持。遇到解析问题时,可以通过GitHub Issues提交反馈,帮助我们持续改进解析器。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



