栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mitmproxy

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mitmproxy

一、初识命令行
前面已经完成了接口的大部分功能了,录制,回放,监控
那如果我们把我们的程序给了一个不会代码的人,我们还要告诉他录制你要运行哪个文件,回放你要运行哪个文件,你文件里要传什么参数,这是一个很麻烦的事情
于是乎命令行这种人性化的操作诞生了
命令行长什么样,其实你是遇到过呢,这个熟悉吗

λ java
用法:java [options] <主类> [args...]                                         
           (执行类)                                                         
   或  java [options] -jar  [args...]                             
           (执行 jar 文件)                                                   
   或  java [options] -m <模块>[/<主类>] [args...]                            
       java [options] --module <模块>[/<主类>] [args...]                     
           (执行模块中的主类)                                                    
   或  java [options] <源文件> [args]                                        
           (执行单个源文件程序)                                                   
                                                                         
 将主类、源文件、-jar 、-m 或                                              
 --module <模块>/<主类> 后的参数作为参数                                             
 传递到主类。                                                                  
                                                                         
 其中,选项包括:                                                                
                                                                         
    -cp <目录和 zip/jar 文件的类搜索路径>                                           
    -classpath <目录和 zip/jar 文件的类搜索路径>                                    
    --class-path <目录和 zip/jar 文件的类搜索路径>                                  
                  使用 ; 分隔的, 用于搜索类文件的目录, JAR 档案                           
                  和 ZIP 档案列表。                                            
    -p <模块路径>                                                            
    --module-path <模块路径>...                                              
                  用 ; 分隔的目录列表, 每个目录                                      
                  都是一个包含模块的目录。                                           
    --upgrade-module-path <模块路径>...                                      
                  用 ; 分隔的目录列表, 每个目录                                      
                  都是一个包含模块的目录, 这些模块                                      
                  用于替换运行时映像中的可升级模块                                       
    --add-modules <模块名称>[,<模块名称>...]                                     
                  除了初始模块之外要解析的根模块。                                       
                  <模块名称> 还可以为 ALL-DEFAULT, ALL-SYSTEM,                   
                  ALL-MODULE-PATH.                                       
    --list-modules                                                       
                  列出可观察模块并退出                                                                

当我们输入java的时候,下面会展示出这么多的命令行提示

还不熟?那再来一下

λ java -version
java version "16.0.2" 2021-07-20
Java(TM) SE Runtime Environment (build 16.0.2+7-67)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing)

当我们输入 java -version的时候,下面会显示版本,这是因为java里面一定有一套代码,来定义命令行的参数和输出结果。

二、python里面怎么实现呢,引入正题 "argparse"
他的运行结果是这样的

λ python client.py
usage: client.py [-h] [-r PORT] [-p PLAYBACK_FILE_PATH] [-m MONITOR_FILE_PATH]
                 [-s INTERVAL_SECONDS]

api测试工具

optional arguments:
  -h, --help            show this help message and exit
  -r PORT, --record PORT
                        录制api接口,-r后面接代理的端口号
  -p PLAYBACK_FILE_PATH, --playback PLAYBACK_FILE_PATH
                        回放接口,-p后面跟要回放的接口csv文件
  -m MONITOR_FILE_PATH, -monitor MONITOR_FILE_PATH
                        监控接口,-m后面跟要监控的接口csv文件,必须与-s连用
  -s INTERVAL_SECONDS, -seconds INTERVAL_SEConDS
                        表示监控跑的间隔时间,单位是s

三、用到的几个关键点
1、首先使用之前要引入包

import argparse

2、创建一个解析器

 parser = argparse.ArgumentParser(description='api测试工具')

description可以写关于这个工具的说明,他会出现在这个地方

image.png

3、增加你想要的参数

parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="录制api接口,-r后面接代理的端口号")

(1)"-r", "--record" 是变量名,想写几个写几个,不过我们一般就写两个,一个短参数,一个长参数

(2)type=int 是 "-r", "--record" 两个变量后面要跟的参数类型
(3)dest="port 是输入参数存储的变量名,在这里

image.png

(4)action="store":store 保存参数值
(5)help="录制api接口,-r后面接代理的端口号":对这个参数的操作说明,像这个

image.png

如果你的命令行只需要变量,不需要传参数,则如下写法

parse.add_argument('-c', '--check', action="store_true",
                    help='查看所有录制完成的接口文件')  # 用与只输入参数 不输入后面的值

运行结果如下

image.png

所以上面的设置参数的代码我是这样写的,给大家一个参考

parse = argparse.ArgumentParser(description="api测试工具")
parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="录制api接口,-r后面接代理的端口号")
parse.add_argument("-p", "--playback", type=str, dest="playback_file_path", action="store",
                   help="回放接口,-p后面跟要回放的接口csv文件")
parse.add_argument("-m", "-monitor", type=str, dest="monitor_file_path",
                   action="store", help="监控接口,-m后面跟要监控的接口csv文件,必须与-s连用")
parse.add_argument("-s", "-seconds", type=int, dest="interval_seconds",
                   action="store", help="表示监控跑的间隔时间,单位是s")
parse.add_argument('-c', '--check', action="store_true",
                    help='查看所有录制完成的接口文件')  # 用与只输入参数 不输入后面的值

4、参数传进来的,那就可以执行变量对应的操作了
这里值得提的是,获取cmd里输入命令行参数的方式

import sys
sys.argv 获取的是个数组
拿  python client.py -m D:codepythonApiToolsrecordrecord_20211111_181951.csv -s 30 举列
sys.argv[0] 是 “client.py”
sys.argv[1] 是 “-m”
sys.argv[2] 是 “D:codepythonApiToolsrecordrecord_20211111_181951.csv”
依次类推

5、打印帮助信息,这个帮助信息argparse会自动帮你整理,你只要调这个函数就行

print_help()

所以下面的代码就是这样的

if len(sys.argv) == 1:
    parse.print_help()  #打印help文件

if len(sys.argv) > 1:
    if sys.argv[1] in ["-h", "--help"]:
        parse.print_help()  #打印help文件

    if sys.argv[1] in ["-r", "--record"]:  #开始录制api
        try:
            print("现在开始录制")
            cmd = "mitmdump -s record_helper.py -p %s" % str(sys.argv[2])
            os.system(cmd)
            print(cmd)
        except:
            path = os.path.abspath("record")
            print("录制的结果文件在 %s 中" % (path))

    if sys.argv[1] in ["-p", "--playback"]:  #开始回放api
        ReplayHelper().replay(sys.argv[2], "r")
        path = os.path.abspath("templates")
        html_path = path + "\replay_report.html"
        print("请打开地址 %s 查看运行结果" % html_path)

    if sys.argv[1] in ["-m", "--monitor"]: #开始监控api
        try:
            if sys.argv[3] not in ["-s","-seconds"]:
                print("后面必须输入-s参数,")
            else:
                print("在线监控地址是:" + " http://127.0.0.1:5555/monitor/index")
                run_monitor(int(sys.argv[4]),sys.argv[2]) #注意控制台的输入的整型需要在这里转化一下,否则会是字符串
        except:
            print("监控结束")

    if sys.argv[1] in ["-c", "--check"]:  #查看录制好的api文件
        for files in os.walk(os.path.abspath("record")):
            for file in files[2]:
                if file.endswith(".csv"):
                    print(os.path.abspath("record")+"\"+file)  # 当前路径下所有非目录子文件
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584976.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号