使用mitmproxy进行埋点测试

官网:https://mitmproxy.org/

文档:https://docs.mitmproxy.org/stable/

mitmproxy is a free and open source interactive HTTPS proxy.

mitmproxy不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。

我们可以批量拿到请求,然后根据自定义的python脚本来进行解析与处理,实现高度定制化的需求。例如进行「埋点测试」、「判断异常请求并发送邮件」等等。

特性

  • 拦截 HTTP 和 HTTPS 请求和响应并即时修改它们

  • 保存完整的 HTTP 对话以供以后重播和分析

  • 重播 HTTP 对话的客户端

  • 重播先前记录的服务器的 HTTP 响应

  • 反向代理模式将流量转发到指定的服务器

  • macOS 和 Linux 上的透明代理模式

  • 使用 Python 对 HTTP 流量进行脚本化更改

  • 实时生成用于拦截的 SSL / TLS 证书

  • ……

环境搭建

$ pip install mitmproxy

查看版本校验是否安装成功

(venv) (base) localhost:wytest zhongxin$ mitmdump --version
Mitmproxy: 7.0.4
Python:    3.8.3
OpenSSL:   OpenSSL 1.1.1k  25 Mar 2021
Platform:  macOS-10.16-x86_64-i386-64bit

安装证书

https://docs.mitmproxy.org/stable/concepts-certificates/

sudo security add-trusted-cert -d -p ssl -p basic -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem

Mac配置代理

0d63e7e0e8d34d778381ba1ea82161eb.png
配置代理

其他环境的代理可以根据「安装证书」中的链接查看官方帮助文档

埋点测试demo

监听代码

# @File    : test_mitmdump.py
import json
import time

import mitmproxy.http

with open('1.json', 'w') as f:
    json.dump([], f) # 新建一个空列表json用于存放结果


class Demo:
    def __init__(self):
        self.other_data = None

    def response(self, flow: mitmproxy.http.HTTPFlow):
        url = flow.request.url
        if 'trackh5.guahao.cn' not in url:
            return
        if 'trackh5.guahao.cn' in url: # 根据url地址判断是否要再次处理
            # 埋点报文
            query = flow.request.query
            with open('1.json', 'r') as f:
                d = json.load(f)
            with open('1.json', 'w') as f:
                data = {
                    "time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), # 记录触发时间
                    "url": url,
                }
                try:
                    data["query"] = str(query)
                except Exception:
                    pass
                d.append(data)
                json.dump(d, f)


addons = [
    Demo(),
]

运行代码,可以方便调试

# @File    : run.py
import sys
import os
from mitmproxy.tools.main import mitmdump

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

mitmdump(['-s', 'test_mitmdump.py'])

测试

触发一次埋点后查看json文件中的内容:

[
  {
    "time": "2021-10-08 11:36:04",
    "url": "https://trackh5.guahao.cn/blank.gif?pdata=pv_sid=0|pv_seq=1|channel=jlyh5|inchannel=|enc_user_id=89AB41A4C099101440A6821DB15F7FCAFFC3F8AB4CED97BF|uuid=6ba709723df10d66a5527706a20cd315|persession_id=1631689150059789338086|shortsession_id=1633627822175|user_id=CF5AA056D0070907CF7CB017A19FD143|open_id=23FE46EFC793433E|uid_cat=27|language=zh-cn|report_time=1633662887928|refer_url=|url=http%3A%2F%2Fm.guahao-test.com%2Foutpatient%2Flist%2Fsearch%3FpatientId%3D6E426275034A52E0401D6846A6B1FBC0%26doctorUserId%3D40A53CCE3BC3D37C22221289F37C26426844E653153C4B16%26sessionId%3D6115e37351a4da0001af1470|unique_id=1633662887928-1|acct_id=|track_souce=&ndata=id=|h=812|w=375|xp=html%3Ebody%3Ediv%5B1%5D%3Esection%3Ediv%5B3%5D%3Eul%3Ediv%5B20%5D%3Ep%5B2%5D%3Eimg|x=315|y=293|ct=d41d8cd98f00b204e9800998ecf8427e|oh=22|ol=299|ot=279.984375|ow=22",
    "query": "MultiDictView[('pdata', 'pv_sid=0|pv_seq=1|channel=jlyh5|inchannel=|enc_user_id=89AB41A4C099101440A6821DB15F7FCAFFC3F8AB4CED97BF|uuid=6ba709723df10d66a5527706a20cd315|persession_id=1631689150059789338086|shortsession_id=1633627822175|user_id=CF5AA056D0070907CF7CB017A19FD143|open_id=23FE46EFC793433E|uid_cat=27|language=zh-cn|report_time=1633662887928|refer_url=|url=http://m.guahao-test.com/outpatient/list/search?patientId=6E426275034A52E0401D6846A6B1FBC0&doctorUserId=40A53CCE3BC3D37C22221289F37C26426844E653153C4B16&sessionId=6115e37351a4da0001af1470|unique_id=1633662887928-1|acct_id=|track_souce='), ('ndata', 'id=|h=812|w=375|xp=html>body>div[1]>section>div[3]>ul>div[20]>p[2]>img|x=315|y=293|ct=d41d8cd98f00b204e9800998ecf8427e|oh=22|ol=299|ot=279.984375|ow=22')]"
  }
]

后续结合selenium即可完成埋点自动化测试

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值