卡尔马克思杯初赛模拟搜题
原理
使用mitm获取题目,并模拟请求搜索答案。搜题api来自于万能。
实现代码
import sys
from mitmproxy import http
import json
import requests
from mitmproxy.tools.main import mitmdump
# 全局变量来存储题目和选项
global_question_data = {}
class Addon:
# 请求拦截处理函数
def response(self, flow: http.HTTPFlow) -> None:
# 监听请求 https://theory.8531.cn/api/question/begin
# 以及 https://theory.8531.cn/api/question/next?type=0
if ("theory.8531.cn/api/question/begin" in flow.request.url or
"theory.8531.cn/api/question/next" in flow.request.url):
# 尝试解析响应内容
try:
response_data = json.loads(flow.response.content)
if response_data["code"] == 0:
question_content = response_data["data"]["question_content"]
option_list = response_data["data"]["option_list"]
# 保存题目和选项
global global_question_data
global_question_data = {
"question": question_content,
"options": option_list
}
# 打印获取到的题目和选项,保留输出
print(f"题目: {question_content}")
print(f"选项: {option_list}")
# 调用模拟请求函数
send_mock_request(question_content, option_list)
except Exception as e:
print(f"解析响应出错: {e}")
# 模拟请求的函数 注意替换key
def send_mock_request(question, options):
url = "https://lyck6.cn/scriptService/api/autoAnswer/在这里替换你的万能key?gpt=-1"
headers = {
"sec-ch-ua-platform": "\"Windows\"",
"sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
"accept": "application/json, text/plain, */*",
"dnt": "1",
"content-type": "application/json;charset=UTF-8",
"version": "5.0.9.8",
"origin": "",
"sec-fetch-site": "cross-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "h",
"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",
"priority": "u=1, i"
}
payload = {
"plat": None,
"qid": None,
"question": question,
"options": options,
"options_id": [],
"type": 0,
"location": ""
}
try:
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
response_data = response.json()
if response_data["code"] == 0:
answers = response_data["result"]["answers"]
if isinstance(answers, list) and all(isinstance(ans, int) for ans in answers):
answer_str = ''.join([chr(97 + ans) for ans in answers]) # 0 -> 'a', 1 -> 'b', etc.
print(f"答案: {answer_str}")
else:
print("模拟请求返回的答案格式不正确。")
else:
print(f"模拟请求失败,服务器返回错误: {response_data['message']}")
else:
print(f"模拟请求失败,HTTP状态码: {response.status_code}")
except Exception as e:
print(f"发送模拟请求出错: {e}")
addons = [
Addon()
]
if __name__ == "__main__":
sys.argv.append('-s')
sys.argv.append(__file__)
sys.argv.append('--quiet') # 添加 --quiet 参数以减少无关的监听日志输出
mitmdump()
使用
替换万能key后直接运行,需要提前在手机配置好证书与代理,监听端口为8080。
注意
答案来源万能题库,非所有题目都有答案,同时不保证答案准确性。
免责声明
1. 使用责任:
本爬虫脚本仅供学习和研究使用。使用者需对其在使用本脚本过程中产生的一切行为及后果负责。本脚本的使用不得用于非法目的,包括但不限于未经授权的网络抓取、数据盗取或对目标网站的恶意攻击。
2. 合法性声明:
使用本爬虫脚本时,用户应确保遵守相关法律法规,包括但不限于《中华人民共和国网络安全法》、《著作权法》等法律。同时,用户应遵守目标网站的《服务条款》、《隐私政策》以及Robots.txt等规定。未经授权抓取或获取目标网站的数据可能会侵犯他人的知识产权、隐私权及其他合法权益,用户应承担因此引发的法律责任。
3. 不得滥用:
本脚本仅限于合法、合规的使用场景。请勿使用本脚本对目标网站进行恶意爬取,如过度抓取、分布式攻击、频繁请求等,以免造成对目标网站的负面影响。建议用户合理控制抓取频率,避免对网站正常服务造成干扰。
4. 网站所有权:
本脚本所抓取的任何数据都属于目标网站及其数据提供方的财产,使用者应尊重他人知识产权。任何未经授权转载或滥用这些数据的行为,使用者需要为其可能产生的后果承担全部责任。
5. 脚本修改与发布:
本脚本可以根据个人需求进行修改,但不得以任何形式进行非法传播或用于恶意用途。若您将本脚本发布给他人或分享,请务必附上免责声明,并提醒其他使用者遵守上述条款。
6. 不承担责任:
本脚本的作者和开发者不对因使用该脚本造成的任何直接或间接损失、损害、数据丢失、服务中断或任何其他法律责任负责。使用本脚本即表示您同意自行承担所有风险。
7. 禁止商业化使用:
本脚本的使用不应涉及任何未经授权的商业化行为。未经许可,不得将本脚本用于商业目的或以任何方式为他人谋取经济利益。
请仔细阅读以上免责声明并确保您在使用本爬虫脚本时遵守相关法律和规定。如有疑问,请咨询专业法律人士。