前言

又到了选课的时间,又一次被教务系统的预选给安排了,硬是一门都没选中。于是想实现有没有自动捡课的方法。就整体分为两种方法,一种是获取get请求然后由python多线程提交去选课,一种是利用自动化测试的selenium库去调用谷歌浏览器模拟人工选课操作。其实就算都是强智系统,但细节上还是有些差别的。所以也有可能无法实现。这里放出两种方法的代码和流程,仅供参考。

方法一:

直接提交选课的数据包(需要cookie和课程ID),先用同学的账号登录教务系统,进入到选课的地方,打开浏览器的开发模式(按F12),点击Network()我这里是谷歌浏览器,如果是其他的找到网络抓包即可。

点击你想选择课程的选课按钮,得到我们需要的数据包。

我们来看下这个数据包的内容,我们需要找到cookie( 你的身份标识),以及我们需要选的课程ID,然后用python模拟提交就OK了。

注意 代码里的User_Agent和Referer也要记得修改,都在数据包里。

下面是代码:

import requests
from future.backports.test.ssl_servers import threading# 获取cookie 和 课程id就可以抢课def qian1():data = 201820192001656# data 是找到的课程ID,因为python没学好,代码写的有点乱# 下面是地址 就是我们抓到的那个数据包的URLurl = 'http://****(学校的地址).edu.cn/jsxsd/xsxkkc/bxxkOper?jx0404id='+str(data)cookie = ' 用找到的cookie替换'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Referer': 'http://........../srun_portal_pc.php?ac_id=1','cookie':cookie}# 一直抢!while True:# 设定5s服务器未应答就放弃这次,鬼知道是服务器炸了还是。。。。mes = requests.get(url, headers=header, timeout=5) # 打印返回的结果,就是弹出来的那个小窗口的内容print(str(1)+str(mes.status_code)+':'+str(mes.text))# 后面是不同的课,因为不能吊在一课树上!
def qian():data = 201820192001302url = 'http://*****/jsxsd/xsxkkc/bxxkOper?jx0404id='+str(data)cookie = '*****cookie'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Referer': 'http://172.30.1.70/srun_portal_pc.php?ac_id=1','cookie':cookie}while True:mes = requests.get(url, headers=header, timeout=5)print(str(0)+str(mes.status_code)+':'+str(mes.text))def qian2():data = 201820192001155url = 'http://****n/jsxsd/xsxkkc/bxxkOper?jx0404id=' + str(data)cookie = 'cookie'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Referer': 'http://172.30.1.70/srun_portal_pc.php?ac_id=1','cookie': cookie}while True:mes = requests.get(url, headers=header, timeout=5)print(str(2)+str(mes.status_code) + ':' + str(mes.text))def main():# 开多线程分开抢课# 接下来就会一直抢课!thread1 = threading.Thread(target=qian)thread2 = threading.Thread(target=qian1)thread3 = threading.Thread(target=qian2)thread4 = threading.Thread(target=qian)thread5 = threading.Thread(target=qian1)thread6 = threading.Thread(target=qian2)thread1.start()thread2.start()thread3.start()thread4.start()thread5.start()thread6.start()main()

方法二:selenium库模拟人工选课

要使用这个方法之前,最好先看一下这一篇文章,了解如何使用selenium库。记得提前安装好selenium库,以及Chromedriver。具体方法可以在csdn搜索。

使用流程

  1. 将脚本内信息填好改好
  2. 运行脚本,此时会打开chrome并且打开登录页,脚本会自行填写学号密码,需要等你填写验证码
# author: Viper
# time: 2020/7/2 12:03# -*- coding: utf-8 -*-from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
chrome_options = webdriver.ChromeOptions()class Qiangke(object):login_url = "https://***.edu.cn/jsxsd/"  #登录页面,修改成你学校的登录地址select_url = "****/jsxsd/xsxk/xsxk_index?jx0502zbid=B563D5935D024C6387445066336AA73B"#修改为登录成功后的界面initmy_url = "https://****/jsxsd/framework/xsMain.jsp"#修改为你选课的界面xh = u"****"  #填写用户名pwd = '****'   #填写密码_user = "****@qq.com" #填写你的邮箱(用于发邮件提醒抢课成功)_pwd = "****"  #授权码,在邮箱里获得_to = "****@qq.com" #收件人邮箱,可以写自己的,帮别人抢课就发别人的course_category = u'公选课选课'  # 这里填写选课种类,这个脚本只能抢跨年级,跨专业,和公选,需输入完整的名字如“专业内跨年级选课”,“跨专业选课”,“公选课选课”class_name = u"美术赏析"  #这里输入你想抢的课的名字(关键字即可)teacher_name = u""  #这里输入你想抢的课的老师的名字def __init__(self):print("开始抢课")def login(self):self.driver.get(self.login_url)self.driver.find_element_by_id("details-button").click()self.driver.find_element_by_id("proceed-link").click()self.driver.find_element_by_name("USERNAME").send_keys(self.xh)self.driver.find_element_by_name("PASSWORD").send_keys(self.pwd)print("等待验证码,自行输入....")while True:if self.driver.current_url != self.initmy_url:sleep(1)else:breakdef send(self, text, send_msg=False):import smtplibfrom email.mime.text import MIMETextmsg = MIMEText(text)msg["Subject"] = "你选课成功了!"msg["From"] = self._usermsg["To"] = self._tos = smtplib.SMTP_SSL("smtp.qq.com", 465)s.login(self._user, self._pwd)s.sendmail(self._user, self._to, msg.as_string())s.quit()def start(self):# 这里需要根据自己的教务系统去修改了,有挺多不一样的地方。所以建议阅读完使用文档再来修改self.driver = webdriver.Chrome(chrome_options=chrome_options)self.login()self.driver.get(self.select_url)self.driver.find_element_by_link_text(self.course_category).click()self.driver.switch_to.frame(self.driver.find_element_by_xpath('//*[@id="mainFrame"]'))self.driver.find_element_by_id('kcxx').send_keys(self.class_name)self.driver.find_element_by_id('skls').send_keys(self.teacher_name)self.driver.find_element_by_value(u"查询").click()cnt = 1while True:try:self.driver.find_element_by_link_text('选课').click()except:self.driver.switch_to.default_content()self.driver.switch_to.frame(self.driver.find_element_by_xpath('//*[@id="mainFrame"]'))self.driver.find_element_by_link_text("选课").click()dig_alert = self.driver.switch_to.alertdig_alert.accept()text = dig_alert.textif text != '选课失败:此课堂选课人数已满!' and text != '':self.send('{}  选课成功'.format(self.class_name))breakelif text == '':dig_alert.accept()cnt += 1if cnt % 200 == 0:print(cnt)if __name__ == "__main__":qiangke = Qiangke()qiangke.start()

python实现强智科技教务系统抢课(两种方法)相关推荐

  1. python登录教务系统_强智科技教务系统python爬虫模拟登录分析(湖南)

    强智科技教务系统python爬虫模拟登录分析(湖南) 本文章仅用作于学习 前提:最近期末到来,想第一时间看到新出成绩的,于是就有了爬取学校教务系统自己的成绩并通过Qmsg酱推送到自己QQ上的想法,目前 ...

  2. python爬虫获取强智科技教务系统学科成绩(模拟登录+成绩获取)

    python爬取强智科技教务系统,以江苏科技大学为例:本人开发的系统作为参考:https://www.wjn1996.cn/estudy/tools/educationLogin.jsp?school ...

  3. 强智科技教务系统验证码识别

    强智科技验证码识别 前言 由于近期在写一个教务系统的爬虫程序,但是网站的验证码让人很头疼,所以笔者临时找了一些资料学习了一下,本人python用的很少,而且在机器学习这块也是新手,从来没有接触过,所以 ...

  4. 强智科技教务系统学科成绩c语言,湖南强智科技教务系统python模拟登录并爬取成绩(财院)...

    其实之前有写过一篇帖子了 在之前使用教务系统的过程中,偶然一次发现登上教务系统后再退出来的后的登录网址竟然不需要验证码,想着之前有写过教务系统的爬虫模拟登录,没验证码的岂不是更好干(之前那次折腾了好久 ...

  5. 用 Python 实现模拟登录正方教务系统抢课

    (点击上方蓝字,快速关注我们) 作者:小苏打 https://vhyz.me/2018/06/12/用Python实现模拟登录正方教务系统抢课/ 最近学校开始选课,但是如果选课时间与自己的事情冲突,这 ...

  6. python租车系统_使用Python实现租车计费系统的两种方法

    您的位置:首页 > 站长学院 > 网络技术    正文内容 使用Python实现租车计费系统的两种方法 使用Python实现租车计费系统的两种方法 更新时间:2018-09-29 18:0 ...

  7. python出租车计费标准_使用Python实现租车计费系统的两种方法

    要求: #出租车计费************************************************************************************** # 要 ...

  8. Python计算程序运行时间秒级/毫秒级的两种方法datetime和time

    Python计算程序运行时间秒级/毫秒级的两种方法datetime和time 简单粗暴,先上代码: import datetime import time# 方法一:datetime.datetime ...

  9. 烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包

    烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包-内有短接点及教程 特点: 1.适用于对应型号的电视盒子刷机: 2.开放原厂固件屏蔽的市场安装和u盘安装apk: ...

最新文章

  1. Spring5源码 - 03 普通对象对应的BeanDefinition是如何存入DefaultListableBeanFactory#beanDefinitionMap 源码分析
  2. mysql8.0 的新特性_MySQL8.0-新特性汇总
  3. pssh批量远程管理
  4. 多层GCN的over-smooth问题
  5. 记录一次redis数据库搭建过程并详细说明配置
  6. 为VS2010添加背景图
  7. STM32G0系列的启动配置与程序下载
  8. 计算机版本低怎么升级,电脑ie浏览器版本过低怎么升级(浏览器版本过低升级步骤)...
  9. jav使用python模型实现方案
  10. socket 10106 解决方法
  11. 计算机开机按f1f2,按f1-电脑开机后要按F1或F2才能进入系统,是怎么回事? 爱问知识人...
  12. python locust在linux下的安装
  13. QQ上保险我的QQ密码谁也偷不走
  14. ftp服务器覆盖文件,ftp 覆盖 服务器 文件
  15. ffmpeg 之ffmpeg 整理流程分析
  16. java+英尺英寸,以英尺和英寸显示英尺的小数点(javascript)
  17. (4.2.29) Android开发学习之基于ZBar实现微信扫一扫
  18. 进击的 JavaScript(四) 之 闭包
  19. HTML5 知识点(第一节)
  20. mysql根据表的一个字段决定去关联(join)那张表格

热门文章

  1. PLSQL查询数据库操作历史记录
  2. 院士联合指导+超强专家阵容+丰厚奖金机会,第十二届“麒麟杯”大赛报名正式开启!
  3. python 下载bing壁纸
  4. MCV 的几种表单提交方式
  5. java入门到成神之路的宝藏资源
  6. 50分钟的Java面试,常见的问题都问到了
  7. 达梦数据库(DM)——配置达梦数据库外部链接——DM到DM的外部链接创建
  8. cp27m与cp27mu的区别
  9. 用nginx反向代理功能将WS转为加密websocket (wss)
  10. 使用multipart/form-data批量上传文件(文件类型可不同)