mitmproxy_argparse生成命令行操作_2021-11-11

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

λ java
用法:java [options] <主类> [args...]                                         
           (执行类)                                                         
   或  java [options] -jar <jar 文件> [args...]                             
           (执行 jar 文件)                                                   
   或  java [options] -m <模块>[/<主类>] [args...]                            
       java [options] --module <模块>[/<主类>] [args...]                     
           (执行模块中的主类)                                                    
   或  java [options] <源文件> [args]                                        
           (执行单个源文件程序)                                                   
                                                                         
 将主类、源文件、-jar <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:\code\python\ApiTools\record\record_20211111_181951.csv -s 30 举列
sys.argv[0] 是 “client.py”
sys.argv[1] 是 “-m”
sys.argv[2] 是 “D:\code\python\ApiTools\record\record_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)  # 当前路径下所有非目录子文件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容