中科大研究生信息平台抢课脚本低级版本

中科大研究生信息平台抢课脚本低级版本

一、引言

源于科大的某些开课学院对非本院的学生开课有限制,原则是本院学生优先选课,之后才会给别的学院的学生开放选课权限,导致选课名额很少甚至没有,而申请加课麻烦并且未必加的上,手动抢课还得盯着屏幕影响干其他事情,如果能写一个脚本出来替代人工的话那简直不要太美妙。

二、思路

中科大用的是统一认证平台,我尝试了一下不知道什么原因爬虫没能通过验证,只好采用手动cookie的方法了。自动选课我们要准备四个东西,第一cookie,第二自己的studentid,第三目标课程的courseid,第四个courseSelectTurnAssoc,现在告诉大家如何获取这些参数:

  1. studentid和courseSelectTurnAssoc**

进入选课系统,没错,下图被我马赛克的画横线的地方就是studentid,第二个马赛克就是courseSelectTurnAssoc的数据
在这里插入图片描述

  1. courseid

    打开浏览器调式模式,对要选的课进行搜索,我们会在调式的地方看到数据包 。在这里插入图片描述
    别错了哟,对应的Network,All,选择std-count数据包
    查看Response就有courseid,我们搜索出了四个,对应上图就有四个知识产权。如果数据包太多,在搜索前clear一下,就是图中右上角灰色的禁止图标。
    在这里插入图片描述

  2. cookie

同样的我们查看Header数据,找到cookie 在这里插入图片描述

至此,我们已经获得程序必要的三个参数

三、程序编写

# 模块引用
import requests
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import threading
#############全局变量管理##################
#cookie 信息 从浏览器获得 该方法避免了 繁琐的 统一认证平台
cookies_str="_ga=GA1.3.79267311.1599554285;UM_distinctid=176902dc65a27-04b32c81e9051b-5a301e44-151800-xxxxxxxxxxxx"
#studentId 这个也得从 浏览器获得
studentId ="15xxxx"
# courseSelectTurnAssoc 
courseSelectTurnAssoc="381"
# 目标课程的 id 从浏览器获得 132506 代表 高级计算机网络 133574 132503表示计算机应用数学,这里计算机应用数学开了两次课
courseId="132512"				#社会计算
###邮箱服务,当选课成功后或者程序报错及时发邮件通知,如果不懂可以删除####
mail_host="smtp.qq.com"  		#设置服务器
mail_user="xxxxx"    			#用户名
mail_pass="xxxxxx"   	#口令 
###########邮箱服务 end###########################################
#设置请求头
req_header = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded'
}
# 选课请求 url
xuanke_url="https://jw.ustc.edu.cn/ws/for-std/course-select/add-drop-response"
# 查询余量 url
# xuanke_yulinag_url = "https://jw.ustc.edu.cn/ws/for-std/course-select/std-count"
# 获得选课请求 url
xuanke_qingqiu_url="https://jw.ustc.edu.cn/ws/for-std/course-select/add-request"
#################程序主体######################################
# 解析cookie
def SetCookies(cookies_str):
    cookies={}
    kv_list=cookies_str.split(';')
    for kv in kv_list:
        l=kv.split("=")
        cookies[l[0]]=l[1]+";Path=/; Domain=.jw.ustc.edu.cn; "
    return cookies

# 获取选课请求id 
def GetXuanKeRequestId(courseId,studentId,courseSelectTurnAssoc):
    payload="studentAssoc="+studentId+"&lessonAssoc="+courseId+"&courseSelectTurnAssoc="+courseSelectTurnAssoc+"&scheduleGroupAssoc=&virtualCost=0"
    response = requests.post(xuanke_qingqiu_url, headers=req_header, data=payload,cookies=SetCookies(cookies_str))
    if response.status_code==200:
        return response.text
    else:
        return ""
# 返回结果示例
# {'id': 'ecdc71c0-7ef1-11eb-92c9-005056bb0899', 'requestId': 'ecdbfca1-7ef1-11eb-a295-005056bb0c34', 'exception': None, 'errorMessage': {'textZh': '不符合选课条件组要求', 'textEn': 'No suitable selection group', 'text': '不符合选课条件组要求'}, 'success': False}
# {'id': '6449908f-7ef2-11eb-92c9-005056bb0899', 'requestId': '6448cd44-7ef2-11eb-a295-005056bb0c34', 'exception': None, 'errorMessage': {'textZh': '同课程代码只能选一门', 'textEn': 'Duplicate courses are not allowed', 'text': '同课程代码只能选一门'}, 'success': False}
# {'id': '78a1b1bc-7ef2-11eb-92c9-005056bb0899', 'requestId': '78a13ca6-7ef2-11eb-a295-005056bb0c34', 'exception': None, 'errorMessage': None, 'success': True}

# 选课请求
def PostXuanKe(courseId,studentId,courseSelectTurnAssoc):
    try:
        requestId = GetXuanKeRequestId(courseId,studentId,courseSelectTurnAssoc)
        if requestId:
            payload="studentId="+studentId+"&requestId="+requestId
            response = requests.post(xuanke_url, headers=req_header, data=payload,cookies=SetCookies(cookies_str))
            if response.status_code==200:
                if response.json():
                    result = response.json()
                    if result["success"]:
                        print("选课成功!")
                        # 如果没有邮箱服务请注释
                        SnedEmail("接收邮箱号","选课成功!")
                        return True
                    else:
                        print(result["errorMessage"]["textZh"])
                        return False
                else:
                    return False
            else:
                print("执行选课失败")#这个错误很可能是cookies到期了 需要 检查程序
                SnedEmail("接收邮箱号","执行选课失败")
                return False
        else:
            print("获取请求失败")#这个错误很可能是cookies到期了 需要 检查程序
            SnedEmail("接收邮箱号","执行选课失败")
            return False
    except Exception as e:
        print(e)
        SnedEmail("接收邮箱号","程序报错")
        return False


# 邮箱服务,如果没有请删除
def SnedEmail(resv,msg):
    sender = mail_user	# 发件人
    receivers = [resv]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    message = MIMEText(msg, 'plain', 'utf-8')
    message['From'] = Header("程序员", 'utf-8')   # 发送者
    message['To'] =  Header("结果通知", 'utf-8')        # 接收者
    message['Subject'] = Header(msg, 'utf-8')
    try:
        smtpObj = smtplib.SMTP()#注意Windows 和 Linux此处有区别 否则邮箱会发不出去,linux用smtplib.SMTP_SSL()
        smtpObj.connect(mail_host, 25)    # linux系统用465
        smtpObj.login(mail_user,mail_pass)  
        smtpObj.sendmail(sender, receivers, message.as_string())
        print("邮件发送成功")
    except smtplib.SMTPException:
        print("Error: 无法发送邮件")

# 任务函数
def run(courseId):
    while(1):
        result=PostXuanKe(courseId,studentId,courseSelectTurnAssoc)
        if result:
            break#选课成功 终止任务
        time.sleep(3)# 3秒执行一次选课,可以减少时间间隔2秒 1秒

# 入口函数 目的是为了多线程
def main():
    t1 = threading.Thread(target=run, args=("132581",))#组合数学
    t1.start()
# 执行入口函数
main()

四、测试

我把它放在了Centos服务器上托管运行的,指令是nohup,具体可以百度使用方法,python用的是3版本,测试解决还不错
在这里插入图片描述
在这里插入图片描述

四、总结

按照我的经验,有些课程其实没必要抢,即使一开始你看是满课,但是随着时间的推移有些人会退课的,但是会有个别的课及其火热,比如计算机应用数学,很难抢课,该脚本并没有非法的技术手段,利用的是别人退选的机会迅速抢课,或者开放权限之后迅速做出相应。希望大家可以抢到喜欢的课。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖人称王某人的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值