[乱写]CUIT抢课脚本使用 | 祭夜博客
  • 欢迎光临,这个博客颜色有点多

[乱写]CUIT抢课脚本使用

记录 msojocs 4年前 (2020-09-17) 3780次浏览 已收录 2个评论 扫描二维码
文章目录[隐藏]
不是,连课都能卖?这是我没想到的~
import requests
import json
import requests
import re
import time
import os

'''
使用方法:https://www.jysafe.cn/4498.air
author: msojocs
'''
class FC(object):
    cookie = ""
    available = False
    ocrServer = ""
    def __init__(self, cookie, ocrServer):
        self.cookie = cookie
        self.ocrServer = ocrServer
        pass
    
    def fuckCourse(self, profiledId, courseId):
        try:
            body = {
                "optype": "true",
                "operator0": courseId + ":true:0",
                "lesson0":courseId,
                "schLessonGroup_" + courseId:"undefined"
            }
            req = requests.post("http://jwgl.cuit.edu.cn/eams/stdElectCourse!batchOperator.action?profileId=" + profiledId,
                headers={
                    "cookie": self.cookie,
                    "X-Requested-With": "XMLHttpRequest",
                    "Referer" : "http://jwgl.cuit.edu.cn/eams/stdElectCourse!batchOperator.action?profileId=" + profiledId,
                    "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"
                }, data=body, timeout=5, allow_redirects=False)
            req.encoding = 'utf-8'
            
            html = req.text
            ret = re.search(r"margin:auto;\">\n\t\t\t\t(.*)<\/br>", html)
            if ret == None:
                print("cookie过期")
                exit(-1)
                pass
            print(ret.group(1))
            req.close()
            if '成功' in ret.group(1):
                print('get')
                return True
        except Exception as err:
            print("出错")
            print(err)
            return False
        pass
    pass

    def getPic(self):
        url="http://jwgl.cuit.edu.cn/eams/captcha/image.action"
        headers = {
            'cookie': self.cookie
            }
        picReq=requests.get(url=url, headers=headers)
        # print(picReq.content)
        return picReq.content
        pass

    def postOCRPic(self, pic):
        url = self.ocrServer
        files = {'captcha': pic}
        data = {
            'enctype':'multipart/form-data',
            'name':'captcha'
            }
        ocrReq=requests.post(url=url, data=data, files=files)
        # print(ocrReq.content)
        return json.loads(ocrReq.content)
        pass

    '''
    '''
    def checkCaptcha(self, captcha, profiledId):
        url="http://jwgl.cuit.edu.cn/eams/stdElectCourse!defaultPage.action"
        headers = {
            'cookie': self.cookie
            }
        data = {
            'captcha_response': captcha,
            'electionProfile.id': profiledId
        }
        checkReq = requests.post(url=url, headers=headers, data=data, allow_redirects=False)
        # print(checkReq.text)
        # 未登录与验证码错误都是302,但Location去向不同
        if checkReq.status_code == 200 :
            self.available = '操作 失败:不在选课时间内' not in checkReq.text
            return True
        elif 'sso' in checkReq.headers['Location']:
            # 转到统一登录中心
            print('cookie失效!!!')
            exit(1)
        return False
        pass
    
    def isAvailable(self, captcha, profiledId):
        url="http://jwgl.cuit.edu.cn/eams/stdElectCourse!defaultPage.action"
        headers = {
            'cookie': self.cookie
            }
        data = {
            'captcha_response': captcha,
            'electionProfile.id': profiledId
        }
        checkReq = requests.post(url=url, headers=headers, data=data, allow_redirects=False)
        # print(checkReq.text)
        # 未登录与验证码错误都是302,但Location去向不同
        if checkReq.status_code == 200 :
            return '操作 失败:不在选课时间内' not in checkReq.text
        elif 'sso' in checkReq.headers['Location']:
            # 转到统一登录中心
            print('cookie失效!!!')
            self.cookie = input("请输入新的cookie:")
            False
        return False
        pass


################### 入口 ###########################
if __name__ == "__main__":
    # 加载配置
    with open('config.json',encoding='utf-8') as f:
        config = json.load(f)
    cookie = None
    profiledId = None
    courseId = None

    if cookie == None:
        cookie = input("请输入cookie:")
    if profiledId == None:
        profiledId = input("请输入profiledId:")
    if courseId == None:
        courseId = input("请输入courseId:")
    print("开始了呀")
    cuit = FC(cookie, config['ocr_server'])
    
    # 验证码
    cnt = 0
    while True:
        pic = cuit.getPic()
        ocrResult = cuit.postOCRPic(pic)
        print('OCR: ' + ocrResult['result'])

        # 按识别出来的验证码写入文件
        with open('pic/' + ocrResult['result'] + '.jpg', 'wb') as file:
            file.write(pic)

        checkResult = cuit.checkCaptcha(ocrResult['result'], profiledId)
        if checkResult:
            break
        cnt += 1
        time.sleep(0.5)
        if cnt % 5 == 0:
            print('验证码错误次数过多, 等待5秒')
            time.sleep(5)

    print('验证码检测通过,等待1秒')
    time.sleep(1)
    # 检测开放状态
    print('检测选课开放状态')
    cnt = 0
    while True:
        if cuit.isAvailable(ocrResult['result'], profiledId):
            break
            pass
        cnt += 1
        print('没有到选课时间,等待5秒 - ' + str(cnt))
        time.sleep(5)

    # 抢课
    print('开始抢课')

    i= 0
    while True:
        i += 1
        print(i)
        if cuit.fuckCourse(profiledId, courseId):
            break
        time.sleep(0.5)
        if i >= 20:
            i = 0
            os.system("cls")
            pass
        pass
    pass

profiledId可以直接看见

 

[乱写]CUIT抢课脚本使用

 

LessonId获取

[乱写]CUIT抢课脚本使用

cookie获取

[乱写]CUIT抢课脚本使用
[乱写]CUIT抢课脚本使用


祭夜の咖啡馆 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:[乱写]CUIT抢课脚本使用
喜欢 (5)
[1690127128@qq.com]
分享 (0)
发表我的评论
取消评论
OwO表情
贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. az,是大佬了。
    L_inkOO2021-01-04 17:00 回复 Linux | Chrome 77.0.3865.120
    • cqcadmin
      #(小嘴滑稽)
      祭夜2021-01-04 17:05 回复 Windows 10 | Chrome 87.0.4280.88