logo
0
0
Login
编辑文件 README.md

在线 Web 截图应用 — 项目简介

一、项目概述

构建一个基于 Python 的在线 Web 截图服务,提供一个Web 前端管理 Docker 中的 Chrome(使用镜像 selenium/standalone-chrome:latest)并能实时预览容器内 Chrome 页面的能力。目标用户为需要远程批量抓取页面截图、生成缩略图以及人工审核/预览页面渲染效果的产品/测试人员。


二、核心目标

  • 对任意可访问 URL 生成高质量截图(支持全页/可视区/自定义裁剪)。
  • 提供一个管理面板,可启动/停止/查看运行中的 Chrome 容器,并支持在浏览器中预览容器内页面(通过 noVNC / DevTools 协议)。
  • 支持同步与异步截图(HTTP 同步接口与任务队列),并能保存历史和元数据。
  • 安全隔离、资源限额与认证授权。

三、功能需求

3.1 用户/界面

  • 登录/权限(管理员、普通用户)。
  • Dashboard:运行中容器列表、资源使用、日志入口。
  • 启动/停止/重启 Chrome 容器(选择内存、CPU 限额、分辨率)。
  • 点击某容器可进入实时预览页面(嵌入 noVNC 或以图像流方式实时刷新)。
  • 截图任务管理:提交任务、查看状态、下载图片、重试、查看历史。

3.2 API

  • POST /api/screenshot:提交截图任务(参数:url, width, height, full_page, wait_selector/wait_ms, device_pixel_ratio, cookies/headers 等)。
  • GET /api/screenshot/{id}:获取任务状态与结果(或重定向到图片)。
  • GET /api/containers:列出管理的容器。
  • POST /api/containers/{id}/start/stop:控制容器。

3.3 非功能需求

  • 并发处理能力(基于容器/队列扩展)。
  • 截图一致性(可配置等待策略、JS 执行等待等)。
  • 日志与审计(任务记录、容器操作日志)。

四、架构概览

[用户浏览器] <--HTTPS--> [前端 (React/Vue)] | v [后端 API (FastAPI/Flask)] | +------------+-------------+ | | [任务队列:Redis/RQ 或 Celery + Redis/RabbitMQ] | | [Worker] [Docker 管理器] | (docker-py) v | 启动/连接 selenium 容器 <-----> docker host (运行 selenium/standalone-chrome) | | 通过 Selenium / CDP 控制 Chrome noVNC (可选) 提供实时 VNC 预览

五、技术选型

  • 后端:Python 3.10+,框架推荐 FastAPI(异步、性能好、自动文档)。
  • 队列:Celery + Redis/RabbitMQRQ + Redis(实现简单)。
  • 容器管理:docker / docker-compose / docker-py (python SDK)
  • 浏览器容器:selenium/standalone-chrome:latest(自带 VNC,可通过 noVNC 访问)。
  • 前端:React (或 Vue) + Ant Design / Tailwind,用于控制面板与实时预览。
  • 存储:本地文件系统或 S3(截图对象),Postgres/SQLite 存储元数据。
  • 认证:JWT + RBAC(基于 FastAPI 的 OAuth2/JWT 实现)。
  • 日志/监控:Prometheus + Grafana(可选),或 Sentry 错误收集。

六、关键实现细节

6.1 启动和管理容器

使用 docker-py(Python SDK)启动 selenium 镜像:示例参数包括端口映射、环境变量(如 VNC 密码)、资源限制(cgroups)。每个用户/任务可以绑定一个短寿命容器或复用池中的容器。

6.2 预览容器内的 Chrome 页面

两条主路径:

  1. noVNC(推荐用于实时交互):若镜像包含 VNC server + noVNC,反向代理(NGINX)暴露 noVNC URL 或通过 WebSocket 隧道到前端内嵌 noVNC 客户端。优点:真实的交互界面;缺点:带宽/延迟。
  2. DevTools / Selenium 截图流:后端定期通过 Selenium / CDP 获取可视区截图(base64)并通过 WebSocket 推送到前端,表现为“实时刷新图像”。优点:节省带宽、易于控制,缺点:非交互式。

6.3 截图实现要点

  • 支持 fullPage:使用 Chrome DevTools 的 Page.captureScreenshot + 滚动或 CDP 的 Emulation.setDeviceMetricsOverride
  • 等待策略:等待元素出现 (wait_selector)、固定延时、或页面网络空闲(可检测网络请求数)。
  • 防止无限加载:设置超时与重试策略。

七、API 设计示例

POST /api/screenshot Content-Type: application/json { "url":"https://example.com", "width":1280, "height":800, "full_page":true, "wait_for_selector":"#ready", "timeout_ms":20000 } 200 OK { "task_id":"uuid-1234", "status":"queued" }
GET /api/screenshot/{task_id} 200 OK { "task_id":"...", "status":"done", "image_url":"/files/..../uuid.png", "meta":{...} }

八、安全与隔离

  • 对外接口做认证与速率限制(防 DDoS)。
  • 对截图 URL 做白名单(可选)或对外访问代理以避免 SSRF 风险。
  • 使用容器资源限制(CPU, memory)和秒级回收策略,防止滞留占资源。
  • 对用户输入(url、headers、脚本)严格校验与转义。

九、部署建议

  • 使用 Docker Compose 或 Kubernetes(建议生产使用 k8s 以便自动扩缩容)。
  • 将任务队列、后端、前端、存储、监控分布在不同服务上。
  • 使用 Nginx 做反向代理、TLS 终端与 noVNC WebSocket 转发。

十、开发里程碑(示例)

  1. 准备阶段(1 周):技术选型,搭建基础仓库,准备 CI/CD 模板。
  2. 核心后端(2 周):实现 FastAPI 接口、任务队列、基本容器启动/停止逻辑。
  3. 截图 Worker(1 周):集成 Selenium/CDP,支持静态截图与 full-page。
  4. 前端面板(2 周):容器管理面板、任务提交页、历史与下载。
  5. 实时预览(1-2 周):实现 noVNC 嵌入或 screenshot-stream。
  6. 安全/监控/测试(1 周):加入认证、日志、压力测试与优化。

十一、示例 Docker Compose(最小化)

version: '3' services: chrome: image: selenium/standalone-chrome:latest shm_size: '2g' ports: - "4444:4444" # selenium - "5900:5900" # vnc(如有) - "7900:7900" # noVNC(镜像支持时) environment: - SE_VNC_PASSWORD=secret volumes: - ./screens:/screens

项目架构

web-screenshot-app/ ├─ backend/ │ ├─ Dockerfile │ ├─ requirements.txt │ ├─ app/ │ │ ├─ main.py │ │ ├─ api.py │ │ ├─ tasks.py │ │ ├─ docker_manager.py │ │ └─ utils.py │ └─ start.sh ├─ frontend/ │ ├─ Dockerfile │ ├─ package.json │ ├─ vite.config.js │ └─ src/ │ ├─ main.jsx │ ├─ App.jsx │ ├─ api.js │ └─ index.css └─ docker-compose.yml

About

No description, topics, or website provided.
Language
Markdown100%