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:启动mimproxy代理,并将抓取的数据通过script.py里的脚本进行处理
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文件的内容如下: