test/main.py

273 lines
11 KiB
Python
Raw Permalink Normal View History

2025-06-03 23:10:52 +08:00
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参数