This commit is contained in:
2025-12-25 11:48:21 +08:00
parent 3c6c9f9fbf
commit 145dff7a7e
6 changed files with 488 additions and 42 deletions

57
app.py
View File

@@ -6,6 +6,7 @@ from dotenv import load_dotenv
import os
from typing import Optional, Dict, Any
from contextlib import asynccontextmanager
from playwright_sign import sign_with_playwright
# 加载环境变量
load_dotenv()
@@ -26,7 +27,6 @@ browser_context = None
context_page = None
playwright_instance = None
async def get_context_page(instance, stealth_js_path):
chromium = instance.chromium
browser = await chromium.launch(headless=True)
@@ -125,7 +125,7 @@ async def reload_browser():
except Exception as e:
print(f"Error during reload_browser operation: {e}")
raise HTTPException(status_code=500, detail=str(e))
async def sign(uri: str, data: Dict[str, Any], a1: str, web_session: str) -> Dict[str, Any]:
async def sign(uri: str, data: Optional[Dict[str, Any]], a1: str, method: str = "POST") -> Dict[str, Any]:
global browser_context, context_page # 声明全局变量
global global_a1
try:
@@ -137,41 +137,26 @@ async def sign(uri: str, data: Dict[str, Any], a1: str, web_session: str) -> Dic
await context_page.reload()
await asyncio.sleep(1)
# 执行 JavaScript 函数
b1 = await context_page.evaluate("() => localStorage.getItem('b1')")
b1b1 = await context_page.evaluate("() => localStorage.getItem('b1b1')")
encrypt_params = await context_page.evaluate("([url, data]) => window._webmsxyw(url, data)", [uri, data])
if not encrypt_params or not isinstance(encrypt_params, dict):
raise HTTPException(status_code=500, detail="Failed to retrieve encryption parameters")
# 使用 playwright_sign 模块的 sign_with_playwright 函数
signs = await sign_with_playwright(context_page, uri, data, a1, method)
return {
"x-s": encrypt_params["X-s"],
"x-t": str(encrypt_params["X-t"]),
"b1": b1,
"x-s": signs["x-s"],
"x-t": signs["x-t"],
"x-s-common": signs["x-s-common"],
"x-b3-traceid": signs["x-b3-traceid"],
"a1": global_a1,
"b1b1": b1b1,
}
except Exception as e:
print(f"Error during sign operation: {e}")
# 检测页面崩溃错误并重新初始化
if "Target crashed" in str(e):
print("页面崩溃,正在重新初始化浏览器上下文和页面...")
try:
await reload_browser()
# 重试签名操作
return await sign(uri, data, a1, web_session)
except Exception as reinit_error:
print(f"重新初始化失败: {reinit_error}")
raise HTTPException(status_code=500, detail="Failed to recover from page crash")
else:
print(f"Error during sign operation: {e}")
try:
await reload_browser()
# 重试签名操作
return await sign(uri, data, a1, web_session)
except Exception as reinit_error:
print(f"重新初始化失败: {reinit_error}")
raise HTTPException(status_code=500, detail="Failed to recover from page crash")
try:
await reload_browser()
# 重试签名操作
return await sign(uri, data, a1, method)
except Exception as reinit_error:
print(f"重新初始化失败: {reinit_error}")
raise HTTPException(status_code=500, detail="Failed to recover from error")
@app.post("/sign")
@@ -180,10 +165,10 @@ async def sign_endpoint(request: Request):
uri = json_data.get("uri")
data = json_data.get("data")
a1 = json_data.get("a1")
web_session = json_data.get("web_session")
if not uri or not a1:
raise HTTPException(status_code=400, detail="Missing required parameters")
me = await sign(uri, data, a1, web_session)
method = json_data.get("method", "POST")
if not uri or not a1:
raise HTTPException(status_code=400, detail="Missing required parameters")
me = await sign(uri, data, a1, method)
return {
"a1": a1,
"sign": me,