test/main.py
2025-06-03 23:10:52 +08:00

273 lines
11 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import requests
from bs4 import BeautifulSoup
def read_jsessionid_from_file(filename):
"""从指定文件中读取JSESSIONID"""
try:
with open(filename, 'r') as file:
jsessionid = file.read().strip() # 去除可能存在的多余空白字符
return jsessionid
except FileNotFoundError:
print(f"未能找到文件: {filename}")
return None
# 在主程序开始的地方读取JSESSIONID
jsessionid_filename = 'jsessionid.txt' # 确保这个文件名与实际存放JSESSIONID的文件名一致
jsessionid = read_jsessionid_from_file(jsessionid_filename)
def get_xkkz_id_and_sessionUserKey():
# 请求头信息,根据提供的信息设置
headers = {
'Host': 'jwpd.jsei.edu.cn',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Microsoft Edge";v="134"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
# 注意这里的Cookie需要根据实际情况更新
'Cookie': f'route=db9e9ef21068edc0ed70b7551d42bc4a; JSESSIONID={jsessionid}'
}
# 发起GET请求
url = 'https://jwpd.jsei.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default'
response = requests.get(url, headers=headers)
session_user_key = None
first_xkkz_id = None
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 获取sessionUserKey
session_user_key_tag = soup.find('input', {'id': 'sessionUserKey'})
if session_user_key_tag and 'value' in session_user_key_tag.attrs:
session_user_key = session_user_key_tag['value']
# 获取firstXkkzId
first_xkkz_id_tag = soup.find('input', {'id': 'firstXkkzId'})
if first_xkkz_id_tag and 'value' in first_xkkz_id_tag.attrs:
first_xkkz_id = first_xkkz_id_tag['value']
return session_user_key, first_xkkz_id
def fetch_course_details(course_name,xkkz_id):
url = "https://jwpd.jsei.edu.cn/xsxk/zzxkyzb_cxZzxkYzbPartDisplay.html?gnmkdm=N253512"
headers = {
'Host': 'jwpd.jsei.edu.cn',
'Connection': 'keep-alive',
'Content-Length': '543',
'sec-ch-ua-platform': '"Windows"',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Microsoft Edge";v="134"',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'sec-ch-ua-mobile': '?0',
'Origin': 'https://jwpd.jsei.edu.cn',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://jwpd.jsei.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': f'route=db9e9ef21068edc0ed70b7551d42bc4a; JSESSIONID={jsessionid}'
}
data = {
'filter_list[0]': course_name,
'rwlx': '2',
'xklc': '2',
'xkly': '0',
'bklx_id': '0',
'sfkkjyxdxnxq': '0',
'kzkcgs': '0',
'xqh_id': '1',
'jg_id': '02',
'njdm_id_1': '2024',
'zyh_id_1': '0230',
'gnjkxdnj': '0',
'zyh_id': '0230',
'zyfx_id': 'wfx',
'njdm_id': '2024',
'bh_id': '0230242',
'bjgkczxbbjwcx': '0',
'xbm': '1',
'xslbdm': '12',
'mzm': '01',
'xz': '3',
'ccdm': '4',
'xsbj': '0',
'sfkknj': '0',
'sfkkzy': '0',
'kzybkxy': '0',
'sfznkx': '0',
'zdkxms': '0',
'sfkxq': '0',
'sfkcfx': '0',
'kkbk': '0',
'kkbkdj': '0',
'sfkgbcx': '0',
'sfrxtgkcxd': '0',
'tykczgxdcs': '0',
'xkxnm': '2024',
'xkxqm': '12',
'kklxdm': '10',
'bbhzxjxb': '0',
'xkkz_id': xkkz_id,
'rlkz': '0',
'xkzgbj': '0',
'kspage': '1',
'jspage': '10',
'jxbzb': ''
}
response = requests.post(url, headers=headers, data=data)
response_data = response.json()
kch_ids = []
if 'tmpList' in response_data and isinstance(response_data['tmpList'], list):
for course in response_data['tmpList']:
kcmc = course.get('kcmc', '未找到课程名称')
kch_id = course.get('kch_id', '未找到课程编号')
print(f"课程名称: {kcmc}")
kch_ids.append(kch_id)
else:
print("响应数据格式不正确或为空")
return kch_ids
def search_kc(kch_id,xkkz_id):
# 请求URL
url = "https://jwpd.jsei.edu.cn/xsxk/zzxkyzbjk_cxJxbWithKchZzxkYzb.html?gnmkdm=N253512"
# 请求头
headers = {
'Host': 'jwpd.jsei.edu.cn',
'Connection': 'keep-alive',
'Content-Length': '534',
'sec-ch-ua-platform': '"Windows"',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Microsoft Edge";v="134"',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'sec-ch-ua-mobile': '?0',
'Origin': 'https://jwpd.jsei.edu.cn',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://jwpd.jsei.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': f'route=db9e9ef21068edc0ed70b7551d42bc4a; JSESSIONID={jsessionid}'
}
# 请求体
data = {
'rwlx': '2',
'xkly': '0',
'bklx_id': '0',
'sfkkjyxdxnxq': '0',
'kzkcgs': '0',
'xqh_id': '1',
'jg_id': '02',
'zyh_id': '0230',
'zyfx_id': 'wfx',
'txbsfrl': '0',
'njdm_id': '2024',
'bh_id': '0230242',
'xbm': '1',
'xslbdm': '12',
'mzm': '01',
'xz': '3',
'ccdm': '4',
'xsbj': '0',
'sfkknj': '0',
'gnjkxdnj': '0',
'sfkkzy': '0',
'kzybkxy': '0',
'sfznkx': '0',
'zdkxms': '0',
'sfkxq': '0',
'sfkcfx': '0',
'bbhzxjxb': '0',
'kkbk': '0',
'kkbkdj': '0',
'xkxnm': '2024',
'xkxqm': '12',
'xkxskcgskg': '1',
'rlkz': '0',
'cdrlkz': '0',
'rlzlkz': '1',
'kklxdm': '10',
'kch_id': kch_id,
'jxbzcxskg': '0',
'xklc': '2',
'xkkz_id': xkkz_id,
'cxbj': '0',
'fxbj': '0'
}
response = requests.post(url, headers=headers, data=data)
response_data = response.json()
if response_data and isinstance(response_data, list):
do_jxb_id = response_data[0].get('do_jxb_id', '未找到do_jxb_id')
else:
do_jxb_id = '响应数据格式不正确或为空'
return do_jxb_id
def xuanke(do_jxb_id, kch_id,xkkz_id):
url = "https://jwpd.jsei.edu.cn/xsxk/zzxkyzbjk_xkBcZyZzxkYzb.html?gnmkdm=N253512"
# 请求头
headers = {
'Host': 'jwpd.jsei.edu.cn',
'Connection': 'keep-alive',
'Content-Length': '615',
'sec-ch-ua-platform': '"Windows"',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "Microsoft Edge";v="134"',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'sec-ch-ua-mobile': '?0',
'Origin': 'https://jwpd.jsei.edu.cn',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://jwpd.jsei.edu.cn/xsxk/zzxkyzb_cxZzxkYzbIndex.html?gnmkdm=N253512&layout=default',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': f'route=db9e9ef21068edc0ed70b7551d42bc4a; JSESSIONID={jsessionid}'
}
# 请求体
data = {
'jxb_ids': f'{do_jxb_id}',
'kch_id': kch_id,
'qz': '0',
'xkkz_id': xkkz_id,
}
response = requests.post(url, headers=headers, data=data)
try:
response_data = response.json()
if 'flag' in response_data and response_data['flag'] == "1":
print("选课成功!")
else:
print(f"选课失败。服务器返回: {response_data}")
except ValueError:
print("无法解析服务器响应。请检查网络或请求数据。服务器返回:")
print(response.text)
if __name__ == "__main__":
# 调用get_xkkz_id_and_sessionUserKey获取必要信息
session_user_key, xkkz_id = get_xkkz_id_and_sessionUserKey()
if not xkkz_id:
print("选课系统未开放!")
else:
course_name = input("请输入需要抢课的课程名称:")
kch_ids = fetch_course_details(course_name, xkkz_id)
for kch_id in kch_ids:
do_jxb_id = search_kc(kch_id, xkkz_id) # 注意添加了xkkz_id参数
if do_jxb_id != '未找到do_jxb_id' and do_jxb_id != '响应数据格式不正确或为空':
xuanke(do_jxb_id, kch_id, xkkz_id) # 注意添加了xkkz_id参数