273 lines
11 KiB
Python
273 lines
11 KiB
Python
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参数
|