您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
try to take over the world!
// ==UserScript== // @name 杭电选课助手 // @icon https://bkimg.cdn.bcebos.com/pic/7aec54e736d12f2e307562024fc2d56285356864?x-bce-process=image/resize,m_lfit,w_268,limit_1/format,f_jpg // @namespace http://tampermonkey.net/ // @version 0.3 // @description try to take over the world! // @author RecLusIve_F // @match *://jxgl.hdu.edu.cn/* // @require https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/toastr.min.js // @exclude http://jxgl.hdu.edu.cn/CheckCode.aspx // @exclude http://jxgl.hdu.edu.cn/xsxjs.aspx?* // @resource toastrCss https://cdn.bootcdn.net/ajax/libs/toastr.js/2.1.4/toastr.min.css // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_getResourceText // ==/UserScript== (function() { 'use strict'; const $ = window.jQuery; const toastr = window.toastr; toastr.options = { "closeButton": false, "debug": false, "newestOnTop": false, "progressBar": false, "positionClass": "toast-top-center", "preventDuplicates": true, "onclick": null, "showDuration": "300", "hideDuration": "1000", "timeOut": "1500", "extendedTimeOut": "1000", "showEasing": "swing", "hideEasing": "linear", "showMethod": "fadeIn", "hideMethod": "fadeOut" }; GM_addStyle(GM_getResourceText('toastrCss')); $("#iframeautoheight").attr("sandbox", "allow-same-origin allow-top-navigation allow-forms allow-scripts allow-downloads allow-popups"); var classInfos = GM_getValue("classInfos", []); var isHideClass = GM_getValue("isHideClass", false); var isRunning = GM_getValue("isRunning", false); var taskID = GM_getValue("taskID", null); class ClassInfo { constructor(className, classTeacher, classCredit, classPerWeekTime, classStartEnd, classTime, classClassroom, classCategory, classType, classAreaCode) { this.className = className; this.classTeacher = classTeacher; this.classCredit = classCredit; this.classPerWeekTime = classPerWeekTime; this.classStartEnd = classStartEnd; this.classTime = classTime; this.classClassroom = classClassroom; this.classCategory = classCategory; this.classType = classType; this.classAreaCode = classAreaCode; } } function captchaRecognition() { let image; if ($('img').length != 0) { image = $('img')[0]; } var canvas = document.createElement('canvas'); var canvasContext = canvas.getContext("2d"); var digitalFeatures = ["110001110000000001100001110000111000011100001110000111000011100001110010000011100001", "111101111100111000011000001100100111110001111000111100111110011111001111100111110011", "110000100000000011100001110011111001111000111000111000111000111000111100000000000000", "110000100000010011000111100111100011100001111100011111000011100001100000000011100011", "111100111100011110001110000111000011001001001100100110010000000000000011110011111001", "100000010000001001111100111110000010000000001110011111000011100000110010000001100001", "110000110000000011100001111100100010000000001110000111000011100000110010000001100001", "000000000000001111100111100111100111110011110001111001111100111100011110011111001111", "110001110000000001100001110000010001000001100000100111000011100001110000000001100011" ]; var captcha = ""; canvas.width = image.width; canvas.height = image.height; canvasContext.drawImage(image, 0, 0); for (var i = 0; i < 5; i++) { var pixels = canvasContext.getImageData(9 * i + 6, 5, 7, 12).data; var digitalString = ""; for (var j = 0, length = pixels.length; j < length; j += 4) { digitalString = digitalString + (+(pixels[j] * 0.3 + pixels[j + 1] * 0.59 + pixels[j + 2] * 0.11 >= 140)); } var result = digitalFeatures.map(function(value) { return digitalString.split("").filter(function(v, index) { return value[index] === v }).length }); captcha += result.indexOf(Math.max.apply(null, result)); } $("#txtYz").val(captcha); } function hideClass() { let tr = $("#kcmcGrid > tbody > tr"); for (let i = 1; i < tr.length; i++) { let td = $(tr[i]).children("td"); if (!classInfos.some(c=>{ if ($(td[2]).text() === c.className && $(td[5]).text() === c.classTime && $(td[4]).text().includes(c.classTeacher)) { return true; } })) { $(tr[i]).hide(); } } } function checkResult() { let tr = $("#DataGrid2 > tbody > tr"); let isFinished = false; for (let i = 1; i < tr.length; i++) { let td = $(tr[i]).children("td"); for (let j = 0; j < classInfos.length; j++) { if ($(td[0]).text() === classInfos[j].className && $(td[1]).text() === classInfos[j].classTeacher && $(td[6]).text() === classInfos[j].classTime) { isFinished = true; var temp_obj = classInfos.splice(j, 1); toastr.success("<b>" + temp_obj.name + "已经抢到!</b>"); GM_setValue("classInfos", classInfos); break; } } } if (isFinished) { window.location.reload(); } } function startToApply() { checkResult(); if (classInfos.length == 0) { isRunning = false; GM_setValue("isRunning", isRunning); clearTimeout(GM_getValue("taskID", null)); GM_setValue("taskID", null); toastr.error("<b>选择课程为空!</b>"); } else { toastr.success("<b>正在抢课.....</b>"); GM_setValue("isRunning", true); GM_setValue("taskID", setTimeout(apply, 3000)); } } function stopToApply() { isRunning = false; GM_setValue("isRunning", false); clearTimeout(GM_getValue("taskID", null)); GM_setValue("taskID", null); toastr.warning("<b>停止抢课.....</b>"); location.reload(); } function apply() { $("#Button1").click(); startToApply(); } function initUI() { $("#xsyxxxk_form > div.toolbox > div:nth-child(4)").hide(); $("#xsyxxxk_form > div.main_box > div > span > fieldset:nth-child(3)").hide(); $("#xsyxxxk_form > div.toolbox > div:nth-child(5)").after(`<div style="WIDTH: 780px; CLEAR: both" class="searchbox"><p class="search_con">仅展示抢课列表中的课程:<input type="checkbox" id="isHideClass"> <input type="${isRunning ? 'hidden' : 'button'}" value="开始抢课" id="startBtn" class="button" style="width:66px;"><input type="${!isRunning ? 'hidden' : 'button'}" value="停止抢课" id="stopBtn" class="button" style="width:66px;"></p><p class="search_title"><em></em></p></div>`); $("#isHideClass").attr("checked", isHideClass); $("#startBtn").on("click", startToApply); $("#stopBtn").on("click", stopToApply); if (isHideClass) { hideClass(); } $("#isHideClass").change(function() { isHideClass = !isHideClass GM_setValue("isHideClass", isHideClass); if (isHideClass) { hideClass(); } else { window.location.reload(); } }); let nodeList = $("#kcmcGrid > tbody > tr"); $(`#kcmcGrid > tbody > tr:nth-child(1) > td:nth-child(17)`).after(`<td>添加到抢课列表</td>`); $(`#xsyxxxk_form > div.main_box > div > span > fieldset:nth-child(1)`).before(`<fieldset><legend>抢课列表</legend><table class="datelist" cellspacing="0" cellpadding="3" border="0" id="DataGrid3" style="width:100%;border-collapse:collapse;"><tbody><tr class="datelisthead"><td>课程名称</td><td>教师姓名</td><td>学分</td><td>周学时</td><td>起始结束周</td><td>上课时间</td><td>上课地点</td><td>课程归属</td><td>课程性质</td><td>校区代码</td><td>移除</td></tr></tbody></table></fieldset>`); if (classInfos.length != 0) { for (let i = 0; i < classInfos.length; i ++) { $(`#DataGrid3 > tbody > tr.datelisthead`).after(`<tr><td>${classInfos[i].className}</td><td>${classInfos[i].classTeacher}</td><td>${classInfos[i].classCredit}</td><td>${classInfos[i].classPerWeekTime}</td><td>${classInfos[i].classStartEnd}</td><td>${classInfos[i].classTime}</td><td>${classInfos[i].classClassroom}</td><td>${classInfos[i].classCategory}</td><td>${classInfos[i].classType}</td><td>${classInfos[i].classAreaCode}</td><td><a id="delete${i}">移除</a></td></tr>`); $(`#delete${i}`).on("click", function() { classInfos.splice(i,1); GM_setValue("classInfos", classInfos); window.location.reload(); }); let tr = $("#kcmcGrid > tbody > tr"); for (let j = 1; j < tr.length; j++) { let td = $(tr[j]).children("td"); if ($(td[2]).text() === classInfos[i].className && $(td[5]).text() === classInfos[i].classTime && $(td[4]).text().includes(classInfos[i].classTeacher)) { for (let k = 0; k < 2; k++) { if (!$(td[k]).children("input").is(':checked') && Number($(td[11]).text()) > 0) { $(td[k]).children("input").click(); } } } } } } for (let i = 2; i < nodeList.length + 1; i ++) { $(`#kcmcGrid > tbody > tr:nth-child(${i}) > td:nth-child(17)`).after(`<td><a id="add${i-2}">添加</a></td>`); $(`#add${i-2}`).on("click", function() { let idx = [3, 5, 8, 9, 10, 6, 7, 13, 14, 15]; let text = []; for (let j in idx) { text.push($(`#kcmcGrid > tbody > tr:nth-child(${i}) > td:nth-child(${idx[j]})`).text()); } let selected_class = new ClassInfo(text[0], text[1], text[2], text[3], text[4], text[5], text[6], text[7], text[8], text[9]); if (!classInfos.some(c=> { if (c.className === selected_class.className && c.classTeacher === selected_class.classTeacher && c.StartEnd === selected_class.StartEnd && c.classTime === selected_class.classTime) { toastr.error("<b>请勿重复添加!</b>"); return true; } })) { classInfos.push(selected_class); GM_setValue("classInfos", classInfos); window.location.reload(); } }); } } if ($("#xsyxxxk_form > div.toolbox > div:nth-child(3)").length != 0) { initUI(); if (isRunning) { captchaRecognition(); startToApply(); } } else { let ID = GM_getValue("taskID", null); let isR = GM_getValue("isRunning", false); if (isR) { GM_setValue("taskID", null); GM_setValue("isRunning", false); } } })();