• python实现强智科技教务系统抢课(两种方法)


    前言

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

    方法一:

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

    image-20200702224248109

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

    image-20200702224333495

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

    image-20200702224433288

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

    下面是代码:

    import requests
    from future.backports.test.ssl_servers import threading
     
     # 获取cookie 和 课程id就可以抢课
     
     
    def qian1():
        data = 201820192001656
        # data 是找到的课程ID,因为python没学好,代码写的有点乱
        # 下面是地址 就是我们抓到的那个数据包的URL
        url = '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 = 201820192001302
        url = '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 = 201820192001155
        url = '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:
                    break
    
        def send(self, text, send_msg=False):
            import smtplib
            from email.mime.text import MIMEText
    
            msg = MIMEText(text)
            msg["Subject"] = "你选课成功了!"
            msg["From"] = self._user
            msg["To"] = self._to
            s = 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 = 1
            while 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.alert
                dig_alert.accept()
                text = dig_alert.text
                if text != '选课失败:此课堂选课人数已满!' and text != '':
                    self.send('{}  选课成功'.format(self.class_name))
                    break
                elif text == '':
                    dig_alert.accept()
    
    
                cnt += 1
                if cnt % 200 == 0:
                    print(cnt)
    
    
    if __name__ == "__main__":
        qiangke = Qiangke()
        qiangke.start()
    
  • 相关阅读:
    懂一点Python系列——快速入门
    DatagridView 控件列顺序与设置的不一样
    WinForm Column cannot be added because its CellType property is null.
    Rabbitmq消息服务器通讯异常: name must not be blank
    Redis 数据库
    redis 安装与使用
    windows 服务的安装与卸载之bat脚本命令
    以超级管理员方式运行bat文件
    CMD 下切换目录
    C#导出Excel后关闭进程EXCEL.EXE
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13307994.html
Copyright © 2020-2023  润新知