WechatOnCloud/bridge/woc_bridge/routes/screenshot.py

51 lines
1.8 KiB
Python
Raw Normal View History

from __future__ import annotations
import logging
from fastapi import APIRouter
from fastapi.responses import Response
from woc_bridge.config import _require_qr_capture
from woc_bridge.models import BridgeError
logger = logging.getLogger("woc-bridge")
router = APIRouter()
# ---------------------------------------------------------------------------
# 路由POST /api/screenshot
# ---------------------------------------------------------------------------
@router.post("/api/screenshot")
async def screenshot() -> Response:
"""截取完整屏幕并返回 PNG。
用于前端截图按钮 / 调试时观察微信实际界面状态如确认 UI 操作是否
触发了正确的对话框截取整个 X 桌面DISPLAY _state.config.display 指定
Returns:
ResponseContent-Type=image/pngbody PNG 二进制
Raises:
BridgeError(WINDOW_NOT_FOUND): X 会话未就绪无法截图HTTP 503
其他异常由全局兜底处理器返回 BRIDGE_INTERNAL_ERROR
Notes:
- 截图由 qr_capture.capture_full_screenshot 完成底层调
xdotool/getwindowgeometry + importImageMagick
- /api/login/qr/start 区别本接口截全屏qr/start 截二维码区域
- 大屏幕截图可能 > 1MB调用方注意带宽
"""
logger.info("screenshot: 收到请求")
qr_capture = _require_qr_capture()
try:
png_bytes = await qr_capture.capture_full_screenshot()
except BridgeError as e:
logger.warning("screenshot: 失败 %s: %s", e.code, e.message)
raise
except Exception as e:
logger.warning("screenshot: 失败 %s: %s", type(e).__name__, e)
raise
logger.info("screenshot: ✓ 截图成功 %d bytes", len(png_bytes))
return Response(content=png_bytes, media_type="image/png")