“一键解题,小猿口算神器:让数学练习与PK战无不利!“

这段 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤舟独钓寒江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值