检查下下面这段代码,有无语法错误,或者逻辑错误#!/usr/bin/python3
# coding=utf-8
import io
import sys
import time
import requests
import json
import re
import base64
from urllib.parse import urlparse, urljoin, quote
import urllib3
import gzip
import zlib
import brotli
import chardet
from typing import Optional, Tuple
# 禁用SSL警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
SUC_RES = {
'resCode': 200,
'resTime': 0,
'keyword': 'SUCCESS',
'message': []
}
FAIL_RES = {
'resCode': 500,
'resTime': 0,
'keyword': 'FAILED',
'message': []
}
# 封装解码
class HttpResponseProcessor:
def __init__(self, url: str, headers: dict = None):
"""
初始化响应处理器
:param url: 请求的URL
:param headers: 请求头,默认为None
"""
self.url = url
self.headers = headers or {}
self.response = None
self.raw_content = None
self.text_content = None
self.encoding = None
self.status_code = None
def fetch_response(self):
"""
发送HTTP请求并获取响应
:return: None
"""
try:
self.response = requests.get(
url=self.url,
headers=self.headers,
allow_redirects=False, # 禁用自动重定向
stream=True # 流模式获取原始响应
)
self.status_code = self.response.status_code
self.raw_content = self.response.content
except Exception as e:
raise Exception(f"请求失败: {str(e)}")
def print_response_headers(self):
"""
打印响应头信息
:return: None
"""
if not self.response:
raise Exception("尚未获取响应,请先调用 fetch_response()")
def decode_content(self) -> str:
"""
尝试解码内容为文本
:return: 解码后的文本内容
"""
if not self.raw_content:
raise Exception("尚未获取原始内容,请先调用 fetch_response()")
try:
# 检测内容编码
encoding_detected = chardet.detect(self.raw_content)['encoding']
# 尝试解码
if encoding_detected:
self.text_content = self.raw_content.decode(encoding_detected)
self.encoding = encoding_detected
else:
# 尝试常见编码
for encoding in ['utf-8', 'gbk', 'gb2312', 'latin1']:
try:
self.text_content = self.raw_content.decode(encoding)
self.encoding = encoding
break
except:
continue
else:
self.text_content = "无法解码内容"
self.encoding = None
return self.text_content
except Exception as e:
# 将内容保存到文件以便分析
with open('response.bin', 'wb') as f:
f.write(self.raw_content)
raise Exception("内容解码失败")
def process_response(self) -> Tuple[int, Optional[str], Optional[str]]:
"""
完整处理响应的便捷方法
:return: (status_code, text_content, encoding)
"""
self.fetch_response()
self.print_response_headers()
text = self.decode_content()
return self.status_code, text, self.encoding
def print_err_result(e):
FAIL_RES['error'] = e
exit(1)
def make_request(url, params=None, data=None, method='get', session=None):
try:
start = time.time()
req_func = session.get if session else requests.get
if method.lower() == 'post':
req_func = session.post if session else requests.post
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'application/json,text/plain,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',
'X-Requested-With': 'XMLHttpRequest',
'accept-encoding': 'gzip, deflate, br,zstd'
}
response = req_func(
url,
params=params,
data=data,
verify=False,
headers=headers
)
res_time = (time.time() - start) * 1000
if response.status_code in [200, 302]:
SUC_RES['resTime'] = int(res_time)
SUC_RES['message'].append(f"请求 {url} 成功")
return response
else:
FAIL_RES['error'] = f"请求失败,状态码: {response.status_code}, 响应内容: {response.text},头信息:{session.headers}"
FAIL_RES['message'].append(f"请求 {url} 失败")
return None
except Exception as e:
print_err_result(f"请求过程中发生错误: {str(e)}")
return None
def cas_login(username, password):
# 使用会话保持cookies
session = requests.Session()
token = None
try:
# 第一步:获取lt令牌
params1 = {
'service': 'https://www.fifedu.com/iplat/ssoservice',
'get-lt': 'true',
'n': str(int(time.time() * 1000)),
'callback': 'jsonpcallback',
'_': str(int(time.time() * 1000))
}
url1 = "https://cycore.fifedu.com/cas-server/login"
response1 = make_request(url1, params=params1, session=session)
if not response1:
return False
# 1. 检查响应是否以jsonpcallback开头
if not response1.text.startswith('jsonpcallback'):
raise ValueError("响应格式不符合预期,不是JSONP格式")
# 2. 提取括号内的JSON部分
json_str = response1.text[len('jsonpcallback('):-2] # 去掉首尾的jsonpcallback(和);
# 3. 将字符串解析为字典
data = json.loads(json_str)
# 4. 提取所需的值
lt = data.get('lt', '')
execution = data.get('execution', '')
if not lt or not execution:
raise ValueError("响应中缺少lt或execution字段")
# 第二步:提交登录表单
data2 = {
'service': 'https://cycore.fifedu.com/iplat/ssoservice',
'callback': 'logincallback',
'isajax': 'true',
'isframe': 'true',
'_eventId': 'submit',
'serviceURL': 'null',
'lt': lt,
'type': 'pwd',
'execution': execution,
'username': username,
'password': password,
'_': str(int(time.time() * 1000))
}
url2 = "https://cycore.fifedu.com/cas-server/login"
response2 = make_request(url2, data=data2, method='post', session=session)
if not response2:
return False
# 检查登录是否成功
response_text = response2.text.strip()
if response_text.startswith("logincallback"):
json_str = response_text[len("logincallback("):-2]
login_result = json.loads(json_str)
token = login_result.get("token", "")
ticket = login_result.get("ticket", "")
if not token or not ticket:
return False
else:
return False
# 第三步:ssosevice跳转
params3 = {
'callback': 'jQuery371043019069426885914_1754445556768',
'action': 'login',
'_': '1754445556769'
#冯改'callback': 'jQuery37107223533462281438_1752200612928',
#冯改'action': 'login',
#冯改'_': '1752200612929'
}
session.headers.update({
'Referer': 'https://www.fifedu.com/iplat/fifLogin/scuai/index.html?service=https://assess.fifedu.com/testcenter/home/teacher_index',
#冯改'Referer': 'https://www.fifedu.com/iplat/fifLogin/scuai/index.html?service=https://ai.fifedu.com&loginT=&execution=e10s1',
'Accept': '*/*',
'Accept-encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'pragma': 'no-cache',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'
})
url3 = "https://www.fifedu.com/iplat/ssoservice"
response3 = session.get(
url3,
params=params3,
allow_redirects=True
)
if not response3:
return False
# 第四步:跳转到目标页面
params4 = {
'nextPage': 'https://assess.fifedu.com/testcenter/home/teacher_index',
#冯改'nextPage': 'https://ai.fifedu.com',
#冯改'loginT': '',
#冯改'execution': 'e10s1'
}
url4 = "https://www.fifedu.com/iplat/ssoservice"
existing_cookies = session.cookies.get_dict()
cookie_parts = [
f'SESSION={existing_cookies.get("SESSION", "")}',
f'_wafuid={existing_cookies.get("_wafuid", "")}',
f'prod-token={token}'
#这里在线考试里面还有Hm_lpvt_5734acaafaf7a1011672a1fef0933656,Hm_lvt_5734acaafaf7a1011672a1fef0933656,HMACCOUNT三个值
]
cookie_str = '; '.join(filter(None, cookie_parts))
session.headers.update({
'Referer': 'https://www.fifedu.com/iplat/fifLogin/scuai/index.html?service=https://assess.fifedu.com/testcenter/home/teacher_index',
#冯改'Referer': 'https://www.fifedu.com/iplat/fifLogin/scuai/index.html?service=https://ai.fifedu.com&loginT=&execution=e10s1',
'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',
'Accept-encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
#冯加
'pragma': 'no-cache',
#冯加
#冯改'Connection': 'keep-alive',
'priority': 'u=0, i',
'Upgrade-Insecure-Requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
#冯加
'Cookie': cookie_str
})
response4 = make_request(url4, params=params4, method='get', session=session)
if not response4:
return False
processor = HttpResponseProcessor(url4, headers=session.headers)
processor.response = response4
processor.raw_content = response4.content
processor.status_code = response4.status_code
text_content = processor.decode_content()
# 第五步:跳转到业务接口
url5 = "https://assess.fifedu.com/testcenter/home/getUser"
#冯改url5 = "https://ai.fifedu.com/gestApp/api/user/getUserInfo"
session.headers.update({
'Referer': 'https://assess.fifedu.com/testcenter/home/teacher_index',
#冯改'Referer': 'https://ai.fifedu.com/home',
'Accept': '*/*',
#冯改'Accept': 'application/json, text/plain, */*',
'Accept-encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9',
#冯改'Connection': 'keep-alive',
'priority': 'u=0, i',
#冯改'Upgrade-Insecure-Requests': '1',
'Cookie': f'prod-token={token}',
#冯改'Content-Type': 'application/json'
'cache-control': 'no-cache',
#冯加
'pragma': 'no-cache',
#冯加
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'
#冯加
})
response5 = make_request(url5, method='get', session=session)
if not response5:
return False
processor = HttpResponseProcessor(url5, headers=session.headers)
processor.response = response5
processor.raw_content = response5.content
processor.status_code = response5.status_code
text_content = processor.decode_content()
sess = session.cookies.get_dict()
if token and sess:
return token, sess
else:
return False, False
except Exception as e:
return False
def get_credentials():
username = "jffwbc1"
password = "R2pjcHgxMjMhQCM="
return cas_login(username, password)
if __name__ == '__main__':
username = "jffwbc1"
password = "R2pjcHgxMjMhQCM="
token, sess = cas_login(username, password)
最新发布