广东外语外贸大学教务系统一键查分

# 基于request, re, pytesseract, PIL 开发的一键查分python。
# 需要输入学号和密码。

# 1.验证码图片识别处理
import pytesseract
from PIL import Image

def ca(filename: str) -> str:
    # Preprocess image for better OCR result.
    def clear_image(image: Image):
        def get_noise_color(image: Image):
            for y in range(1, image.size[1] - 1):
                # get the non-white colour at col 2
                (r, g, b) = image.getpixel((2, y))
                if r < 255 and g < 255 and b < 255:
                    return r, g, b

        image = image.convert('RGB')
        width = image.size[0]
        height = image.size[1]
        noise_color = get_noise_color(image)
        for x in range(width):
            for y in range(height):
                # remove borders & interference colours
                rgb = image.getpixel((x, y))
                if (x == 0 or y == 0 or x == width - 1 or y == height - 1
                        or rgb == noise_color or rgb[1] > 100):
                    image.putpixel((x, y), (255, 255, 255))
        return image

    image = Image.open(filename)
    image_grayscale = clear_image(image).convert('L')  # grayscale
    result: str = pytesseract.image_to_string(image_grayscale).strip()
    return ''.join(ch for ch in result if ch.isalnum())

# 验证码识别如上 调用形式如 ca("图片名称")即可

# 2.模拟登录
def login(username, password):
    while True:
        login_url = 'https://jxgl.gdufs.edu.cn/jsxsd/xk/LoginToXkLdap'

# 2.1 获取验证码并保存
import requests
import re

session = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36         (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
}

def login(username, password):
    # 识别次数
    times = 0
    while True:
        login_url = 'https://jxgl.gdufs.edu.cn/jsxsd/xk/LoginToXkLdap'
        # 获取验证码url并下载
        resp = session.post(url=login_url, headers=headers).text
        verify_code_re = re.compile(r'<img  src="(.*?)" id="SafeCodeImg"', re.S)
        verify_code_url = re.findall(verify_code_re, resp)
        verify_url = f'https://jxgl.gdufs.edu.cn{verify_code_url[0]}'
        verify_content = session.get(verify_url, headers=headers).content
        # 保存验证码图片
        with open('verify.jpg', 'wb') as f:
            f.write(verify_content)
        # 识别验证码
        verify_code = ca('verify.jpg')
        # print(verify_code)
        data = {
            'USERNAME': username,
            'PASSWORD': password,
            'RANDOMCODE': verify_code,
        }
        page_text_login = session.post(url=login_url, headers=headers, data=data).text
        # print(page_text_login)
        # 判断验证码是否识别成功即(是否登录成功)
        # 如果尝试次数到达10次就停止,防止因为用户误输密码或者学号而导致的死循环。
        if times >= 10:
            print('验证码识别错误或者密码或者学号错误。请检查密码或者学号,如无误请重新运行!')
            break
        if "湖南强智科技教务系统" in page_text_login:
            print('模拟登录成功')
            print('======================================================')
            score_url = 'https://jxgl.gdufs.edu.cn/jsxsd/kscj/cjcx_list'
            check_score(score_url)
            break
        else:
            # 识别次数加1
            times += 1
            print('验证码识别错误')
            continue

# 3. 查成绩
def check_score(score_url):
    resp = session.get(score_url, headers=headers)
    # re提取课程名称和分数
    name_re = re.compile(r'<td align="left">(.*?)</td>', re.S)
    name = re.findall(name_re, resp.text)
    name_list = []
    for i in range(1, len(name) + 1, 2):
        name_list.append(name[i])
    score_re = re.compile(r'<td style=".*?".*?">(.*?)</a></td>', re.S)
    score = re.findall(score_re, resp.text)
    for i in range(len(name_list)):
        print(name_list[i], score[i])
    resp.close()

# 4. 主函数运行
if __name__ == '__main__':
    # 输入学号和密码
    while True:
        username = input('Please input you username: ')
        if len(username) != 11:
            print('Invalid username')
            continue
        else:
            break
    password = input('Please input your password: ')
    # 开始登录
    login(username, password)
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

Yscandice_aleng

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值