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)