v1.7.3 前端新增后端选择器 + 暴露 /api/backends + 接通 chrome-cdp 后端
- 新增 GET /api/backends 返回可用后端/默认顺序/说明,供前端动态渲染 - 前端表单新增「捕获后端」下拉框: 自动(默认,优先agent-browser超时自动回退playwright)/agent-browser/playwright/chrome-cdp,不可用的置灰 - 接通 chrome-cdp 后端: 之前函数已实现但 capture_webpage 未接线(传 backend=chrome-cdp 会报 Unknown backend),现支持 screenshot/html/text,连接已开的 Chrome(--remote-debugging-port) - 前端 currentData 携带 backend 字段
This commit is contained in:
@@ -708,6 +708,14 @@ async def capture_with_cdp(
|
||||
"html": html
|
||||
})
|
||||
|
||||
elif action == "text":
|
||||
text = await page.evaluate("document.body.innerText")
|
||||
result_data.append({
|
||||
"url": current_url,
|
||||
"title": title,
|
||||
"text": clean_text(text)
|
||||
})
|
||||
|
||||
if result_data:
|
||||
return {"success": True, "pages": result_data}
|
||||
else:
|
||||
@@ -983,13 +991,14 @@ def capture_webpage(
|
||||
full_page: bool = False,
|
||||
viewport: dict = None,
|
||||
wait_time: int = 2000,
|
||||
backend: str = "auto"
|
||||
backend: str = "auto",
|
||||
cdp_port: int = 9222
|
||||
):
|
||||
"""
|
||||
捕获网页
|
||||
|
||||
Args:
|
||||
backend: "auto", "agent-browser", "playwright"
|
||||
backend: "auto", "agent-browser", "playwright", "chrome-cdp"
|
||||
"""
|
||||
# 选择后端
|
||||
if backend == "auto":
|
||||
@@ -1044,6 +1053,33 @@ def capture_webpage(
|
||||
except Exception as e:
|
||||
return {"success": False, "error": str(e)}
|
||||
|
||||
elif backend == "chrome-cdp":
|
||||
# 连接已打开的 Chrome(需 --remote-debugging-port=<cdp_port>),归一化为单结果
|
||||
if not PLAYWRIGHT_AVAILABLE:
|
||||
return {"success": False, "error": "Playwright not installed (chrome-cdp 依赖 playwright)"}
|
||||
try:
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
r = loop.run_until_complete(
|
||||
capture_with_cdp(url_hint=url, action=action, cdp_port=cdp_port)
|
||||
)
|
||||
loop.close()
|
||||
except Exception as e:
|
||||
return {"success": False, "error": str(e)}
|
||||
if not r.get("success"):
|
||||
return r
|
||||
if not r.get("pages"):
|
||||
return {"success": False, "error": "chrome-cdp 未找到匹配页面(请确认 Chrome 已开 --remote-debugging-port)"}
|
||||
p0 = r["pages"][0]
|
||||
res = {"success": True, "title": p0.get("title", ""), "backend": "chrome-cdp"}
|
||||
if action == "screenshot":
|
||||
res["file_path"] = p0["file_path"]
|
||||
elif action == "html":
|
||||
res["html"] = p0["html"]
|
||||
elif action == "text":
|
||||
res["text"] = p0["text"]
|
||||
return res
|
||||
|
||||
else:
|
||||
return {"success": False, "error": f"Unknown backend: {backend}"}
|
||||
|
||||
@@ -1054,6 +1090,37 @@ def index():
|
||||
return render_template('index.html')
|
||||
|
||||
|
||||
@app.route('/api/backends')
|
||||
def api_backends():
|
||||
"""返回可用后端及默认选择顺序,供前端渲染选择器"""
|
||||
available = []
|
||||
if AGENT_BROWSER_AVAILABLE:
|
||||
available.append("agent-browser")
|
||||
if PLAYWRIGHT_AVAILABLE:
|
||||
available.append("playwright")
|
||||
# chrome-cdp 依赖 playwright 的 connect_over_cdp
|
||||
available.append("chrome-cdp")
|
||||
unavailable = []
|
||||
if not AGENT_BROWSER_AVAILABLE:
|
||||
unavailable.append("agent-browser")
|
||||
if not PLAYWRIGHT_AVAILABLE:
|
||||
unavailable.append("playwright")
|
||||
unavailable.append("chrome-cdp")
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"default": "auto",
|
||||
"available": available,
|
||||
"unavailable": unavailable,
|
||||
"priority": available + unavailable,
|
||||
"labels": {
|
||||
"auto": "自动(推荐:优先 agent-browser,打开超时自动回退 Playwright)",
|
||||
"agent-browser": "agent-browser(Rust 版,反爬强、快,默认首选)",
|
||||
"playwright": "Playwright(Python 版,domcontentloaded 更宽容,慢页面更稳)",
|
||||
"chrome-cdp": "Chrome CDP(连接已打开的 Chrome,需 --remote-debugging-port 启动)"
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@app.route('/api')
|
||||
def api_info():
|
||||
"""API信息"""
|
||||
@@ -1066,6 +1133,7 @@ def api_info():
|
||||
},
|
||||
"endpoints": {
|
||||
"/api/capture": "POST - Capture webpage (screenshot/html/text/smart) + 自动入库历史(记录调用者/方式/原始HTML)",
|
||||
"/api/backends": "GET - 可用后端列表与默认顺序(供前端渲染后端选择器)",
|
||||
"/api/history": "GET - 历史记录分页列表 (?page&page_size&action&search)",
|
||||
"/api/history/<id>": "GET - 历史记录详情 / DELETE - 删除记录",
|
||||
"/api/history/<id>/file": "GET - 读取历史截图文件",
|
||||
@@ -1320,7 +1388,8 @@ def capture():
|
||||
full_page=full_page,
|
||||
viewport=viewport,
|
||||
wait_time=wait_time,
|
||||
backend=backend
|
||||
backend=backend,
|
||||
cdp_port=cdp_port
|
||||
)
|
||||
|
||||
backend_used = result.get("backend", backend)
|
||||
|
||||
Reference in New Issue
Block a user