之前我们已经学习过Mock的相关知识。相信有的同学已经自己使用过了,那么今天我们就来详细的说下该如何梳理自己的代码吧。
代码结构
data :存放接口返回所需要的数据,mock_data.yaml文件配置接口和返回数据的对应关系,格式如下:
想要了解YAML文件格式的同学,请移步《YAML快速入门》
mockSever:这里是主要的逻辑处理文件
mock.py:主要是读取YAML文件匹配接口,替换返回数据
import mitmproxy.http import yaml from src.utils.conf import DATA_PATH, JSON_PATH class Mock: def response(self, flow:mitmproxy.http.HTTPFlow): # 读取url及替换的json文件路径 d = yaml.load(open(DATA_PATH, 'r', encoding='utf-8').read(), Loader=yaml.FullLoader) yaml.warnings({'YAMLLoadWarning': False}) count = d['keyCount'] #读取替换json内容 for count in range(count, 0, -1): print(count) url = d['request' + str(count)]['url'] response_path = JSON_PATH + '\\' + d['request' + str(count)]['response'] # 读取替换json内容 f = open(response_path, encoding='utf-8') replaced_data = f.read() if url in flow.request.url: flow.response = flow.response.make(200) flow.response.set_text(replaced_data) count += 1 else: count += 1 return |
mock_init.py:mitproxy的初始化函数,这个文件是整个工具的入口,使用这个文件进行MockServer的启动工作,代码如下:
import win32api import win32con import logging import os class mockInit: def main(self): self.open_monitoring() def open_monitoring(self): self.set_ie_proxy(1, "127.0.0.1:8080", "") self.redirect_on() def close_monitoring(self): self.set_ie_proxy(0, "", "") def redirect_on(self): dir = os.path.dirname(os.getcwd()) + "\\utils" opPath = os.getcwd() os.chdir(dir) os.system("mitmweb -s addons.py") os.chdir(opPath) def redirect_off(self): dir = os.path.dirname(os.getcwd()) + "\\utils" opPath = os.getcwd() os.chdir(dir) os.system("^C") os.chdir(opPath) def set_ie_proxy(self, enable, proxyIp, IgnoreIp): """ :param enable: 0-close proxy; 1-open proxy :param proxyIp: proxy ip :param IgnoreIp: ignored proxy ip :return: """ KEY_PATH = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings" hKey = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KEY_PATH, 0, win32con.KEY_ALL_ACCESS) win32api.RegSetValueEx(hKey, "ProxyEnable", 0, win32con.REG_DWORD, enable) win32api.RegSetValueEx(hKey, "ProxyServer", 0, win32con.REG_SZ, proxyIp) win32api.RegSetValueEx(hKey, "ProxyOverride", 0, win32con.REG_SZ, IgnoreIp) retVal = win32api.RegQueryValueEx(hKey, "ProxyEnable") win32api.RegCloseKey(hKey) if retVal[0] == enable: print("切换IE代理成功") logging.info("++++++++切换IE代理成功++++++++") return True else: print("切换IE代理失败") logging.error("++++++++切换IE代理失败++++++++") return False if __name__ == '__main__': mockInit().main() |
utils:存储调用关系和具体配置
addons.py:调用关系
from src.mockServer.mock import Mock addons=[ Mock() ] |
conf.py:路径配置文件
import os DATA_PATH = os.path.dirname(os.getcwd())+ '\\data\\mock_data.yaml' JSON_PATH = os.path.dirname(os.getcwd())+ '\\data\\json_files' |
总结经验
遇到的问题(一)
由于小编所负责的搜狗商城使用的协议是HTTPS协议, 最初遇到的问题就是开启mitproxy工具后,浏览器访问https://mall.sogou.com地址后会直接报错,就像这样:
解决方案(一)
小编也是费了九牛二虎之力找到了解决办法,在开启mitproxy工具后如果访问HTTPS协议需要安装一个它自带的证书“mitmproxy-ca-cert.p12”,就可以完美解决了。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理