SZTU抢课脚本python

声明:这篇代码是我基于我向我的部长学习的,带有一些理解和稍微一丢丢的改善,就是把他的一些模块套入到循环里这样可以一次性枪很多课,不过写的不是并发的所以会有顺序导致的无法同时抢很多课,而是抢完一个又一个
在这里也附上大佬的链接!!!
https://github.com/Louis0052/SZTU_select_course.git

结果:

代码原理:

利用selenium爬虫去模拟人去点击和输入,并且调用js去选课

详细代码分析:

截取部分,大部分是重复的

1.调整相关设置


链接是这个页面

2.模拟登录点击

输入你的学号跟密码



讲解下第一个点击,原因是教务有时候输入账号密码需要上面点击一下,所以我就写了个点击!!

就是找到那个需要点击的模块然后用selenium去模拟人为点击就好了
之后的点击就是一步一步来了

3.跳转页面

请求的页面会变成第一个,所以加上

driver.window_handles[0]调整要控制的页面

4.设置要抢的课


这是某个课程的特征码
具体怎么看是鼠标右键,然后点击检查


鼠标放在我圈主的地方然后点击就可以看到了

第一个就是我们的my_jx0404id参数,第二个就是我们的my_kcid参数

我们有多门课的话我们就一列一列对应,用单引号闭合着

然后调用js去选课(这一段大佬重点我觉得,最开始我想要click去模拟但是一直没模拟出来,js直接搞出来了)

5.运行代码

修改后的源码:

​
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from time import sleep, strftime, localtimeoption = webdriver.EdgeOptions()
option.add_experimental_option("detach", True)  # 开启实验模式,不让浏览器关闭因为资源会回收
# option.add_argument("--headless")             # 隐藏浏览器,但是写的时候最好打开,这样可以看到模拟过程
option.add_argument('user-agent=ywy')           #设置ua头
driver = webdriver.Edge(options=option)
url = r"https://auth.sztu.edu.cn/idp/authcenter/ActionAuthChain?entityId=jiaowu"  # 要访问的教务系统地址def bool_exist(driver, path):  # 这个函数比较重要,它可以识别你的网页是否加载出来,如果没加载出来就继续等while 1:                   # 加载出来就可以返回寻找的路径,然后去模拟点击try:ele = driver.find_element(By.XPATH, path)return eleexcept NoSuchElementException:print("Element not found. Keep trying again.")sleep(0.5)def login_to_jw(username, passwd):driver.get(url=url)span_element = bool_exist(driver, "//span[@class='tab tab1' and @title='用户名密码认证']")  # 调用判断的函数span_element.click()      # 模拟点击input_username = driver.find_element(By.ID, "j_username")input_username.send_keys(username)sleep(0.5)input_passwd = driver.find_element(By.ID, "j_password")input_passwd.send_keys(passwd)sleep(0.5)login_button = driver.find_element(By.ID, "loginButton")login_button.click()# 成功登录link_element = bool_exist(driver, "//a[@href='/jsxsd/xsxk/xklc_list?Ves632DSdyV=NEW_XSD_PYGL']")link_element.click()# 成功进入选课界面1link_element = bool_exist(driver, "//a[contains(text(), '进入选课')]")link_element.click()last_button = bool_exist(driver, "//input[@value='进入选课']")last_button.click()sleep(5)# 进入到了选课界面def jump_coursepage(kind):match kind:case '1':driver.get('https://jwxt.sztu.edu.cn/jsxsd/xsxkkc/comeInBxqjhxk')case '2':driver.get('https://jwxt.sztu.edu.cn/jsxsd/xsxkkc/comeInGgxxkxk')case _:print('Course type error')driver.quit()exit()return driverdef choice_course(kind, my_jx0404id, my_kcid):# kind是选课类型,计划内还是公选js_method = ""js_jhn = f"xsxkOper('{my_jx0404id}','','','{my_kcid}','null','null');"  # 这是必修课的格式js_gxk = f"xsxkFun('{my_jx0404id}','{my_kcid}','null');"                # 公选课的格式match kind:case '1':js_method = js_jhnreturn js_methodcase '2':js_method = js_gxkreturn js_methodcase _:print('course type error')exit()def select_course(js_method):try_time = 1while True:driver.execute_script(js_method)  # 控制台执行选课js方法select_status = driver.switch_to.alert.text  # 获取选课状态if '你确认选择' in select_status:driver.switch_to.alert.accept()select_status = driver.switch_to.alert.text# sleep(0.5)driver.switch_to.alert.accept()if '选课成功' in select_status:print(strftime('%Y-%m-%d %H:%M:%S', localtime()), select_status)returnelif '已选择' in select_status or '冲突' in select_status:print(select_status)returnelse:  # 为了能够第一时间抢课,即使不在选课时间范围时程序也将持续运行print(select_status)try_time += 1sleep(2)print(f'第{try_time}次自动选课中...')if __name__ == '__main__':username = "your student's num"passwd = "your student's password"kind_list = ['1', '1', '2'] # 1是计划内选课 2是公选课my_jx0404id_list = ['xxx', 'xxx', 'xxx']my_kcid_list = ['xxx', 'xxx', 'xxx']course_num = len(kind_list)login_to_jw(username, passwd)for i in range(0, course_num):  # 用循环嵌套然后可以多门课js_method = ""   #  下面这个函数是为了获取js需要模拟点击的部分,与课程相关,经过一定上面参数的组合js_method = choice_course(kind_list[i], my_jx0404id_list[i], my_kcid_list[i])jump_coursepage(kind_list[i])driver.window_handles[0]select_course(js_method)​

最开始是想自己写的,但是遇到很多困难,例如页面加载比较慢,我就睡眠2s那样很笨,还有在选课的时候如果不调用js而是直接去点击的话也会麻烦很多,会出很多事情,所以我觉得大佬的思路挺好的。有些不改变的页面点击我就get请求,然后去操作那个请求的页面。学到挺多的

这个跨年级选课和跨专业选课因为需要自己提前搜索才会显示所以我没实验,计划内和公选课是可以成功的!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498931.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android开发书籍推荐,android面试复习

笼统来说,中年程序员容易被淘汰的原因其实不外乎三点。 1、输出能力已到顶点。这个人奋斗十来年了,依旧碌碌无为,很明显这人的天花板就这样了,说白了,天赋就这样。 2、适应能力越来越差。年纪大,有家庭&…

qt5.15 升级 qt 6.5 部分问题 解决修复

报错 QT5_USE_MODULES 升级 QT6_ADD_RESOURCES qt_add_resources Compiles binary resources into source code. CMake Commands in Qt6 Core | Qt Core 6.6.2

HCIA-Datacom实验指导手册:6 构建基础 WLAN 网络

HCIA-Datacom实验指导手册:6 构建基础 WLAN 网络 一、实验介绍:二、实验拓扑:三、实验目的:四、配置步骤:1.掌握ap上线的配置方式和上线过程。ac配置验证 步骤 2 掌握隧道模式和旁挂模式下ac的配置。步骤 3 掌握查看ap…

4、正则表达式、本地存储

一、正则表达式 1、定义 用事先定义好的一些特定字符,这样的字符组合,组合成一个“规则字符串” 2、正则的组成 特殊字符 字母、数字、下划线、中文、特殊字符… 元字符(常用) 1、\d 匹配至少有一个数字 var reg /\d/ /…

【ElfBoard】基于 Linux 的智能家居小项目

大家好,我是 Hello阿尔法,这段时间参与了保定飞凌嵌入式技术有限公司举办的 ElfBoard 共创社招募活动,并有幸成为了一名共创官,官方寄来了一块 ELF 1 开发板,开箱看这里 ELF 1 开箱初体验。 作为共创官,我…

视频转字幕文字的方法有哪些?这些方法轻松搞定

怎么样通过视频链接将文字转化出来?当我们刷到一个喜欢的视频文案,想要复制出来已做借鉴,这个时候就需要用到一些神奇的AI工具。随着人工智能技术的不断发展,视频链接转文字已经变得越来越容易。现在市面上有很多在线工具可以将视…

任务创建和调度器开启

目录 一、任务创建 二、静态任务和动态任务创建的区别 三、任务调度 1、vTaskStartScheduler()调度器: 2、内核相关硬件初始化函数分析:xPortStartScheduler() 3、启动第一个任务函数分析:prvStartFirstTask() 4、SVC中断服务函数 5、…

优思学院|质量工程师需要学习什么软件?

初入职质量工程师的朋友常常会问:质量工程师需要学习什么软件?在质量控制和管理的世界里,拥有强大的数据分析工具是走向成功的关键,因此,对于质量工程师来说,掌握正确的软件不仅能提升工作效率,…

NebulaGraph基础(默认看了入门篇)

感谢阅读 官方链接运算符比较运算符布尔符管道符集合运算符UNION、UNION DISTINCT、UNION ALL官方示例代码(并集)INTERSECT官方示例代码(交集)MINUS 字符串运算符官方代码(字符串) 列表运算符算术运算符 Ne…

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…

简单了解B树和B+树

目录 B树 B树 B树和B树的结构示意图 总结 B树和B树是两种非常重要的树状数据结构,它们广泛应用于数据库和文件系统的索引结构中。这两种数据结构能够帮助我们高效地管理、查询以及更新大量的数据。下面,我将简单介绍它们,以及他们之间的区别。 B树 B…

同源不同页面之间的通信,SharedWorker使用

同源不同页面之间的通信,SharedWorker使用 描述实现结果 描述 同源不同页面之间的通信,使用SharedWorker,或者使用全局方法通信,这里使用SharedWorker来实现 mdn地址:https://developer.mozilla.org/zh-CN/docs/Web/A…