mitmproxy
1、概念:通過控制台來操作的支持http/https的抓包程序。(類似於charles是圖形界面形式的抓包程序)
2、安裝:通過python的包管理工具安裝:pip3 install mitmproxy
3、相關組件:mitmdump(可以利用其對接python腳本,實現對mitmproxy抓包出的數據用python腳本進行處理)
4、配置https證書:mitmproxy在安裝啟動后會生成一套證書,在手機端和電腦端安裝和信任mitmproxy提供的證書,mitmproxy就可以通過轉發獲取https請求的解密內
4.1、配置證書步驟:
a.啟動mitmdump:在終端命令行里輸入:mitmdump
b.在/Users/dannihong/.mitmproxy目錄下可以看到mitmproxy提供的許多證書,不同的證書適用於不同的開發平台(以下步驟針對的是mac系統和iphone手機配置證書的過程)
c.Mac端配置: 雙擊mitmproxy-ca-cert.pem,彈出‘鑰匙串訪問’窗口,找到剛剛雙擊的證書文件,雙擊修改其信任設置為‘始終信任’
d.Iphone端配置:將剛才的mitmproxy-ca-cert.pem隔空投送至iphone,在‘設置’->‘通用’->‘描述文件’里查看剛剛接收的證書文件,選擇安裝
這里要注意的是,在IOS10.3版本以后,還要設置‘證書的信任設置’:‘設置’->‘關於本機’->‘證書信任設置’
5、使用mitmproxy
5.1、首先確保手機和電腦連接在同一個局域網內。電腦端運行mitmproxy,相當於開啟了一個http/htpps的代理服務。這樣手機端在訪問互聯網數據時,訪問服務器request和response的數據都會被mitmproxy獲取。
a.獲取電腦當前局域網的ip
b.手機端配置:在連接的相同的WIFI下,配置HTTP代理:服務器ip就是剛剛獲取的電腦局域網ip:192.168.124.4,端口:8080(因為mitmproxy默認在8080端口運行)。
5.2、開啟mitmproxy代理:
有兩種命令方式:
a.終端輸入‘mitmproxy’命令:終端會進入一個新的窗口,里面顯示手機訪問互聯網的每個請求
(左下角顯示的是請求數量和當前光標所在的請求位置;右下角表示當前在8080端口運行)
(回車鍵進入當前所在的請求詳情;tab鍵可以來回切換Request、Response、Detail內容;通過e、q、a、r鍵等可以對請求內容進行編輯和重新發送請求,具體用法可以網上搜索mitmproxy的用法)
b.這篇主要想講的是通過mitmdump命令結合python腳本實現對數據的自動化處理
終端輸入‘mitmdump’命令,也可以開啟mitmproxy代理,在當前終端窗口顯示手機端請求內容。
6、mitmdump常用命令
mitmdump -w resfile:啟動mitmproxy代理,並將抓取的數據保存在resfile文件里
mitmdump -s script.py:啟動mitmproxy代理,並將抓取的數據通過script.py里的腳本進行處理
mitmdump -p 8081 -s scritp.py:mitmproxy默認的端口號是8080;-p 可以指定監聽端口號為8081
7、python腳本的寫法(兩個方法里的形參flow都是HTTPFlow對象)
a.通過定義request方法可以打印出請求頭的信息
1 def request(flow): 2 print(flow.request.headers)
request還有url、cookies、host、method、port、scheme等屬性均可輸出查看
b.通過定義response方法可以打印出響應的內容
1 def response(flow): 2 print(flow.response.text)
response有status_code、headers、cookies等屬性。這里對我們比較有用且需要處理的信息就是flow.response.text。
c.對抓包數據的處理
import json import csv
def response(flow): url = 'https://shopping.ele.me/h5/mtop.venus.shopcategoryservice.getcategorydetail' if flow.request.url.startswith(url): # 篩選出需要的接口進行分析 text = flow.response.text # 接口返回的內容 res_dict = json.loads(text) # 字符串轉字典 data = res_dict['data']['data'][0]['foods'] # 獲取商品內容 csvfile = open('test.csv', 'a') # 處理后的數據寫入csv文件 csv_wri = csv.writer(csvfile) for food in data: # 遍歷商品內容 cate2id = food['categoryIds'][0] # eleme平台對應的二級類目id currentPrice = food['currentPrice'] # 單位是元 defaultSaleUnit = food['defaultSaleUnit'] # 銷售規格 leftNum = food['leftNum'] # 庫存 monthSell = food['monthSell'] # 月銷量 name = food['name'] # 商品名 photos = food['photos'] # 商品圖片 upc = food['upc'] # 商品upc csvItem = [upc, name, defaultSaleUnit, currentPrice, leftNum, monthSell, cate2id, photos] csv_wri.writerow(csvItem) csvfile.close()
8、運行結果
寫完python腳本后,在終端命令行里輸入mitmdump -s script.py命令后,操作手機端訪問餓了么小程序的某家商鋪數據,就可以看到輸出至csv文件的內容如下: