最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用mitmproxy抓取瀏覽器請(qǐng)求的方法

 更新時(shí)間:2019年07月02日 21:39:19   作者:太上-道  
今天小編就為大家分享一篇python使用mitmproxy抓取瀏覽器請(qǐng)求的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

最近要寫一款基于被動(dòng)式的漏洞掃描器,因?yàn)楸粍?dòng)式是將我們?cè)跒g覽器瀏覽的時(shí)候所發(fā)出的請(qǐng)求進(jìn)行捕獲,然后交給掃描器進(jìn)行處理,本來(lái)打算自己寫這個(gè)代理的,但是因?yàn)榭紤]到需要抓取https,所以最后找到Mitmproxy這個(gè)程序。

安裝方法:

pip install mitmproxy

接下來(lái)通過(guò)一個(gè)案例程序來(lái)了解它的使用,下面是目錄結(jié)構(gòu)

sproxy

|utils

|__init__.py

|parser.py

|sproxy.py

sproxy.py代碼

#coding=utf-8
 
from pprint import pprint
from mitmproxy import flow, proxy, controller, options
from mitmproxy.proxy.server import ProxyServer
from utils.parser import ResponseParser
 
# http static resource file extension
static_ext = ['js', 'css', 'ico', 'jpg', 'png', 'gif', 'jpeg', 'bmp']
# media resource files type
media_types = ['image', 'video', 'audio']
 
# url filter
url_filter = ['baidu','360','qq.com']
 
static_files = [
 'text/css',
 'image/jpeg',
 'image/gif',
 'image/png',
]
 
class WYProxy(flow.FlowMaster):
 
 
 def __init__(self, opts, server, state):
  super(WYProxy, self).__init__(opts, server, state)
 
 def run(self):
  try:
   pprint("proxy started successfully...")
   flow.FlowMaster.run(self)
  except KeyboardInterrupt:
   pprint("Ctrl C - stopping proxy")
   self.shutdown()
 
 def get_extension(self, flow):
  if not flow.request.path_components:
   return ''
  else:
   end_path = flow.request.path_components[-1:][0]
   split_ext = end_path.split('.')
   if not split_ext or len(split_ext) == 1:
    return ''
   else:
    return split_ext[-1:][0][:32]
 
 def capture_pass(self, flow):
 	# filter url
  url = flow.request.url
  for i in url_filter:		
			if i in url:
				return True
 
  """if content_type is media_types or static_files, then pass captrue"""
  extension = self.get_extension(flow)
  if extension in static_ext:
   return True
 
  # can't catch the content_type
  content_type = flow.response.headers.get('Content-Type', '').split(';')[:1][0]
  if not content_type:
   return False
 
  if content_type in static_files:
   return True
 
  http_mime_type = content_type.split('/')[:1]
  if http_mime_type:
   return True if http_mime_type[0] in media_types else False
  else:
   return False
 
 @controller.handler
 def request(self, f):
 	pass
 
 @controller.handler
 def response(self, f):
  try:
   if not self.capture_pass(f):
    parser = ResponseParser(f)
    result = parser.parser_data()
    if f.request.method == "GET":
     print result['url']
    elif f.request.method == "POST":
     print result['request_content'] # POST提交的參數(shù)
 
  except Exception as e:
   raise e
 
 @controller.handler
 def error(self, f):
 	pass
  # print("error", f)
 
 @controller.handler
 def log(self, l):
 	pass
  # print("log", l.msg)
 
def start_server(proxy_port, proxy_mode):
 port = int(proxy_port) if proxy_port else 8090
 mode = proxy_mode if proxy_mode else 'regular'
 
 if proxy_mode == 'http':
  mode = 'regular'
 
 opts = options.Options(
  listen_port=port,
  mode=mode,
  cadir="~/.mitmproxy/",
  )
 config = proxy.ProxyConfig(opts)
 state = flow.State()
 server = ProxyServer(config)
 m = WYProxy(opts, server, state)
 m.run()
 
 
if __name__ == '__main__':
	start_server("8090", "http")

parser.py

# from __future__ import absolute_import
 
class ResponseParser(object):
 """docstring for ResponseParser"""
 
 def __init__(self, f):
  super(ResponseParser, self).__init__()
  self.flow = f
 
 def parser_data(self):
  result = dict()
  result['url'] = self.flow.request.url
  result['path'] = '/{}'.format('/'.join(self.flow.request.path_components))
  result['host'] = self.flow.request.host
  result['port'] = self.flow.request.port
  result['scheme'] = self.flow.request.scheme
  result['method'] = self.flow.request.method
  result['status_code'] = self.flow.response.status_code
  result['content_length'] = int(self.flow.response.headers.get('Content-Length', 0))
  result['request_header'] = self.parser_header(self.flow.request.headers)
  result['request_content'] = self.flow.request.content
  return result
 
 @staticmethod
 def parser_multipart(content):
  if isinstance(content, str):
   res = re.findall(r'name=\"(\w+)\"\r\n\r\n(\w+)', content)
   if res:
    return "&".join([k + '=' + v for k, v in res])
   else:
    return ""
  else:
   return ""
 
 @staticmethod
 def parser_header(header):
  headers = {}
  for key, value in header.items():
   headers[key] = value
  return headers
 
 @staticmethod
 def decode_response_text(content):
  for _ in ['UTF-8', 'GB2312', 'GBK', 'iso-8859-1', 'big5']:
   try:
    return content.decode(_)
   except:
    continue
  return content

參考鏈接:

https://github.com/ring04h/wyproxy

以上這篇python使用mitmproxy抓取瀏覽器請(qǐng)求的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python排序算法快速排序VS歸并排序深入對(duì)比分析

    Python排序算法快速排序VS歸并排序深入對(duì)比分析

    快速排序和歸并排序是兩種常見的排序算法,在Python中有著重要的應(yīng)用,本文將深入探討這兩種算法的原理和實(shí)現(xiàn),并提供豐富的示例代碼來(lái)說(shuō)明它們的工作方式
    2024-01-01
  • pandas apply 函數(shù) 實(shí)現(xiàn)多進(jìn)程的示例講解

    pandas apply 函數(shù) 實(shí)現(xiàn)多進(jìn)程的示例講解

    下面小編就為大家分享一篇pandas apply 函數(shù) 實(shí)現(xiàn)多進(jìn)程的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python3.4 splinter(模擬填寫表單)使用方法

    Python3.4 splinter(模擬填寫表單)使用方法

    今天小編就為大家分享一篇Python3.4 splinter(模擬填寫表單)使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python?eval()?函數(shù)看這一篇就夠了

    Python?eval()?函數(shù)看這一篇就夠了

    eval(str)函數(shù)很強(qiáng)大,官方解釋為將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Python?eval()?函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Python實(shí)現(xiàn)8個(gè)概率分布公式的方法詳解

    Python實(shí)現(xiàn)8個(gè)概率分布公式的方法詳解

    在本文中,我們將介紹一些常見的分布(均勻分布、高斯分布、對(duì)數(shù)正態(tài)分布等)并通過(guò)Python代碼進(jìn)行可視化以直觀地顯示它們,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Sublime如何配置Python3運(yùn)行環(huán)境

    Sublime如何配置Python3運(yùn)行環(huán)境

    這篇文章主要介紹了Sublime如何配置Python3運(yùn)行環(huán)境問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Django中Migrate和Makemigrations實(shí)操詳解

    Django中Migrate和Makemigrations實(shí)操詳解

    這篇文章主要為大家介紹了Django中Migrate和Makemigrations實(shí)操詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • keras獲得某一層或者某層權(quán)重的輸出實(shí)例

    keras獲得某一層或者某層權(quán)重的輸出實(shí)例

    今天小編就為大家分享一篇keras獲得某一層或者某層權(quán)重的輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python3 中文文件讀寫方法

    Python3 中文文件讀寫方法

    下面小編就為大家分享一篇Python3 中文文件讀寫方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • python實(shí)現(xiàn)代碼審查自動(dòng)回復(fù)消息

    python實(shí)現(xiàn)代碼審查自動(dòng)回復(fù)消息

    這篇文章主要介紹了python實(shí)現(xiàn)代碼審查回復(fù)消息生成的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2021-02-02

最新評(píng)論

金坛市| 乐都县| 云阳县| 武夷山市| 罗源县| 通城县| 洛南县| 清徐县| 南靖县| 谷城县| 巩义市| 郎溪县| 东明县| 阳春市| 金沙县| 聂荣县| 花莲市| 棋牌| 河曲县| 论坛| 唐山市| 永清县| 安龙县| 江西省| 金塔县| 泾源县| 邻水| 北流市| 彰武县| 林芝县| 龙川县| 饶阳县| 上思县| 邯郸县| 齐河县| 岐山县| 金华市| 松潘县| 灵寿县| 绩溪县| 兴仁县|