在 Python 程式中啟動 mitmproxy 並控制 addon
適用於 mitmproxy v5.3
mitmproxy 本身是個 Python 包,比如mitmweb
命令實際是如下程式碼
#!/Users/niconi/venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from mitmproxy.tools.main import mitmweb
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(mitmweb())
mitmproxy 提供了 addon 的方式編寫代理規則,比如如下 addon 給每個請求加上一個請求頭 mitmproxy:default
:
# addon.py
from mitmproxy import contentviews, http
class Rewrite:
flag = 'default'
@classmethod
def set_flag(self, value):
self.flag = value
def request(self, flow):
flow.request.headers['mitmproxy'] = self.flag
addons = [
Rewrite()
]
如果只是想在一個 Python 程式中啟動 mitmproxy,可以用 subprocess
,但因為是另一個記憶體空間,很難做到在程式執行時控制 addon,用執行緒可以達到這個效果:
# mitmweb_wraper.py
from mitmproxy import proxy, options
from mitmproxy.tools.web.master import WebMaster
import threading,asyncio
import addon
class MitmWebWraper(object):
mitmweb = None
thread = None
def loop_in_thread(self, loop, mitmweb):
asyncio.set_event_loop(loop)
mitmweb.run()
def start(self):
opts = options.Options(listen_host='0.0.0.0', listen_port=8080,
confdir='~/.mitmproxy', ssl_insecure=True)
pconf = proxy.config.ProxyConfig(opts)
self.mitmweb = WebMaster(opts)
self.mitmweb.server = proxy.server.ProxyServer(pconf)
self.mitmweb.addons.add(addon)
loop = asyncio.get_event_loop()
self.thread = threading.Thread(
target=self.loop_in_thread, args=(loop, self.mitmweb))
try:
self.thread.start()
except KeyboardInterrupt:
self.mitmweb.shutdown()
if __name__ == "__main__":
mitmweb_wraper = MitmWebWraper()
mitmweb_wraper.start()
在另一個 Python 程式中,透過 mitmweb_wraper 啟動 mitmweb,並且 import addon,對 addon 的修改會立即生效,新增的請求頭會變成 mitmproxy:changed
:
import mitmweb_wraper, addon
mitmweb_wraper = mitmweb_wraper.MitmWebWraper()
mitmweb_wraper.start()
addon.Rewrite().set_flag('changed')
相關文章
- 在Docker中安裝PostgreSQL的ODBC驅動並新增Python測試程式碼DockerSQLPython
- 在Docker中安裝GaussDB的ODBC驅動並新增Python測試程式碼DockerPython
- ATMS中去拉起新的程式,並在新程式啟動後呼叫attachApplication時,resume待啟動的ActivityAPP
- VMware在windows自啟動,並開啟虛擬機器Windows虛擬機
- 在 Docker 中啟動 JupyterDocker
- [BUG反饋]defined('ADDON_PATH') or define('ADDON_PATH', APP_PATH.'Addon');APP
- 在python程式中呼叫java程式碼PythonJava
- mitmproxyMIT
- 在CMakeLists.txt中設定版本號,並在程式碼中呼叫
- Linux中如何啟動程式?啟動程式的方法是什麼?Linux
- C++ addon
- mitmproxy中libmproxy簡單介紹MITIBM
- Python 在Word中建立表格並填入資料、圖片Python
- systemctl 命令在 Linux 中啟動、停止和重新啟動服務Linux
- # Python -05 程式的控制Python
- 在React Native中構建啟動屏React Native
- Tomcat在SpringBoot中是如何啟動的TomcatSpring Boot
- Go控制Docker啟動MongoDBDockerMongoDB
- 在Linux中,如何啟動、停止或重啟服務?Linux
- python 在命令列中選擇檔案路徑的互動程式Python命令列
- 動態的控制Panel的顯隱並控制其內容
- Python並行程式設計Python並行行程程式設計
- Python多程序中並行程式設計與程序池Python並行行程程式設計
- python控制windows命令列程式PythonWindows命令列
- 透過Docker啟動Solace,並在Spring Boot透過JMS整合SolaceDockerSpring Boot
- Assemby 打包並啟動jar包JAR
- 在Spring Boot中建立自己的啟動器Spring Boot
- 在linux中無法啟動mysqld 服務LinuxMySql
- 何時停止設計並啟動實施程式設計? - Alter程式設計
- 控制linux啟動的服務Linux
- 在CPython中實現純Python函式的真正並行性Python函式並行
- 重啟python程式Python
- js動態建立元素,並控制元素樣式JS
- Zookeeper 在Linux系統上的安裝,並且啟動zookeeper服務Linux
- 讓小程式在自有App中啟動的技術來了:mPaaS小程式架構深度解析APP架構
- Python 的控制流程式碼混淆Python
- 在Linux中,如何管理服務的自啟動?Linux
- 最好用的中間人攻擊工具mitmproxyMIT