成信大抢课

成信大首个抢课脚本

目前為 2021-12-24 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         成信大抢课
// @namespace    成信大抢课
// @version      0.13
// @description  成信大首个抢课脚本
// @author       shiouhoo
// @include     *://jwgl*cuit*edu*cn*/eams/stdElectCourse!defaultPage.action*
// @require     https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js
// @grant       unsafeWindow
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_openInTab
// @grant       GM_xmlhttpRequest
// @license     GPL License
// @connect      116.62.126.210
/* globals jQuery, $, waitForKeyElements,hh */
// ==/UserScript==
(function() {
    'use strict';
    var optition = {
        method: '2', //1:指定课程 , 2:指定类型
        courses: ['从欧几里德到人工智能',''],//指定课程时生效,需请保留引号,如:["",""]
        type:['艺术与审美','创新创业教育'], //指定类型时生效,
        isOnlyOnline: true, //是否只抢网课,指定类型时生效
        electTime:'13:00',//抢课时间
    }
    optition.timeLoop = []
    optition.reMainTime = ''
    optition.visibility = true
    optition.selectedCourse = []
    optition.selectedCourseNumber = 0
    optition.selectedTypeNumber = 0
    var BT = 0;
    var differTime = 0;
    function sleep(d){
        var t = Date.now();
        while(Date.now() - t <= d){}
    }
    unsafeWindow.confirm = function(e) {
        sleep(300)
        if(/是否提交/.test(e)){
            return true
        }
    }
    unsafeWindow.alert = function(e) {
        sleep(300)
        console.log('提示:'+e)
        if(optition.method === '1'){
            optition.selectedCourseNumber += 1
            if(optition.selectedCourseNumber == optition.selectedCourse.length){selectedOneCourseSuccess();return }
            setTimeout(()=>{
                selectOneCourse(optition.selectedCourse[optition.selectedCourseNumber])
            },10)
        } else if(optition.method === '2'){
            optition.selectedCourseNumber += 1
            if(optition.selectedCourseNumber == optition.selectedCourse[optition.selectedTypeNumber].length){
                optition.selectedCourseNumber += 1
                optition.selectedCourseNumbe = 0
            }
            if(optition.selectedTypeNumber >= optition.selectedCourse.length){
                selectedOneCourseSuccess()
                return
            }
            if(optition.selectedCourse[optition.selectedTypeNumber].length != 0){
                setTimeout(()=>{
                    selectOneCourse(optition.selectedCourse[optition.selectedTypeNumber][optition.selectedCourseNumber])
                },10)
            }
        }
        return true
    }
    async function hh(){
        if(await checkLoginEd()){
            let baseInformation = $.parseJSON(await getBaseInformation())
            $('body').append(`
	  <div class='myAlert'>
	  <div class='title'>${baseInformation.title}</div>
	  <div class='content'>${baseInformation.welcomeTip}</div>
	  <div class='setting'>
		<div class='settingOne'>
		<span>抢课类型</span>
		<select style='padding: 3px 8px;'>
		<option value ="1">指定课程</option>
        <option value ="2">指定类型</option>
	    </select><span>&nbsp;**指定课程抢课时间:${optition.electTime}</span></div>
		<div class='settingTwo'>
		<span style='margin-right:1em'>课程名</span>
        <span style="width:236px">
		<input id='courseInputOne'></input><span style='color:red;display:none'>&nbsp;&nbsp;*不可为空</span>
		<input id='courseInputTwo' style='display: block;margin-top:10px'></input>
        <span style='color:red;display:none;float: right;margin-top: -22px;'>&nbsp;&nbsp;*不可为空</span></span>
	    </div></div>
		<div class='running'>
			<div></div>
		</div>
		<div class='bottom'><span class='cancel'>暂停</span><span class='okey'>确定</span>
	</div></div>`)
            $('.myAlert').css({
                'position': 'fixed',
                'z-index': '9999',
                'width': '400px',
                'top': '5%',
                'left': '30px',
                'text-align': 'center',
                'border-radius': '8px',
                'flex-direction': 'column',
                'background': 'rgb(241,241,241)',
            })
            $('.myAlert .title').css({
                'background': 'rgb(216,237,246)',
                'font-size': '22px',
                'padding':'5px 0',
                'user-select': 'none',
            })
            $('.myAlert .content').css({
                'background': 'rgb(241,241,241)',
                'text-align': 'left',
                'text-indent':'2em',
                'padding-left':'4px',
            })
            $('.myAlert .setting').css({
                'display': 'flex',
                'flex-direction': 'column',
                'align-items': 'baseline',
                'margin': '1em',
                'text-align':'left'
            })
            $('.myAlert .setting>div').css({
                'margin': '5px 0',
            })
            $('.myAlert .settingTwo').css({
                'display': 'flex',
            })
            $('.myAlert .running').css({
                'display': 'none',
                'flex-direction': 'column',
                'align-items': 'baseline',
                'margin': '1em',
                'text-align':'left'
            })
            $('.myAlert .bottom').css({
                'width':'100%',
                'background': 'rgb(241,241,241)',
                'margin':'5px 0',
                'display':'flex',
                'justify-content': 'space-evenly',
            })
            $('.myAlert .bottom .cancel').css({
                'font-size':'24px',
                'padding': '0 14px',
                'border': '1px rgb(216,237,246) solid',
                'border-radius': '7px',
                'color': 'white',
                'background': 'rgb(134,203,234)',
                'cursor':'pointer',
            })
            $('.myAlert .bottom .okey').css({
                'font-size':'24px',
                'padding': '0 14px',
                'border': '1px rgb(216,237,246) solid',
                'border-radius': '7px',
                'color': 'white',
                'background': 'rgb(134,203,234)',
                'cursor':'pointer',
            })
            console.log('抢课助手开始运行')
            $('.myAlert .settingOne option').each(function(){
                if($(this).val()===optition.method){
                    $(this).attr("selected", true)
                }else{
                    $(this).attr("selected", false)
                }
            })
            if(optition.method === '0'){
                $('.myAlert .settingTwo').css('display','none')
            }else if(optition.method === '1'){
                $('.myAlert #courseInputOne').attr('value',optition.courses[0])
                $('.myAlert #courseInputTwo').attr('value',optition.courses[1])
                $('.myAlert .settingTwo span:nth-child(1)').text('课程名')
                $('.myAlert .settingTwo').css('display','flex')
            }else if(optition.method === '2'){
                $('.myAlert #courseInputOne').attr('value',optition.type[0])
                $('.myAlert #courseInputTwo').attr('value',optition.type[1])
                $('.myAlert .settingTwo span:nth-child(1)').text('课程类型')
                $('.myAlert #courseInputOne').next().css('display','none')
                $('.myAlert #courseInputTwo').next().css('display','none')
                $('.myAlert .settingTwo').css('display','flex')
            }
            $('.myAlert .title').click(()=>{
                if(optition.visibility){
                    $('.myAlert').css('visibility','hidden')
                    $('.myAlert .title').css('visibility','visible')
                }else{
                    $('.myAlert').css('visibility','visible')
                }
                optition.visibility = !optition.visibility
            })
            $('.myAlert .settingOne select').change(()=>{
                optition.method = $('.myAlert .settingOne select').val()
                if(optition.method === '0'){
                    $('.myAlert .settingTwo').css('display','none')
                }else if(optition.method === '1'){
                    $('.myAlert #courseInputOne').attr('value',optition.courses[0])
                    $('.myAlert #courseInputTwo').attr('value',optition.courses[1])
                    $('.myAlert .settingTwo span:nth-child(1)').text('课程名')
                    $('.myAlert .settingTwo').css('display','flex')
                }else if(optition.method === '2'){
                    $('.myAlert #courseInputOne').attr('value',optition.type[0])
                    $('.myAlert #courseInputTwo').attr('value',optition.type[1])
                    $('.myAlert #courseInputOne').next().css('display','none')
                    $('.myAlert #courseInputTwo').next().css('display','none')
                    $('.myAlert .settingTwo span:nth-child(1)').text('课程类型')
                    $('.myAlert .settingTwo').css('display','flex')
                }
                GM_setValue("runningDetail",$('.myAlert').prop("outerHTML"))
            })
            $('.myAlert #courseInputOne').keyup((event)=>{
                if(event.keyCode == "13"){
                    $('.myAlert #courseInputTwo').focus()
                }
            })
            $('.myAlert #courseInputTwo').keyup((event)=>{
                if(event.keyCode == "13"){
                    $('.myAlert .bottom .okey').click()
                }
            })
            $('.myAlert .bottom .okey').click(startRun)
            $('.myAlert .bottom .cancel').click(()=>{
                for(var each in optition.timeLoop){
                    clearInterval(optition.timeLoop[each]);
                }
                optition.selectedCourse = []
                optition.selectedCourseNumber = 0
                optition.selectedTypeNumber = 0
                $('.myAlert .bottom .okey').click(startRun)
                $('.myAlert #courseInputOne').prop("disabled",false)
                $('.myAlert #courseInputTwo').prop("disabled",false)
                $('.myAlert .settingOne select').prop("disabled",false)
                $('.myAlert .running').html('<div></div>')
            })
        }
    }
    function getRemainTime(){
        $('.myAlert .running').css('display','flex')
        let temp = optition.electTime.split(':')
        optition.timeLoop[optition.timeLoop.length] = setInterval(()=>{
            let h = new Date().getHours()
            let m = new Date().getMinutes()
            let s = new Date().getSeconds()
            let leftTime = temp[0]*3600 + temp[1]*60 - h *3600 - m * 60 - s
            if(leftTime > 0){
                h = Math.floor(leftTime/60/60%24);
                m = Math.floor(leftTime/60%60);
                s = Math.floor(leftTime%60);
                optition.reMainTime = `${h}:${m}:${s}`
                $('.myAlert .running div:nth-child(1)').text(`开始运行... 倒计时:${optition.reMainTime}`)
            }else{
                console.log('开始抢课')
                $('.myAlert .running div:nth-child(1)').text('正在抢课中...')
                for(var each in optition.timeLoop){
                    clearInterval(optition.timeLoop[each]);
                }
                setTimeout(()=>{electing()},0)
            }
        },310)
    }
    function startRun(){
        $('.myAlert .running').html('<div></div>')
        if(optition.method === '1'){
            ElectByAssigned()
        }else if(optition.method === '0'){
            ElectByLoop()
        }else if(optition.method === '2'){
            ElectByType()
        }
    }
    function verifyInput(){
        let flag = [0,0]
        if ($('.myAlert #courseInputOne').val().length === 0){
            $('.myAlert #courseInputOne').next().css('display','inline')
            flag[0] = 0
        }else{
            $('.myAlert #courseInputOne').next().css('display','none')
            flag[0] = 1
        }
        if ($('.myAlert #courseInputTwo').val().length === 0){
            $('.myAlert #courseInputTwo').next().css('display','inline')
            flag[1] = 0
        }else{
            $('.myAlert #courseInputTwo').next().css('display','none')
            flag[1] = 1
        }
        if(flag[0] && flag[1]){
            return true
        }else{
            return false
        }
    }
    function ElectByLoop(){

    }
    function ElectByType(){
        optition.type[0] = $('.myAlert #courseInputOne').val().trim()
        optition.type[1] = $('.myAlert #courseInputTwo').val().trim()
        $('.myAlert #courseInputOne').attr('value',optition.type[0])
        $('.myAlert #courseInputTwo').attr('value',optition.type[1])
        $('.myAlert #courseInputOne').prop("disabled",'disabled')
        $('.myAlert #courseInputTwo').prop("disabled",'disabled')
        $('.myAlert .settingOne select').prop("disabled",'disabled')
        $('.myAlert .bottom .okey').unbind('click')
        getRemainTime()
    }
    function ElectByAssigned(){
        optition.courses[0] = $('.myAlert #courseInputOne').val().trim()
        optition.courses[1] = $('.myAlert #courseInputTwo').val().trim()
        $('.myAlert #courseInputOne').attr('value',optition.courses[0])
        $('.myAlert #courseInputTwo').attr('value',optition.courses[1])
        $('.myAlert #courseInputOne').prop("disabled",'disabled')
        $('.myAlert #courseInputTwo').prop("disabled",'disabled')
        $('.myAlert .settingOne select').prop("disabled",'disabled')
        $('.myAlert .bottom .okey').unbind('click')
        getRemainTime()
    }
    function electing(){
        $('#cboxContent').bind('DOMNodeInserted',SelectCourse)
        if(optition.method === '0'){
            //待完成
        }else if(optition.method === '1'){
            let code
            for(let i of optition.courses){
                if(i.trim().length == 0){continue }
                code = $(`tr:contains(${i})`).filter(".electGridTr").filter(function(){
                    return $('a',this).text() == '选课'
                })
                if(code.length == 0){
                    $('.myAlert .running').append(`<div>《${i}》没有找到</div>`)
                }else{
                    code.each((index,item)=>{
                        optition.selectedCourse.push(item)
                    })
                }
            }
            if(optition.selectedCourse.length != 0){
                setTimeout(()=>{
                    selectOneCourse(optition.selectedCourse[optition.selectedCourseNumber])
                },0)
            }else{
                selectedOneCourseSuccess()
            }
        }else if(optition.method === '2'){
            let code = null
            let code2 = null
            for(let i of optition.type){
                if(i.trim().length!=0){
                    code = $(`tr:contains(${i})`).filter('.electGridTr').filter(function(){
                        return $('td:nth-child(14)',this).text().length==0 && $('a',this).text() == '选课'
                    })
                    if(!optition.isOnlyOnline){
                        code2= $(`tr:contains(${i})`).filter('.electGridTr').filter(function(){
                            return $('td:nth-child(14)',this).text().length!=0 && $('a',this).text() == '选课'
                        })
                    }
                    let temp = []
                    code.each((index,item)=>{
                        temp[index] = item
                    })
                    if(code2!=null){
                        code2.each((index,item)=>{
                            temp[temp.length+index] = item
                        })
                    }
                    optition.selectedCourse[optition.selectedCourse.length] = temp
                }
            }
            if(optition.selectedCourse[0].length != 0){
                setTimeout(()=>{
                    selectOneCourse(optition.selectedCourse[0][optition.selectedCourseNumber])
                },0)
            }else if(optition.selectedCourse[1].length != 0){
                setTimeout(()=>{
                    optition.selectedTypeNumber += 1
                    selectOneCourse(optition.selectedCourse[1][optition.selectedCourseNumber])
                },0)
            }else{
                selectedOneCourseSuccess()
            }
        }
    }
    function SelectCourse(e){
        let code = $('table div',e.target)
        if(code.length != 0){
            console.log('结果:'+code.text())
            if(optition.method === '1'){
                $('.myAlert .running').append(code.text())
                optition.selectedCourseNumber += 1
                if(optition.selectedCourseNumber == optition.selectedCourse.length){selectedOneCourseSuccess();return }
                setTimeout(()=>{
                    selectOneCourse(optition.selectedCourse[optition.selectedCourseNumber])
                },0)
            } else if(optition.method === '2'){
                if(/失败/.test(code.text())){
                    optition.selectedCourseNumber += 1
                }else{
                    optition.selectedTypeNumber += 1
                    optition.selectedCourseNumber = 0
                }
                if(optition.selectedCourseNumber == optition.selectedCourse[optition.selectedTypeNumber].length){
                    optition.selectedTypeNumber += 1
                    optition.selectedCourseNumbe = 0
                }
                if(optition.selectedTypeNumber >= optition.selectedCourse.length){
                    selectedOneCourseSuccess()
                    return
                }
                if(optition.selectedCourse[optition.selectedTypeNumber].length != 0){
                    setTimeout(()=>{
                        selectOneCourse(optition.selectedCourse[optition.selectedTypeNumber][optition.selectedCourseNumber])
                    },0)
                }
            }
        }
    }
    function selectedOneCourseSuccess(){
        optition.selectedCourse = []
        optition.selectedCourseNumber = 0
        optition.selectedTypeNumber = 0
        $('.myAlert .running').append(`<div>已完成</div>`)
        $('.myAlert .bottom .okey').click(startRun)
        $('.myAlert #courseInputOne').prop("disabled",false)
        $('.myAlert #courseInputTwo').prop("disabled",false)
        $('.myAlert .settingOne select').prop("disabled",false)
    }
    function selectOneCourse(item){
        if(item == undefined){
            console.log('没有找到此门课程')
        }
        let code = $(item).find('a')
        let t = code.text()
        let name = $('td:nth-child(7)',item).text()
        if(t=='选课'){
            let temp = $('td:nth-child(15)',item).text().split("/")
            if(Number(temp[0])<Number(temp[1])){
                code.click()
            }else{
                $('.myAlert .running').append(`<div>${$('td:nth-child(6)',item).text()}:《${name}》已满员</div>`)
                if(optition.method === '1'){
                    optition.selectedCourseNumber += 1
                    if(optition.selectedCourseNumber == optition.selectedCourse.length){selectedOneCourseSuccess();return }
                    setTimeout(()=>{
                        selectOneCourse(optition.selectedCourse[optition.selectedCourseNumber])
                    },0)

                } else if(optition.method === '2'){
                    optition.selectedCourseNumber += 1
                    if(optition.selectedCourseNumber == optition.selectedCourse[optition.selectedTypeNumber].length){
                        optition.selectedCourseNumber = 0
                        optition.selectedTypeNumber += 1
                    }
                    if(optition.selectedTypeNumber >= optition.selectedCourse.length){
                        selectedOneCourseSuccess()
                        return
                    }
                    setTimeout(()=>{
                        selectOneCourse(optition.selectedCourse[optition.selectedTypeNumber][optition.selectedCourseNumber])
                    },0)
                }
            }
        }
    }
    async function checkLoginEd(){
        while(GM_getValue("ECToken") === undefined){
            let str = prompt('请输入令牌:')
            if(str === null){
                return false
            }
            if (str.length !== 0){
                GM_setValue("ECToken",str)
            }
        }
        let token = $.parseJSON(await getToken())
        if(token.canuse != 1){
            alert("维护中,抱歉")
            return false
        }
        while(GM_getValue("ECToken")!=token.token){
            let str = prompt('令牌错误,请重新输入:')
            if(str === null){
                return false
            }
            if (str.length !== 0){
                GM_setValue("ECToken",str)
            }
        }
        return true
    }
    function getToken(){
        return new Promise((resolve, reject) => {
            console.log('检验令牌')
            GM_xmlhttpRequest({
                method: "get",
                url: 'http://116.62.126.210:8080/getToken',
                onload: function(res){
                    if(res.status === 200){
                        resolve(res.responseText)
                    }
                }
            })
        })
    }
    function getBaseInformation(){
        return new Promise((resolve, reject) => {
            console.log('获取信息')
            GM_xmlhttpRequest({
                method: "get",
                url: 'http://116.62.126.210:8080/getBaseInformation',
                onload: function(res){
                    if(res.status === 200){
                        resolve(res.responseText)
                    }
                }
            })
        })
    }
    hh()
})();