北邮选课系统的正确打开方式

前情提要:对不起,你选的可能是假课

学校的教务系统向来诡异,尤其是在选课的时候,一声不响地就崩了,崩了又崩。为了选到心仪的课程,我们不得不使出洪荒之力。幸好,教二有了 Wi-Fi ,我们终于可以扔掉不靠谱的 VPN 了,这大大增大了选到课的可能性。(然而 Wi-Fi 也崩了。。。

但是,选课总还是要靠抢的。与其按坏 F5,不如来点黑科技,也就是主角 Selenium WebDriver。我们可以利用 Python 和 JavaScript 编写自动选课程序。当然,前提是已经正确安装或者下载了 Google Chrome (55)、Python (3.5.1)、ChromeDriver (2.27)、selenium (3.0.2),括号内为最低版本。推荐使用文本编辑器 Sublime Text 3 编写代码。当然,如果你只是对选课感兴趣,可以忽略这一段。

首先,使用 Google Chrome 浏览器打开并登录教务系统。按照普通的选课流程,我们依次点击选课管理、选课方案、校任选课,历经千难万险来到选课界面。如果网页上显示的不是“数据库错误”或者“非选课时段不允许选课”,也不是“您已欠费”,右键单击任何一门课程前面的勾选框,选择“检查”。根据 HTML 知识,不难发现整个网页由好几个相对独立的部分组成,而我们只需关注“确认”键和课程列表所在的部分,这一部分的网址为 http://jwxt.bupt.edu.cn/xkAction.do?actionType=-1,标题为“选课查询”。因此,我们可以直接打开这个网页进入选课界面。

同时,右键单击“下一页”,我们发现每一页课程列表也对应一个网页,它的网址是 http://jwxt.bupt.edu.cn/xkAction.do?actionType=3&pageNumber=%d,其中“%d”用页码代替,如1、2、3。因此,我们可以直接打开这几个网页来翻页。

而选择一门课程就是勾选一个复选框,而对应框的值就是对应课程的“课程号_课序号”。因此,我们可以挨个检查复选框的值,通过勾选对应的框来选择这门课。然后翻页,检查之后再循环翻页、检查,这样就能做到自动抢课了。

最后,通过使用上面的方法检查确认按钮,我们发现点击确认就是执行一段 JavaScript 代码:inforUpContent.xkActionForm.submit(),提交 xkActionForm 中的内容。因此,直接执行这段代码也能达到提交的目的。

于是,我们可以得到这样的程序:

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
from selenium import webdriver
import os
import time

xkcommend = '''var tars = new Array('3412143070_01','3812100013_01','3122105140_02');
var findit = false;
for (var ti = 0; ti < tars.length; ti++){
    input = document.getElementsByTagName("input");
    for (var i = 0; i < input.length && !findit; i++) {
        if (input[i].type == "checkbox") {
            if (input[i].value == tars[ti]){
                input[i].checked = true;
                findit = true
                }
            }
        }
    }
if (findit) {
    document.xkActionForm.submit();
}'''
chromedriver = "D:\software\chrome\chromedriver.exe"
os.environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('http://jwxt.bupt.edu.cn/')
driver.implicitly_wait(7)
str = input("Enter:");
driver.get('http://jwxt.bupt.edu.cn/xkAction.do?actionType=-1')
driver.find_element_by_xpath('/html/body/table[4]/tbody/tr/td/table/tbody/tr/td[11]/a').click()
driver.implicitly_wait(15)
mainiframe = driver.find_element_by_xpath('/html/body/table[5]/tbody/tr/td[1]/table/tbody/tr/td/table/tbody/tr/td/iframe')
driver.switch_to_frame(mainiframe)
while True:
    driver.execute_script(xkcommend)
    driver.execute_script("window.location.href='xkAction.do?actionType=3&pageNumber=2'")
    driver.implicitly_wait(15)
    driver.execute_script(xkcommend)
    driver.execute_script("window.location.href='xkAction.do?actionType=3&pageNumber=3'")
    driver.implicitly_wait(15)
    driver.execute_script(xkcommend)
    driver.execute_script("window.location.href='xkAction.do?actionType=3&pageNumber=4'") #page4
    driver.implicitly_wait(15)
    driver.execute_script(xkcommend)
    driver.execute_script("window.location.href='xkAction.do?actionType=3&pageNumber=1'") 
    time.sleep(5)

然而,这段代码只是个粗制滥造的半成品,它不仅有 bug,而且只能在理(kan)想(lian)状态下运行,遇到一点小问题就可能会崩溃。因此,要想做到真正的自动选课,还得再修改修改。欲知如何修改,且看下回分解。


发表评论