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

一甫何、初識(shí)命令行
前面已經(jīng)完成了接口的大部分功能了出吹,錄制,回放辙喂,監(jiān)控
那如果我們把我們的程序給了一個(gè)不會(huì)代碼的人捶牢,我們還要告訴他錄制你要運(yùn)行哪個(gè)文件鸠珠,回放你要運(yùn)行哪個(gè)文件,你文件里要傳什么參數(shù),這是一個(gè)很麻煩的事情
于是乎命令行這種人性化的操作誕生了
命令行長(zhǎng)什么樣,其實(shí)你是遇到過(guò)呢岸霹,這個(gè)熟悉嗎

λ java
用法:java [options] <主類(lèi)> [args...]                                         
           (執(zhí)行類(lèi))                                                         
   或  java [options] -jar <jar 文件> [args...]                             
           (執(zhí)行 jar 文件)                                                   
   或  java [options] -m <模塊>[/<主類(lèi)>] [args...]                            
       java [options] --module <模塊>[/<主類(lèi)>] [args...]                     
           (執(zhí)行模塊中的主類(lèi))                                                    
   或  java [options] <源文件> [args]                                        
           (執(zhí)行單個(gè)源文件程序)                                                   
                                                                         
 將主類(lèi)坚芜、源文件暂论、-jar <jar 文件>、-m 或                                              
 --module <模塊>/<主類(lèi)> 后的參數(shù)作為參數(shù)                                             
 傳遞到主類(lèi)。                                                                  
                                                                         
 其中,選項(xiàng)包括:                                                                
                                                                         
    -cp <目錄和 zip/jar 文件的類(lèi)搜索路徑>                                           
    -classpath <目錄和 zip/jar 文件的類(lèi)搜索路徑>                                    
    --class-path <目錄和 zip/jar 文件的類(lèi)搜索路徑>                                  
                  使用 ; 分隔的, 用于搜索類(lèi)文件的目錄, JAR 檔案                           
                  和 ZIP 檔案列表可缚。                                            
    -p <模塊路徑>                                                            
    --module-path <模塊路徑>...                                              
                  用 ; 分隔的目錄列表, 每個(gè)目錄                                      
                  都是一個(gè)包含模塊的目錄。                                           
    --upgrade-module-path <模塊路徑>...                                      
                  用 ; 分隔的目錄列表, 每個(gè)目錄                                      
                  都是一個(gè)包含模塊的目錄, 這些模塊                                      
                  用于替換運(yùn)行時(shí)映像中的可升級(jí)模塊                                       
    --add-modules <模塊名稱(chēng)>[,<模塊名稱(chēng)>...]                                     
                  除了初始模塊之外要解析的根模塊斋枢。                                       
                  <模塊名稱(chēng)> 還可以為 ALL-DEFAULT, ALL-SYSTEM,                   
                  ALL-MODULE-PATH.                                       
    --list-modules                                                       
                  列出可觀察模塊并退出                                                                

當(dāng)我們輸入java的時(shí)候帘靡,下面會(huì)展示出這么多的命令行提示

還不熟?那再來(lái)一下

λ 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)

當(dāng)我們輸入 java -version的時(shí)候瓤帚,下面會(huì)顯示版本描姚,這是因?yàn)閖ava里面一定有一套代碼,來(lái)定義命令行的參數(shù)和輸出結(jié)果戈次。

二轩勘、python里面怎么實(shí)現(xiàn)呢,引入正題 "argparse"
他的運(yùn)行結(jié)果是這樣的

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

api測(cè)試工具

optional arguments:
  -h, --help            show this help message and exit
  -r PORT, --record PORT
                        錄制api接口朝扼,-r后面接代理的端口號(hào)
  -p PLAYBACK_FILE_PATH, --playback PLAYBACK_FILE_PATH
                        回放接口赃阀,-p后面跟要回放的接口csv文件
  -m MONITOR_FILE_PATH, -monitor MONITOR_FILE_PATH
                        監(jiān)控接口霎肯,-m后面跟要監(jiān)控的接口csv文件,必須與-s連用
  -s INTERVAL_SECONDS, -seconds INTERVAL_SECONDS
                        表示監(jiān)控跑的間隔時(shí)間擎颖,單位是s

三、用到的幾個(gè)關(guān)鍵點(diǎn)
1观游、首先使用之前要引入包

import argparse

2搂捧、創(chuàng)建一個(gè)解析器

 parser = argparse.ArgumentParser(description='api測(cè)試工具')

description可以寫(xiě)關(guān)于這個(gè)工具的說(shuō)明,他會(huì)出現(xiàn)在這個(gè)地方


image.png

3懂缕、增加你想要的參數(shù)

parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="錄制api接口允跑,-r后面接代理的端口號(hào)")

(1)"-r", "--record" 是變量名,想寫(xiě)幾個(gè)寫(xiě)幾個(gè)搪柑,不過(guò)我們一般就寫(xiě)兩個(gè)聋丝,一個(gè)短參數(shù),一個(gè)長(zhǎng)參數(shù)

(2)type=int 是 "-r", "--record" 兩個(gè)變量后面要跟的參數(shù)類(lèi)型
(3)dest="port 是輸入?yún)?shù)存儲(chǔ)的變量名工碾,在這里


image.png

(4)action="store":store 保存參數(shù)值
(5)help="錄制api接口弱睦,-r后面接代理的端口號(hào)":對(duì)這個(gè)參數(shù)的操作說(shuō)明,像這個(gè)


image.png

如果你的命令行只需要變量渊额,不需要傳參數(shù)况木,則如下寫(xiě)法

parse.add_argument('-c', '--check', action="store_true",
                    help='查看所有錄制完成的接口文件')  # 用與只輸入?yún)?shù) 不輸入后面的值

運(yùn)行結(jié)果如下


image.png

所以上面的設(shè)置參數(shù)的代碼我是這樣寫(xiě)的垒拢,給大家一個(gè)參考

parse = argparse.ArgumentParser(description="api測(cè)試工具")
parse.add_argument("-r", "--record", type=int, dest="port", action="store", help="錄制api接口,-r后面接代理的端口號(hào)")
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="監(jiān)控接口求类,-m后面跟要監(jiān)控的接口csv文件,必須與-s連用")
parse.add_argument("-s", "-seconds", type=int, dest="interval_seconds",
                   action="store", help="表示監(jiān)控跑的間隔時(shí)間,單位是s")
parse.add_argument('-c', '--check', action="store_true",
                    help='查看所有錄制完成的接口文件')  # 用與只輸入?yún)?shù) 不輸入后面的值

4屹耐、參數(shù)傳進(jìn)來(lái)的尸疆,那就可以執(zhí)行變量對(duì)應(yīng)的操作了
這里值得提的是,獲取cmd里輸入命令行參數(shù)的方式

import sys
sys.argv 獲取的是個(gè)數(shù)組
拿  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”
依次類(lèi)推

5惶岭、打印幫助信息仓技,這個(gè)幫助信息argparse會(huì)自動(dòng)幫你整理,你只要調(diào)這個(gè)函數(shù)就行

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"]:  #開(kāi)始錄制api
        try:
            print("現(xiàn)在開(kāi)始錄制")
            cmd = "mitmdump -s record_helper.py -p %s" % str(sys.argv[2])
            os.system(cmd)
            print(cmd)
        except:
            path = os.path.abspath("record")
            print("錄制的結(jié)果文件在 %s 中" % (path))

    if sys.argv[1] in ["-p", "--playback"]:  #開(kāi)始回放api
        ReplayHelper().replay(sys.argv[2], "r")
        path = os.path.abspath("templates")
        html_path = path + "\\replay_report.html"
        print("請(qǐng)打開(kāi)地址 %s 查看運(yùn)行結(jié)果" % html_path)

    if sys.argv[1] in ["-m", "--monitor"]: #開(kāi)始監(jiān)控api
        try:
            if sys.argv[3] not in ["-s","-seconds"]:
                print("后面必須輸入-s參數(shù)俗他,")
            else:
                print("在線監(jiān)控地址是:" + " http://127.0.0.1:5555/monitor/index")
                run_monitor(int(sys.argv[4]),sys.argv[2]) #注意控制臺(tái)的輸入的整型需要在這里轉(zhuǎn)化一下脖捻,否則會(huì)是字符串
        except:
            print("監(jiān)控結(jié)束")

    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)  # 當(dāng)前路徑下所有非目錄子文件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兆衅,隨后出現(xiàn)的幾起案子地沮,更是在濱河造成了極大的恐慌,老刑警劉巖羡亩,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摩疑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畏铆,警方通過(guò)查閱死者的電腦和手機(jī)雷袋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辞居,“玉大人楷怒,你說(shuō)我怎么就攤上這事⊥咴睿” “怎么了鸠删?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贼陶。 經(jīng)常有香客問(wèn)我刃泡,道長(zhǎng),這世上最難降的妖魔是什么碉怔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任烘贴,我火速辦了婚禮,結(jié)果婚禮上撮胧,老公的妹妹穿的比我還像新娘桨踪。我一直安慰自己,他們只是感情好趴樱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布馒闷。 她就那樣靜靜地躺著酪捡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纳账。 梳的紋絲不亂的頭發(fā)上逛薇,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音疏虫,去河邊找鬼永罚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卧秘,可吹牛的內(nèi)容都是我干的呢袱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翅敌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼羞福!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蚯涮,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤治专,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后遭顶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體张峰,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年棒旗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喘批。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铣揉,死狀恐怖饶深,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情老速,我是刑警寧澤粥喜,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布凸主,位于F島的核電站橘券,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卿吐。R本人自食惡果不足惜旁舰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗡官。 院中可真熱鬧箭窜,春花似錦、人聲如沸衍腥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至竹捉,卻和暖如春芜辕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背块差。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工侵续, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憨闰。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓状蜗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鹉动。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轧坎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容