首页 > 技术文章 > 使用mitmproxy和python脚本自动抓包小程序数据

hongdanni 2020-08-09 07:25 原文

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文件的内容如下:

推荐阅读