学校选修课抢课脚本的简易创建

前言

刚到中午13:00便是学校内数以万计的人开始准备抢课,这让第一次抢课的我显得有些手足无措,在其他同学的猛烈攻势下,网课瞬间被掏空了,随即便是那些性价比较高的学科。而我只能当一个🐀人,捡剩下没人要的课程。一番折腾下来只拿到了高数进阶与数学建模…让本来是学工科的我,又多了一些工科…为了改变两个都是工科的现状,我决定用自动化脚本进行捡漏,抢课?都没课了只能捡漏,打算~~(偷交易课程人的屁股)~~顺便实践一下学习的requests库的使用。于是在得到学长前代的捡漏脚本后对其进行了部分升级。

代码实现

在升级之前,我们可以得知网页选课都是发送请求包给后台,后台判定人是否已经满了,之后再决定你是否选课成功。

对此我们则使用requests对学校网页端请求得到其对应的Html代码,之后再使用正则表达式找到对应关键部分,进行搜索,判断哪些课程可以捡漏,之后发送对应的请求包,完成此次捡漏~~(偷屁股)~~的工作。


实现代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import requests
import re
import time
from concurrent.futures import ThreadPoolExecutor

def PD(id, co, pd):
url = "XXX" + pd
op = {
"optype": "true",
"operator0": id + ":true:0",
"lesson0": id,
"schLessonGroup_" + id: "undefined"
}
headers = {
"cookie": co,
"X-Requested-With": "XMLHttpRequest",
"Referer": "XXX" + pd,
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.0 Safari/537.36 Edg/84.0.521.0"
}

res = requests.post(url=url, headers=headers, data=op, timeout=5, allow_redirects=False)

# print(res.text)
ret = re.search(r"margin:auto;\">\n\t\t\t\t(.*)<\/br>", res.text)

if "请不要过快点击" in res.text:
print("Too Fast")
else:
print(ret.group(1))


if __name__ == '__main__':
co = input("cookie?")
id = ['74017']
pd = '3016'

# 创建线程池
with ThreadPoolExecutor(50) as t:
for i in range(100):
t.submit(PD, id=id, co=co, pd=pd)
time.sleep(1)

由于不会验证码绕过的菜鸡,只能自己手动抓取Cookie输入来对其发起Post请求,达到绕过登录的问题。同时加入了线程池,实现对该线程循环请求。(实际上还是单线程,任务链接只有一个)


学校选修课抢课脚本的简易创建
https://equinox-shame.github.io/2022/03/14/学校选修课抢课脚本的简易创建/
作者
梓曰
发布于
2022年3月14日
许可协议