def test_mitmdump(event_loop, tdata): asyncio.set_event_loop(event_loop) main.mitmdump([ "-s", tdata.path(shutdown_script), "-q", "-p", "0", ])
def test_order(event_loop, tdata, capsys): """Integration test: Make sure that the runtime hooks are triggered on startup in the correct order.""" asyncio.set_event_loop(event_loop) main.mitmdump([ "-n", "-s", tdata.path("mitmproxy/data/addonscripts/recorder/recorder.py"), "-s", tdata.path("mitmproxy/data/addonscripts/shutdown.py"), ]) assert re.match( r"Loading script.+recorder.py\n" r"\('recorder', 'load', .+\n" r"\('recorder', 'configure', .+\n" r"Loading script.+shutdown.py\n" r"\('recorder', 'running', .+\n$", capsys.readouterr().out, )
def run_mitmdump(environment, queue_env): """ -q参数屏蔽mitmdump自身日志打印,-s 处理脚本 """ if queue_env == 'meta': sys.argv = [ '', '-p', '8888', '-q', '-s', 'cus_mitmdump/meta_mitmdump_script.py', environment # '-s', '/home/app/spider_man_app/cus_mitmdump/meta_mitmdump_script.py', environment ] mitmdump() if queue_env == 'search': sys.argv = [ '', '-p', '8081', '-q', '-s', 'cus_mitmdump/search_mitmdump_script.py', environment ] mitmdump()
# continue # else: # base_data[k] = self.recursion(v, int_data) for k, v in base_data.items(): if k in ('data', 'rows', 'devNums'): base_data[k] = self.recursion(v, int_data) else: continue elif isinstance(base_data, list): # 递归算法,如果是list 就继续遍历列表中的元素 for i in base_data: self.recursion(i, int_data) # [self.recursion(i, int_data) for i in base_data] elif isinstance(base_data, int): # 对int型做倍增 base_data = base_data * int_data else: base_data = base_data return base_data addons = [Events()] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump # 使用debug模式启动mitmdump # mitmdump(['-p', '8080', '-s', __file__]) # mitmdump -p 8080 -s C:\Users\admin\PycharmProjects\pythondemo\test_mock\recursion.py # 端口需要使用字符串 mitmdump(['-p', '8888', "-s", __file__])
async def test_mitmdump(): main.mitmdump(["-q", "-p", "0"]) await ctx.master._shutdown()
percent_data_list = [0, 0.01, -0.01] for i in range(len(data_dict["data"]["items"])): print("REWRITE中") person_ind = i % len(percent_data_list) data_dict["data"]["items"][i]["quote"][ "percent"] = percent_data_list[person_ind] flow.response.text = json.dumps(data_dict) def recursion(data, times=1): """递归方式把所有浮点数倍增""" if isinstance(data, dict): for k, v in data.items(): data[k] = recursion(v, times) elif isinstance(data, list): data = [recursion(i, times) for i in data] elif isinstance(data, float): return data * times else: # 非浮点数不做任何处理 return data return data addons = [HTTPEvents()] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump mitmdump(['-p', '9999', '-s', __file__])
def main(args=None): if args is None: args = sys.argv[1:] parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument("-v", "--version", action="version", version="%(prog)s {ver}".format(ver=__version__)) # Proxy Configuration parser.add_argument("-lh", "--host", help="proxy listen host.", dest="listen_host", default="127.0.0.1") parser.add_argument("-lp", "--port", help="proxy listen port", dest="listen_port", type=int, default=8080) parser.add_argument("-s", "--socks", help="use as socks proxy (not http proxy)", action='store_true') parser.add_argument( "-a", "--auth", help="set proxy authentication (format: 'username:pass')", dest="auth", default="") parser.add_argument("-i", "--insecure", help="insecure ssl", action='store_true') parser.add_argument("-d", "--debug", help="Debug Log.", action="store_true") # MultiTor Configuration parser.add_argument("-p", "--tor-processes", help="number of tor processes in the cycle", dest="processes", type=int, default=2) parser.add_argument("-c", "--tor-cmd", help="tor cmd (executable path + arguments)", dest="cmd", default="tor") parser.add_argument("-e", "--tor-config", help="tor extended json configuration", dest="config", default="{}") # When To Change IP Address parser.add_argument( "--on-count", help="change ip every x requests (resources also counted)", type=int, default=0) parser.add_argument( "--on-string", help="change ip when string found in the response content", default="") parser.add_argument( "--on-regex", help="change ip when regex found in The response content", default="") parser.add_argument("--on-rst", help="change ip when connection closed with tcp rst", action="store_true") parser.add_argument("--on-error-code", help="change ip when a specific status code returned", type=int, default=0) sys_args = vars(parser.parse_args(args=args)) mitmdump_args = [ '--scripts', __file__, '--mode', 'socks5' if sys_args['socks'] else 'regular', '--listen-host', sys_args['listen_host'], '--listen-port', str(sys_args['listen_port']), '--set', f'tor_cmd={sys_args["cmd"]}', '--set', f'tor_config={sys_args["config"]}', '--set', f'tor_processes={sys_args["processes"]}', '--set', f'on_string={sys_args["on_string"]}', '--set', f'on_regex={sys_args["on_regex"]}', '--set', f'on_count={sys_args["on_count"]}', '--set', f'on_error_code={sys_args["on_error_code"]}', ] if sys_args['auth']: mitmdump_args.extend([ '--proxyauth', sys_args["auth"], ]) if sys_args['on_rst']: mitmdump_args.extend([ '--set', f'on_rst', ]) if sys_args['debug']: mitmdump_args.extend([ '--verbose', ]) if sys_args['insecure']: mitmdump_args.extend([ '--ssl-insecure', ]) return mitmdump(args=mitmdump_args)
def run(): scriptpath = os.path.join(bindir, 'script.py') assert os.path.exists(scriptpath), 'script.py not found' sys.argv += ['-s', scriptpath] sys.exit(mitmdump())
async def test_mitmdump(): main.mitmdump([ "-q", "-p", "0", "-s", shutdown_script ])
class Page: def response(self,flow:mitmproxy.http.HTTPFlow): if "https://stock.xueqiu.com/v5/stock/batch/quote.json?" in flow.request.url and "x=" in flow.request.url: data = json.loads(flow.response.text) data["data"]["items"][0]["quote"]["name"] = "toyaya1" data["data"]["items"][1]["quote"]["name"] = "toyaya2" data["data"]["items"][2]["quote"]["name"] = "toyaya3" data["data"]["items"][3]["quote"]["name"] = "toyaya4" data["data"]["items"][0]["quote"]["current"] = "0" data["data"]["items"][0]["quote"]["percent"] = "0.01" data["data"]["items"][1]["quote"]["percent"] = "0" data["data"]["items"][2]["quote"]["percent"] = "-3.00" data["data"]["items"][3]["quote"]["percent"] = "65.9287626373839393003039383873737373" flow.response.text = json.dumps(data) addons = [ Page() ] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump mitmdump(['-p', '1130', "-s", __file__])
def main(args=None): if args is None: args = sys.argv[1:] parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument("-v", "--version", action="version", version="%(prog)s {ver}".format(ver=__version__)) # Proxy Configuration parser.add_argument("-lh", "--host", help="Proxy Listen Host.", dest="listen_host", default="127.0.0.1") parser.add_argument("-lp", "--port", help="Proxy Listen Port.", dest="listen_port", type=int, default=8080) parser.add_argument("-s", "--socks", help="Use As Socks Proxy (Not HTTP Proxy).", action='store_true') parser.add_argument( "-a", "--auth", help="Set proxy authentication (Format: 'username:pass').", dest="auth", default="") parser.add_argument("-i", "--insecure", help="Insecure SSL.", action='store_true') parser.add_argument("-d", "--debug", help="Debug Log.", action="store_true") # MultiTor Configuration parser.add_argument("-p", "--tor-processes", help="Number Of Tor Processes On The Cycle.", dest="processes", type=int, default=2) parser.add_argument("-c", "--tor-cmd", help="Tor Cmd (Executable Path + Arguments).", dest="cmd", default="tor") # When To Change IP Address parser.add_argument( "--on-count", help="Change IP Every x Requests (Resources Also Counted).", type=int, default=0) parser.add_argument( "--on-string", help="Change IP When String Found On The Response Content.", default="") parser.add_argument( "--on-regex", help="Change IP When Regex Found On The Response Content.", default="") parser.add_argument("--on-rst", help="Change IP When Connection Closed With TCP RST.", action="store_true") sys_args = vars(parser.parse_args(args=args)) mitmdump_args = [ '--scripts', __file__, '--mode', 'socks5' if sys_args['socks'] else 'regular', '--listen-host', sys_args['listen_host'], '--listen-port', str(sys_args['listen_port']), '--set', f'tor_cmd={sys_args["cmd"]}', '--set', f'tor_processes={sys_args["processes"]}', '--set', f'on_string={sys_args["on_string"]}', '--set', f'on_regex={sys_args["on_regex"]}', '--set', f'on_count={sys_args["on_count"]}', ] if sys_args['auth']: mitmdump_args.extend([ '--proxyauth', sys_args["auth"], ]) if sys_args['on_rst']: mitmdump_args.extend([ '--set', f'on_rst', ]) if sys_args['debug']: mitmdump_args.extend([ '--verbose', ]) if sys_args['insecure']: mitmdump_args.extend([ '--ssl-insecure', ]) return mitmdump(args=mitmdump_args)
""" pass def response(self, flow: mitmproxy.http.HTTPFlow): """ The full HTTP response has been read. """ if "https://stock.xueqiu.com/v5/stock/batch/quote.json?_t" in flow.request.url and "x=" in flow.request.url: # 把str数据类型转换为json格式 data = json.loads(flow.response.text) # 修改雪球股票名称数据 # data["data"]["items"][0]["quote"]["name"] = "多多" # data["data"]["items"][1]["quote"]["name"] = "倾心" # data["data"]["items"][2]["quote"]["name"] = "hogwarts3" # 修改雪球涨跌幅数据 data["data"]["items"][0]["quote"]["percent"] = "-0.01" data["data"]["items"][1]["quote"]["percent"] = "0.01" data["data"]["items"][2]["quote"]["percent"] = "0" # 修改相应数据 flow.response.text = json.dumps(data) addons = [Events()] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump # 使用debug模式启动mitmdump mitmdump(['-p', '8888', '-s', __file__])
# 当数据类型 为 list 的时候, 添加到结构内,并继续递归遍历, # 知道数据类型不为可迭代对象时 data = [self.process_data(value) for value in data] else: data = data return data def change_name_by_number(self, name, number): # print('*************************************') # print(f'before name: {name}, {number}') if (number % 3) == 1: name *= 2 elif (number % 3) == 2: name = '' # print(f'after name: {name}, {number}') # print('*************************************') return name addons = [ Counter() ] if __name__ == '__main__': sys.argv = [__file__, "-s", __file__] # # 官方要求必须主线程 mitmdump()
def test_mitmdump(): main.mitmdump(["-q", "-s", shutdown_script])
# -*- coding:UTF-8 -*- import json import mitmproxy.http from mitmproxy import http from mitmproxy import ctx class Events: def request(self, flow: mitmproxy.http.HTTPFlow): if 'stock.xueqiu.com/v5/stock/batch/quote.json' in flow.request.url and \ '_s' in flow.request.url: flow.response = http.HTTPResponse.make( 200, open('quote.json', encoding='utf-8').read()) addons = [Events()] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump mitmdump(['-p', '8080', "-s", __file__])
import json import mitmproxy.http class Event: def response(self, flow: mitmproxy.http.HTTPFlow): # 修改数据在响应体进行修改 # if 判断该地址是不是在flow体里,为了排除相同地址加了判断条件“x=” # flow.request.url folw包含请求和响应数据,所以要找flow里的request里的url if "https://stock.xueqiu.com/v5/stock/batch/quote.json?_t" in flow.request.url and "x=" in flow.request.url: # 拿到的响应数据是json结构体,需要转换成python结构体,json.loads方法 data_js = json.loads(flow.response.text) # 在结构体里进行精准定位到需要修改数据的名称,并修改 data_js["data"]["items"][0]["quote"]["name"] = "坨坨" data_js["data"]["items"][0]["quote"]["percent"] = "-2" data_js["data"]["items"][0]["quote"]["current"] = "9999999" # 数据修改完后,再将python结构体转换乘json结构体,json.dump方法 flow.response.text = json.dumps(data_js) # 固定写法addons 实列化Event() addons = [Event()] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump # __file__指当前所要执行的文件 mitmdump(["-p", "8888", "-s", __file__])
if isinstance(data, dict): for k, v in data.items(): data[k] = self.number_mod(v, times) elif isinstance(data, list): # new_list = [] # for i in data: # new_list.append(number_mod(i, times)) # data = new_list # 如果有列表嵌套列表 data = [self.number_mod(i, times) for i in data] elif isinstance(data, float): data = data * times else: data = data return data addons = [ Events() ] if __name__ == "__main__": from mitmproxy.tools.main import mitmdump # 使用带-s的debug模式运行 # curl 模拟请求带参数--ssl-no-revoke mitmdump(["-p", "8080", "-s", __file__])
if "https://stock.xueqiu.com/v5/stock/batch/quote.json?_t=" in flow.request.pretty_url: # 拿到响应数据信息 # flow.response.text 是str 属性,所以如果要是操作 # 这个对象的话,必须转换为python 字典的数据结构 # 否则就只能使用和str 相关的 方法 data = json.loads(flow.response.text) data["data"]["items"][0]["quote"]["name"] = "hogwartsssssssssss" flow.response.text = json.dumps(data) # if "http://stuq.ceshiren.com:8089/report/showMapLocal" in flow.request.url: # flow.response.text = '{"resultCode":1,"message":"成功","data":"hogwarts"}' # print(flow.response.text) def error(self, flow: mitmproxy.http.HTTPFlow): """ An HTTP error has occurred, e.g. invalid server responses, or interrupted connections. This is distinct from a valid server HTTP error response, which is simply a response with an HTTP error code. """ pass addons = [Events()] if __name__ == '__main__': from mitmproxy.tools.main import mitmdump # 使用debug模式启动mitmdump # 需要传入的是一个列表,列表包含命令行所使用的启动参数信息 # 端口传入必须为字符串的格式 #mitmdump -p 8888 -s /Users/lixu/project/HogwartsLG7/test_mock/mitm_s.py mitmdump(['-p', '8080', '-s', __file__])
import re import sys from mitmproxy.tools.main import mitmdump if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit(mitmdump())