🚀 运行: ...
IP: ...
ISP: 检测中...

LiveShot – 网页实时截图与直播 API

LiveShot – 网页实时截图与直播 API

LiveShot 是一个基于 Node.js 和 Puppeteer (Headless Chrome) 的轻量级服务。它允许你通过简单的 API 调用,获取任何网页的高清截图,甚至是以 MJPEG 视频流 的形式实时“直播”网页的变化。特别适合用于 服务器探针监控 (Server Status)、GitHub Profile 动态展示、自动化报表生成 或 网页变动监控。


项目介绍

在低配置的 Linux VPS 上运行 Puppeteer(Chrome)通常是一场噩梦,内存泄漏和 CPU 飙升是家常便饭。

LiveShot 是一个专为 Linux VPS 设计的高性能网页渲染工具。它不仅仅是一个截图 API,还支持生成实时网页 MJPEG 直播流。最重要的是,v4.1 版本针对低资源环境进行了深度优化,实现了零 CPU 轮询开销,并内置了内存守护机制。

核心特性

  • 极低占用:彻底移除了轮询机制,待机 CPU 占用为 0%。
  • 智能守护:通过 PM2 限制最大内存(默认 500MB),防止 Chrome 撑爆服务器,长期运行极度稳定。
  • 安全鉴权:内置 Token 验证,并自动拦截局域网/内网 IP 请求。
  • 功能丰富:支持长截图(Full Page)、自定义分辨率、实时 MJPEG 直播。
  • 便捷管理:提供 lvs 终端快捷指令,拥有全交互式菜单(安装/重启/日志/卸载)。

🚀 一键部署

支持 Debian / Ubuntu 系统。请在 SSH 终端执行以下命令:

Bash

wget -O liveshot.sh https://raw.githubusercontent.com/ypkin/LiveShot/refs/heads/main/liveshot.sh && chmod +x liveshot.sh && ./liveshot.sh

安装完成后,直接输入 lvs 即可呼出管理菜单,查看运行状态或重置 Token。


🛡️ 进阶:Nginx 反代安全配置(隐藏 Token)

默认情况下,API 需要在 URL 中携带 token 参数,这在公开分享(如放入 GitHub Readme 或 OBS 直播源)时非常不安全。

我们可以利用 Nginx 的反向代理功能,将 Token 和目标 URL “写死” 在服务器配置中,对外只暴露一个安全的静态链接。

公开访问效果:

  • 直播流地址:https://your-domain.com/gh-live
  • 静态图地址:https://your-domain.com/gh-shot

🔒 安全设置(Nginx)

修改 Nginx 配置,达到隐藏 Token 的目的!

访问地址:

  • 高清直播:https://服务端域名/gh-live
  • 高清截图:https://服务端域名/gh-shot

Nginx 配置代码:

Nginx

server {
    # 1. 端口监听 (保持原样)
    listen 80;
    listen [::]:80;

    listen 443 ssl;
    listen [::]:443 ssl;

    listen 443 quic;
    listen [::]:443 quic;

    server_name 服务端域名;

    # 2. SSL 证书 (保持原样)
    ssl_certificate /etc/nginx/certs/服务端域名_cert.pem;
    ssl_certificate_key /etc/nginx/certs/服务端域名_key.pem;

    # 3. HTTP 强制跳转 HTTPS
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }

    # =========================================================
    # [新增] 安全直播路由 (用于 HTML / 实时监控)
    # 访问地址: https://服务端域名/gh-live
    # =========================================================
    location = /gh-live {
        # 【核心配置】写死参数:URL 和 Token
        set $args "url=https://监控网站域名&token=mytoken";

        # 转发到后端 /live 接口
        proxy_pass http://服务端ip:3000/live;

        # 直播流专用配置 (必须关闭缓冲和缓存)
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_cache off;
        chunked_transfer_encoding on;

        # 保持 HTTP/3 支持
        add_header Alt-Svc 'h3=":443"; ma=86400';
    }

    # =========================================================
    # [新增] 安全静态截图路由 (用于 GitHub README)
    # 访问地址: https://服务端域名/gh-shot
    # =========================================================
    location = /gh-shot {
        # 【核心配置】写死参数:URL 和 Token (指定 720P 分辨率)
        set $args "url=https://监控网站域名&token=mytoken&width=1280&height=720";

        # 转发到后端 /screenshot 接口
        proxy_pass http://服务端ip:3000/screenshot;

        proxy_set_header Host $host;
        proxy_http_version 1.1;
        
        add_header Alt-Svc 'h3=":443"; ma=86400';
    }

    # =========================================================
    # [原有] 通用根路径 (需要手动带参数)
    # =========================================================
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   Host $host;
        
        proxy_pass         http://服务端ip:3000;
        
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";

        add_header Alt-Svc 'h3=":443"; ma=86400';
    }

    # =========================================================
    # [原有] 静态资源缓存
    # =========================================================
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|bmp|swf|eot|svg|ttf|woff|woff2|webp)$ {
        proxy_pass http://服务端ip:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        
        proxy_cache my_proxy_cache;
        proxy_set_header Accept-Encoding "";
        aio threads;
        # add_header Cache-Control $add_cache_control;
        add_header Alt-Svc 'h3=":443"; ma=86400';
        log_not_found off;
        access_log off;
    }

    client_max_body_size 1000m;
}

发表回复