🏠 Home 

SJTU/ACMOJ 仙贝智慧收集器

在SJTU/ACMOJ的提交记录中快速筛选公开AC代码


安装此脚本?
// ==UserScript==
// @name         SJTU/ACMOJ 仙贝智慧收集器
// @namespace    http://tampermonkey.net/
// @version      0.0.1
// @description  在SJTU/ACMOJ的提交记录中快速筛选公开AC代码
// @author       SusieGlitter
// @match        https://acm.sjtu.edu.cn/OnlineJudge/status?*
// @license      MIT
// @grant        none
// ==/UserScript==
(function () {
'use strict';
// 进入提示
console.log('SJTU/ACMOJ 仙贝智慧收集器正在工作喵~')
console.log(document.cookie);
console.log(navigator.userAgent);
// 创建查询按钮
let start = document.createElement("div");
start.setAttribute("class", "input-group-append");
let start_btn = document.createElement("button");
start_btn.setAttribute("type", "button");
start_btn.setAttribute("class", "btn btn-outline-primary");
start_btn.innerText = "筛选公开代码";
start_btn.onclick = function () {
console.log("开始获取代码");
get_AC_code();
}
start.appendChild(start_btn);
// 插入查询按钮
let serach_col = document.getElementById("status_search");
serach_col.appendChild(start);
// 获取代码
async function get_AC_code() {
// 清空目前列表
let code_list = document.getElementsByTagName("tbody")[0];
code_list.innerHTML = '';
// 获取一些必要信息
let user_ID = document.getElementsByClassName("nav-link dropdown-toggle");
// 获取问题编号
let para_json = {};
window.location.href.trim().split(/[&?]/).slice(1).forEach(item => { para_json[item.split('=')[0]] = item.split('=')[1] });
let problem_id = para_json["problem_id"];
let page_id = para_json["page"];
// 获取AC第一页
start_btn.innerText = "统计中……"
let response = await fetch(`${window.location.href}&status=accepted&page=1`, {
method: "GET",
headers: {
"User-Agent": navigator.userAgent,
"Cookie": document.cookie
}
});
let domparser = new DOMParser();
let response_text = await response.text();
let response_dom = domparser.parseFromString(response_text, "text/html");
//获取最大页数
para_json = {};
let page_link = response_dom.getElementsByClassName("page-link btn-light");
let max_page = 0;
if (page_link[page_link.length - 1].href == "javascript:void(0)") {
if (!page_id) {
max_page = 1;
}
else {
max_page = page_id;
}
}
else {
page_link[page_link.length - 1].href.split(/[&?]/).slice(1).forEach(item => { para_json[item.split('=')[0]] = item.split('=')[1] });
max_page = Number(para_json["page"]);
}
// 小小的保护
max_page = Math.min(max_page, 256);
// 获取代码
let code_cnt = 0;
let async_cnt = max_page;
async function get_and_append(page) {
let response = await fetch(`https://acm.sjtu.edu.cn/OnlineJudge/status?page=${page}&problem_id=${problem_id}&status=accepted`, {
method: "GET",
headers: {
"User-Agent": navigator.userAgent,
"Cookie": document.cookie
}
});
let response_text = await response.text();
// console.log(page)
console.log(`正在第${page}页里面找`);
let domparser = new DOMParser();
let response_dom = domparser.parseFromString(response_text, "text/html");
let all_tr = response_dom.getElementsByTagName("tr")
for (let tr_i = 1; tr_i < all_tr.length; tr_i++) {
let tr = all_tr[tr_i];
let tr_link = tr.getElementsByClassName("link--status");
let tr_text = tr.getElementsByClassName("text-green");
if (tr_link.length > 0 && tr_text.length > 0) {
tr_link[0].setAttribute("target", "_blank");
code_list.appendChild(tr);
code_cnt++;
console.log(`已找到${code_cnt}个公开AC代码`);
}
}
async_cnt--;
start_btn.innerText = `${max_page - async_cnt}/${max_page}`;
if (async_cnt == 0) {
alert(`获取完毕,已找到${code_cnt}个公开AC代码`);
}
}
for (let page = 1; page <= max_page; page++) {
get_and_append(page);
}
}
})();