File size: 2,819 Bytes
da21cc3 4c34c0c a32f715 d87880a da21cc3 81c8810 d87880a 4c34c0c d87880a da21cc3 9a4bcfd da21cc3 d87880a 4c34c0c 1ba973c 4c34c0c da21cc3 871b55b d359e10 d87880a d8ef23e da21cc3 d87880a e83f3cd c5e3a60 e503e80 5af27ed e503e80 5af27ed e503e80 5af27ed e503e80 5af27ed e83f3cd da21cc3 5af27ed e503e80 5af27ed e503e80 e83f3cd 871b55b 1dec9a0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
from fastapi import FastAPI, Request, Response, WebSocket, WebSocketDisconnect
import httpx
import uvicorn
import asyncio
import websockets
import logging
import json
app = FastAPI()
TARGET_BASE = "http://127.0.0.1:9222" # Chrome DevTools HTTP 地址
TARGET_WS_BASE = "ws://127.0.0.1:9222" # Chrome DevTools WebSocket 地址
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"])
async def proxy(request: Request, path: str):
url = f"{TARGET_BASE}/{path}"
headers = dict(request.headers)
headers["host"] = "127.0.0.1" # 强制修改 Host 头
body = await request.body()
async with httpx.AsyncClient(follow_redirects=True) as client:
resp = await client.request(
request.method,
url,
headers=headers,
content=body,
params=request.query_params
)
return Response(
content=resp.content,
status_code=resp.status_code,
headers=dict(resp.headers)
)
@app.websocket("/{path:path}")
async def websocket_proxy(websocket: WebSocket, path: str):
await websocket.accept()
target_url = f"{TARGET_WS_BASE}/{path}"
logger.info(f"Forwarding to: {target_url}")
try:
async with websockets.connect(target_url) as target_ws:
# # 1. 先发送初始化命令(必需)
# await target_ws.send(json.dumps({
# "id": 1,
# "method": "Runtime.enable"
# }))
# logger.info("Sent Runtime.enable")
# 2. 启动转发任务
async def forward_client_to_server():
try:
while True:
data = await websocket.receive_text()
logger.info(f"CLIENT->CHROME: {data[:200]}")
await target_ws.send(data)
except WebSocketDisconnect:
logger.info("Client disconnected")
async def forward_server_to_client():
try:
while True:
response = await target_ws.recv()
logger.info(f"CHROME->CLIENT: {response[:200]}")
await websocket.send_text(response)
except websockets.exceptions.ConnectionClosed:
logger.info("Browser disconnected")
await asyncio.gather(
forward_client_to_server(),
forward_server_to_client()
)
except Exception as e:
logger.error(f"Error: {e}")
finally:
await websocket.close()
if __name__ == "__main__":
uvicorn.run("fun:app", host="0.0.0.0", port=8000, reload=True) |