// ==UserScript== // @name 东南大学抢课助手 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 听说你抢不到课 // @author realhuhu // @match http://newxk.urp.seu.edu.cn/xsxkapp/sys/xsxkapp/* // @icon https://huhu-1304907527.cos.ap-nanjing.myqcloud.com/share/qkzs // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; (_ => { _.init = () => { window.raw = {} window.result = [] getAllCourses() } let getAllCourses = () => { $.ajax({ type: "POST", url: "http://newxk.urp.seu.edu.cn/xsxkapp/sys/xsxkapp/elective/recommendedCourse.do", data: buildQueryTCParam(""), dataType: "json", ContentType: "application/json", beforeSend: XMLHttpRequest => { XMLHttpRequest.setRequestHeader("token", sessionStorage["token"]) }, success: data => { window.allCourses = data.dataList window.allCoursesId = getAllCoursesId(data.dataList) } }) } let getAllCoursesId = allCourses => { let allCoursesId = [] allCourses.forEach(value => { value.tcList.forEach(value => { allCoursesId.push(value.teachingClassID) }) }) return allCoursesId } let getSingleCourse = id => { let courseName = "" let teacherName = "" let info = {} allCourses.forEach(value => { courseName = value.courseName value.tcList.forEach(value => { if (value.teachingClassID === id) { teacherName = value.teacherName info = {course: courseName, teacher: teacherName} } }) }) return info } _.updateRaw = id => { if (window.raw[id] === undefined) { let index = Object.keys(window.raw).map(s => s.substr(0, s.length - 2)).indexOf(id.substr(0, id.length - 2)) if (index === -1) { window.raw[id] = getSingleCourse(id) $.bhTip({ content: "已添加", state: "success", hideWaitTime: 1000 }) } else { window.raw.length = 0 Object.keys(window.raw).splice(index, 1, id).forEach(key => { raw[key] = getSingleCourse(key) }) $.bhTip({ content: "已替换", state: "success", hideWaitTime: 1000 }) } } else { $.bhTip({ content: "你已经添加过这门课了", state: "danger", hideWaitTime: 2000 }) } Components.reloadList() } })(window.Courses = window.Courses || {}); (_ => { _.mount = () => { createTag() createPanel() createModal() createAddButton() } let createTag = () => { let target = $(".cv-icons")[0] let wrap = document.createElement("div") wrap.setAttribute("class", "cv-user-icon cvMiniIconFlag") wrap.setAttribute("title", "抢课列表") wrap.setAttribute("onclick", "toggle()") wrap.innerHTML = tagTemplate() target.appendChild(wrap) } let createPanel = () => { let target = $("body")[0] let wrap = document.createElement("div") wrap.setAttribute("class", "panel hide") wrap.setAttribute("style", "display:none") wrap.innerHTML = panelTemplate() target.appendChild(wrap) } let createModal = () => { let target = $("body")[0] let wrap = document.createElement("div") wrap.setAttribute("class", "musk cover") wrap.setAttribute("style", "display:none; z-index:10000000;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,0.8)") wrap.innerHTML = _.modalTemplate(result) target.appendChild(wrap) } let createAddButton = () => { let row = [] let cards = [] new Promise((resolve, reject) => { let timer = setInterval(() => { row = $("article .cv-row") if (row.length !== 0) { clearInterval(timer) resolve() } }, 10) }).then(successMessage => { for (let i = 0; i < row.length; i++) { row[i].addEventListener("click", () => { new Promise((resolve, reject) => { let timer = setInterval(() => { let target = row[i] cards = target.getElementsByClassName("cv-info") if (cards.length !== 0) { clearInterval(timer) resolve() } }, 10) }).then(successMessage => { for (let j = 0; j < cards.length; j++) { let target = cards[j] let id = target.querySelectorAll("button[tcid]")[0].getAttribute("tcid") if (target.getElementsByClassName("add").length === 0) { let wrap = document.createElement("div") wrap.setAttribute("class", "cv-caption-text cv-operation add") wrap.innerHTML = '' target.appendChild(wrap) } } }) }) } }) } let tagTemplate = () => '' + '' + '' + '' let panelTemplate = () => { let content = '' content += '
' content += '

东大抢课脚本

' content += '
' content += '' content += '
' content += listTemplate(raw) content += '
' content += '
' content += '
' content += '
' content += '
' return content } let listTemplate = raw => { let content = '' content += '
' content += '
' content += '
已选课程
' content += '
教师
' content += '
操作
' content += '
' if (JSON.stringify(raw) !== '{}') { content += '
' Object.keys(raw).forEach(key => { let course = raw[key].course let teacher = raw[key].teacher content += '
' content += '
' + course + '
' content += '
' + teacher + '
' content += '
' content += '
' }) content += '
' } else { content += "

还未选择课程

" } content += '
' return content } _.modalTemplate = result => { let content = '' content += '
' content += '
' content += '
' content += '
' content += '
课程
' content += '
结果
' content += '
' content += '
' result.forEach(value => { let course = value.course let result = value.result content += '
' content += '
' + course + '
' content += '
' + result + '
' content += '
' }) content += '
' content += '
' content += '
' content += '' content += '
' return content } _.reloadList = () => { $(".list-wrap")[0].innerHTML = listTemplate(raw) } })(window.Components = window.Components || {}); (() => { window.toggle = () => { let target = $(".panel") if (target.hasClass("hide")) { target.removeClass("hide") target.removeAttr("style") } else { target.addClass("hide") target.attr("style", "display:none") } } window.removeCourse = key => { delete raw[key] Components.reloadList() $.bhTip({ content: "已移除", state: "success", hideWaitTime: 1000 }) } window.enterCourse = e => { let evt = window.event || e; if (evt.keyCode === 13) { let target = $("#enter") let id = target.val() id = "202020214" + id if (allCoursesId.indexOf(id) !== -1) { if (raw[id] === undefined) { target.val("") Courses.updateRaw(id) } else { $.bhTip({ content: "你已经添加过这门课了", state: "danger", hideWaitTime: 2000 }) } } else { $.bhTip({ content: "无效的课程代码,请重新输入", state: "danger", hideWaitTime: 2000 }) } } } window.crab = () => { if (JSON.stringify(raw) === '{}') { $.bhTip({ content: "你还没有选择课程!!!", state: "danger", hideWaitTime: 2000 }) } else { window.result.length = 0 let posts = [] Object.keys(raw).forEach(key => { let param = buildAddVolunteerParam(key) posts.push($.ajax({ type: "POST", url: "http://newxk.urp.seu.edu.cn/xsxkapp/sys/xsxkapp/elective/volunteer.do", data: param, dataType: "json", ContentType: "application/json", beforeSend: XMLHttpRequest => { XMLHttpRequest.setRequestHeader("token", sessionStorage["token"]) }, success: data => { result.push({"course": raw[key].course + " " + raw[key].teacher, "result": data.msg}) } })) }) $(".crab")[0].innerText = "请等待.." $.when(...posts).done(() => { $(".crab")[0].innerText = "一键抢课" $.bhTip({ content: "抢课完成", state: "success", hideWaitTime: 1000 }) $(".show-result").css("display", "") }) } } window.showResult = () => { let target = $(".musk") if (target.hasClass("cover")) { target.removeClass("cover") target.css("display", "") target[0].innerHTML = Components.modalTemplate(result) } } window.closeResult = () => { let target = $(".musk") target.addClass("cover") target.css("display", "none") } window.addCourse = id => { if (raw[id] === undefined) { Courses.updateRaw(id) } else { $.bhTip({ content: "你已经添加过这门课了", state: "danger" }) } } })(); $(() => { Courses.init() Components.mount() }) }) ();