mitmproxy_录制接口并保存到mysql(踩坑史)_2021-11-02

一、踩的坑
1、首选这个脚本获取请求信息方式,与上个文章,写入csv一致
2、坑主要是在插入数据库中
(1)mitmproxy获取到的url等信息,虽然是字符串,但是两边没有双引号,强制
str()都不行,插入数据库还报错,因此只能手动加

each_result = "\""+str(each_result)+"\""

(2) 如果返回的response是个json串,他里面的元素是有双引号的,插入数据库也会报错,应当转义成单引号

 each_result = each_result.replace("\"","'")

二、直接上代码吧
1、首先,先创建个mysql数据库,把表创建好


image.png

2、写一个数据库的工具函数吧,方便反复调用,这个网上一搜一大把

import pymysql

class MysqlUtils:

    @staticmethod
    def execute_sql(host, port, user, password, db_name, sql_sentence):
        db_config = [host,port,user,password,db_name]
        for each_config in db_config:
            if each_config in [None,""]:
                print("数据库配置host,port ,user,password,db_name缺失")
                return
        connect = pymysql.Connect(
            host=host,
            port=port,
            user=user,
            passwd=password,
            db=db_name,
            charset='utf8'
        )
        cursor = connect.cursor()
        try:
            cursor.execute(sql_sentence)
            connect.commit()
            cursor.close()
            connect.close()
        except Exception as e:
            print("执行数据库命令出错")
            print(str(e))

3、正戏代码开始了,里面写了注释,自己参考吧

# -*-coding:utf-8-*-
from config.config import hosts, db_all_api, db_config
from mitmproxy import ctx
import json
from python_utils.csv.csv_utils import CsvUtils
from python_utils.db.mysql_utils import MysqlUtils

class ApiRecordHelperToDB:
    def __init__(self):
        # 刚才写的获取当前时间的工具,我们要习惯如果这个代码块常用我们就要把他写成一个工具类,方便日后调用
        self.result = []
        self.create_time = CsvUtils.generate_name_current_time(format="%Y%m%d%H%M%S")
        self.count = 1
        self.all_result = []

    def request(self, flow):  # flow是固定参数,可以理解成存着全部的request和response信息
        info = ctx.log.info  # 可以在mitmproxy录制的内容中,打印出自己的信息,这个可以用来做调试
        request = flow.request  # 这里没有代码联想,所以别写错了
        url = request.url
        for host in hosts:
            if host in url:  # 只收集我想要的ip地址相关的接口
                info("得到的未过滤的url" + url)
                new_headers = {}
                body_type = None
                body = None
                ID = '{:0>5d}'.format(self.count)  # 生成用例id
                request_method = request.method
                headers = request.headers
                for key, value in headers.items():  # 生成字典样式的header
                    new_headers[key] = value
                if "Content-Type" in new_headers.keys():
                    body_type = new_headers["Content-Type"]
                if request.get_text():
                    body = request.get_text()
                self.result = [ID, self.create_time, url, request_method, str(new_headers), str(body_type), str(body)]

    def response(self, flow):
        info = ctx.log.info
        response = flow.response
        url = flow.request.url  # 获取这个响应是来自哪个url
        format_result = []
        response_status = None
        response_text = None
        if len(self.result) > 0 and url == self.result[2]:  # 只有响应是来自上个自己想要的url,我才要
            if response.status_code:
                response_status = str(response.status_code)
            if response.text:
                try:
                    json.loads(response.text)
                    response_text = response.text.encode('utf-8').decode('unicode_escape')  # 这个要转码,否则中文会显示乱码
                except:
                    if "</html>" in response.text:
                        response_text = "html网页"
                    else:
                        response_text = response.text
            self.result.append(response_status)
            self.result.append(response_text)
            new_db_config = list(db_config)
            new_result = []
            for each_result in self.result:
                # 坑一,从mtimproxy爬下来的内容虽然是字符串,但是两边没有双引号,插入数据会报错,因此得手动加双引号
                each_result = each_result.replace("\"","'")
                # 坑二,如果返回是json串,是双引号,但插入数据库的时候,会跟前面的双引号重复,因此需要转义成单引号
                each_result = "\""+str(each_result)+"\""
                new_result.append(each_result)
            data = ",".join(new_result)
            #坑三,这个方一定要写上数据库的字段,否则前面你数据库自增的索引id也会让你添加
            cmd = '''insert into %s  (case_id, create_time, url, request_method, headers, body_type, body,response_status,response_text)  values (%s)''' % (db_all_api,data)
            info("---------cmd-----------"+cmd)
            MysqlUtils.execute_sql(new_db_config[0], new_db_config[1], new_db_config[2], new_db_config[3],
                                   new_db_config[4], cmd)
            self.count = self.count + 1


addons = [
    ApiRecordHelperToDB()
]

三、结果就是这个样子


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容