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.27 版本针对低资源环境进行了深度优化,实现了零 CPU 轮询开销,并内置了内存守护机制。
核心特性
- 截图秒开:/gh-shot 默认尺寸有 60 秒内内存缓存帧直接发,不现截(3–5s → 约 0.4s);缓存过期时读盘上 1 小时内的 last-frame.jpg 兜底。
- 直播常驻制片方:启动即开目标页,没人看也不关;新观众首帧即直播帧(约 0.5s),不用等冷启动;挂了 5 秒后自动重开。
- 直播帧率 2 秒:截图间隔 2 秒(跟页面数据推送节奏一致),地图重绘节流同步到 2 秒。
- 直播限时防蹭流:/gh-live 连续观看超 2 分钟自动断开(直播流约 85KB/s,开着不管很费流量),刷新即可再看。
- 缓冲占位图:直播无帧时先发一张“服务器列表正在加载”占位图(1280×1240),观众不等黑屏。
- 随机换主题:7 套主题(冰蓝 / 绯红 / 翡翠 / 琥珀 / 暮紫 / 霓虹 / 碳黑)每次新开页随机抽、必与上次不同,首次默认冰蓝;制片方整页重建时也会换。
- 时间标签:截图页地图下方注入时间标签,透明背景、靠左、颜色同主题、36px,北京时间带秒(YYYY-MM-DD HH:MM:SS),每秒更新;制片方重载后重新注入。
- 防内存泄漏:制片方页面每 6 小时整页重建一次(关旧页开新页、重新播种并抽一套新主题),清空 JS 堆与 DOM,客户端不断线;每 10 帧强制 GC;Chromium JS 堆上限 256M;pm2 内存超 1024M 自动重启。
- 安全鉴权:内置 Token 验证,并自动拦截局域网/内网 IP 请求;仅监听 127.0.0.1,对外走 Nginx 反代。
- 极低占用:单浏览器共享制,同一目标只开一个页面、所有观众共用它的帧;页面动画冻结、地图节流,空闲时几乎不耗 CPU。
- 便捷管理:提供 lvs 终端快捷指令,拥有全交互式菜单(安装/重启/日志/卸载)。
🚀 一键部署
支持 Debian / Ubuntu / Alpine 系统。请在 SSH 终端执行以下命令:
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 的目的!
访问地址:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name 服务端域名;
# SSL 证书配置...
# ssl_certificate /etc/nginx/certs/服务端域名_cert.pem;
# ssl_certificate_key /etc/nginx/certs/服务端域名_key.pem;
# 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";
# 转发到后端 /gh-live 接口(LiveShot 只监听 127.0.0.1:6000)
proxy_pass http://127.0.0.1:6000/gh-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;
}
# =========================================================
# 安全静态截图路由(用于 GitHub README)
# 访问地址:https://服务端域名/gh-shot
# =========================================================
location = /gh-shot {
# 【核心配置】写死参数:URL、Token 和分辨率(默认 1280×1240)
set $args "url=https://监控网站域名&token=mytoken&width=1280&height=1240";
# 转发到后端 /gh-shot 接口
proxy_pass http://127.0.0.1:6000/gh-shot;
proxy_set_header Host $host;
proxy_http_version 1.1;
}
# =========================================================
# 原生接口(需要手动带参数)
# =========================================================
location / {
proxy_pass http://127.0.0.1:6000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}可选:屏蔽爬虫
机器人会把无限直播流当图片死命下载,浪费流量。在 http 块加 UA 判断,/gh-live 与 /gh-shot 对机器人直接返回 403:
map $http_user_agent $is_bot {
default 0;
~*Googlebot|bingbot|Baiduspider|YandexBot|Applebot|ChatGPT|ClaudeBot|MetaAI 1;
}
# 在 /gh-live 与 /gh-shot 内加:
# if ($is_bot) { return 403; }可选:屏蔽指定地区 IP
用 geo 模块按 IP 段返回 403,例如屏蔽中国大陆 IP:
geo $is_cn {
default 0;
include /etc/nginx/cn-geo.conf; # 中国大陆 IPv4 + IPv6 段列表
}
# 在 /gh-live、/gh-shot、/ 内加:
# if ($is_cn) { return 403; }🔗 API 文档
服务只监听 127.0.0.1:6000,对外请走 Nginx 反代。两个接口均需 token 鉴权。
- 截图 /gh-shot:参数 url、token、width、height、full。默认 1280×1240;full=true 为整页截图;默认尺寸有缓存秒开。
- 直播 /gh-live:参数 url、token。multipart/x-mixed-replace 流,2 秒一帧;无帧时先发缓冲占位图;单次连续观看上限 2 分钟,超时自动断开。
