Browse Category

Python

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

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

学校的教务系统向来诡异,尤其是在选课的时候,一声不响地就崩了,崩了又崩。为了选到心仪的课程,我们不得不使出洪荒之力。幸好,教二有了 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 编写代码。 Keep Reading

Python+JavaScript 实现自动抢课

环境要求:Python 3 及 selenium 模块,chrome 及 chromedriver 驱动

首先,导入模块及 chromedrive。

from selenium import webdriver
import os
import time

chromedriver = "D:\path\to\chromedriver.exe"
os.environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)

登陆 URP 系统,依次点击“选课管理”和“选课方案”,观察到选课页面为一单独的 frame ,其网址为 http://jwxt.bupt.edu.cn/xkAction.do?actionType=-1。故在登陆后,可直接打开选课界面,并进入校任选课页面。

driver.get('http://jwxt.bupt.edu.cn/')
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() #校任选课

由于课表在一 frame 中,故切换至此 frame 。翻页即跳转,提交即点击事件,而选课即为勾选多选框,且多选框的值为对应课程号和课序号,故可用 JavaScript 脚本检测是否可以选课,并自动选课、提交。

var tars = new Array("3412113011_01","3412113011_02"); #课程号_课序号
var findit = false;
for (var ti = 0; ti < tars.length; ti++){
    input = document.getElementsByTagName("input");
    for (var i = 0; i < input.length; i++) {
        if (input[i].type == "checkbox") {
            if (input[i].value == tars[ti]){
                input[i].checked = true;
                findit = true
                }
            }
        }
    }
if (findit) {
    document.xkActionForm.submit();
}

最后,循环切换页面并执行脚本,直到选课成功,产生 alert。

while True:
    driver.execute_script(xkcommend) #刚刚提到的 JavaScript 脚本
    driver.execute_script("window.location.href='xkAction.do?actionType=3&pageNumber=2'") #page2
    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'")
    driver.implicitly_wait(15)
    driver.execute_script(xkcommend)
    driver.execute_script("window.location.href='xkAction.do?actionType=3&pageNumber=1'")
    time.sleep(4)

杨辉三角生成器

原题在 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

我写的的:

# -*- coding: utf-8 -*-

def triangles():
    ori = [[1],[1,1]]
    i = 1
    while True:
        yield ori[i-1]
        if i > 1:
            ori.append([1] + [ori[i-1][n]+ori[i-1][n+1] for n in range(i-1)] + [1])
        i = i + 1

n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:
        break

别人写的,用了 zip 函数:

# -*- coding: utf-8 -*-

def triangles():
    a = [1]
    while True:
        yield a
        a = [sum(i) for i in zip([0] + a, a + [0])]

n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:
        break

 

另一种方法,和我的差不多:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#第一种方法:triangles函数定义的时候无输入参量指定循环次数,即一直循环,需要在调用函数(利用for函数)中为添置一个中断条件
def triangles():
    N = [1]
    while True:
        yield N
        N.append(0)
        N = [N[i-1] + N[i] for i in range(len(N))] 
n = 0
for t in triangles():
    print(t)
    n=n+1
    if n == 10:
        break