这段 Python 代码主要实现了以下几个功能:
请求和响应处理:
request 函数用于处理 HTTP 请求。
response 函数用于处理 HTTP 响应,并根据 URL 中的关键字提取并处理响应数据。
响应数据处理:
response 函数中根据不同的 URL 后缀来处理响应数据,并将 JSON 数据格式化输出。
对于特定的 URL,提取正确的答案,并调用 select_answer 函数进行进一步处理。
答案处理:
select_answer 函数用于从 JSON 数据中提取正确答案,并将其保存到文本文件中。
根据不同类型(“练习”或“pk”)处理问题的答案,并启动一个新的线程来显示 GUI。
GUI 显示:
gui_answer 函数创建一个简单的 GUI,显示一个按钮,用户点击按钮后关闭窗口并执行 answer_write 函数。
answer_write 函数用于写入答案。
命令行参数解析:
使用 argparse 模块解析命令行参数,设置监听端口和主机地址。
根据解析的参数启动 mitmdump 代理服务器。
详细说明
请求处理 (request 函数):
接收 http.HTTPFlow 类型的参数 flow。
可以在此处处理请求数据(注释中已给出示例)。
响应处理 (response 函数):
接收 http.HTTPFlow 类型的参数 flow。
打印响应状态码和 URL。
根据 URL 中的关键字提取并处理响应数据,并调用 select_answer 函数。
答案写入 (answer_write 函数):
接收一个列表 answer。
遍历列表中的每个元素,并调用 number_command.swipe_screen 函数进行屏幕滑动操作。
选择并处理答案 (select_answer 函数):
接收两个参数:answer 和 type。
根据 type 的不同,处理不同类型的题目答案,并保存到文本文件中。
启动一个新的线程来显示 GUI。
GUI 显示 (gui_answer 函数):
创建一个简单的 GUI,显示一个按钮。
用户点击按钮后关闭窗口,并执行 answer_write 函数。
主程序入口 (if __name__ == "__main__":):
解析命令行参数,设置监听端口和主机地址。
启动 mitmdump 代理服务器。
通过这些功能,代码可以实现对特定 URL 的响应数据进行处理,并根据处理结果进行相应的操作。
# 导入所需模块
from mitmproxy import http
import json
from mitmproxy.tools.main import mitmdump
import sys
import threading
import os
import subprocess
import number_command
import time
import tkinter as tk
from tkinter import messagebox
import argparse
# 处理请求
def request(flow: http.HTTPFlow) -> None:
# 可以在此处处理请求数据
# print(f"Request: {flow.request.method} {flow.request.url}")
pass
# 处理响应
def response(flow: http.HTTPFlow) -> None:
# 处理响应
print(f"Response: {flow.response.status_code} {flow.request.url}")
# 如果url中包含指定的关键字,则打印响应信息
if "https://xyks.yuanfudao.com/leo-math/android/exams?" in flow.request.url:
# 将响应信息转换为json格式
answer = json.loads(flow.response.text)
# 格式化输出
print(json.dumps(answer, indent=4))
# 保存到文件
# with open("answer.json", "w") as f:
# f.write(json.dumps(answer, indent=4))
select_answer(answer,"练习")
elif "https://xyks.yuanfudao.com/leo-game-pk/android/math/pk/match?" in flow.request.url:
# 将响应信息转换为json格式
answer = json.loads(flow.response.text)
# 格式化输出
print(json.dumps(answer, indent=4))
# 保存到文件
# with open("answer.json", "w") as f:
# f.write(json.dumps(answer, indent=4))
select_answer(answer,"pk")
# 写入答案
def answer_write(answer):
for i in range(len(answer)):
number_command.swipe_screen(answer[i])
# time.sleep(0.16)
time.sleep(0.3)
# 选择并处理答案
def select_answer(answer, type):
# 关闭notepad
# os.system("taskkill /f /im notepad.exe")
# 并保存到txt文件
f = open("answer.txt", "w")
select_answer = []
if type == "练习":
for question in answer["questions"]:
answers=question["answers"]
for i in range(len(answers)):
if "." in answers[i]:
correct_answer = answers[i]
break
if i == len(answers)-1:
correct_answer = answers[0]
select_answer.append(correct_answer)
print(correct_answer, end=" ")
f.write(str(correct_answer) + " ")
elif type == "pk":
for question in answer["examVO"]["questions"]:
answers=question["answers"]
for i in range(len(answers)):
if "." in answers[i]:
correct_answer = answers[i]
break
if i == len(answers)-1:
correct_answer = answers[0]
select_answer.append(correct_answer)
print(correct_answer, end=" ")
f.write(str(correct_answer) + " ")
# 关闭文件
f.close()
threading.Thread(target=gui_answer, args=(select_answer,)).start()
# 用记事本打开文件
# os.system("notepad answer.txt")
# threading.Thread(target=os.system, args=("notepad answer.txt",)).start()
# GUI显示答案
def gui_answer(answer):
# 创建一个GUI
root = tk.Tk()
root.title("继续执行")
def on_button_click():
root.destroy() # 关闭窗口
answer_write(answer) # 继续执行代码
# 创建一个按钮
button = tk.Button(root, text="点击继续", command=on_button_click)
button.pack(pady=20)
# 设置定时器,12.5秒后自动点击按钮
root.after(12500, on_button_click)
# 运行 GUI 界面
root.mainloop()
# 主程序入口
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Mitmproxy script")
parser.add_argument("-P", "--port", type=int, default=8080, help="Port to listen on")
parser.add_argument("-H", "--host", type=str, default="0.0.0.0", help="Host to listen on")
args = parser.parse_args()
sys.argv = ["mitmdump", "-s", __file__, "--listen-host", args.host, "--listen-port", str(args.port)]
# 取消注释下面的代码,可以看到log信息
mitmdump()