这是一个基于 React (Vite) + Express + Puppeteer 构建的轻量级全栈应用。它能够自动从《梦幻模拟战》哔哩哔哩 Wiki 抓取最新的礼包兑换码,并支持多角色批量自动兑换。
通过高度优化的多阶段 Docker 构建(基于 Alpine Linux),该应用的运行环境与庞大的前端构建工具完全解耦,镜像体积极小,资源占用极低,非常适合在个人轻量级服务器(NAS/VPS)上长期挂机运行。
本项目采用了前后端同构(在一个仓库中)的架构设计:
Langrisser-Code-Scraper/
├── src/ # ���端 React 源代码目录,使用 Vite 构建现代化单页应用 (SPA)。
├── server.ts # 后端核心引擎:包含 Express API 路由、Puppeteer 无头浏览器爬虫以及定时任务 (Cron) 逻辑。
├── Dockerfile # 极致优化的多阶段构建脚本。通过剥离冗余依赖,将镜像大小从 2.5GB 压缩至 1.2GB 左右。
├── docker-compose.yml # 容器编排配置文件,定义了服务启动方式、端口映射、环境变量以及数据卷挂载。
├── package.json # Node.js 依赖及脚本配置文件。
└── used_codes.json # 运行时挂载的数据持久化文件,用于记录已经成功兑换的礼包码,防止重复请求。
本应用将核心配置全部抽离为环境变量,你可以在部署前直接修改 docker-compose.yml 中的参数,而无需修改任何源代码或重新编译。
如果你宿主机的 3000 端口已被其他服务占用,可以直接修改 docker-compose.yml 里的 ports 映射:
ports:
- "8888:3000" # 左侧为你的外网访问端口,右侧为容器内部端口。修改左侧即可(例如改为 8888)。
默认情况下,爬虫每 15 分钟执行一次。你可以通过修改环境变量 CRON_SCHEDULE 来动态调整(使用标准的 Cron 表达式):
environment:
- CRON_SCHEDULE=*/30 * * * * # 修改为每 30 分钟执行一次
# - CRON_SCHEDULE=0 * * * * # 或者修改为每小时执行一次
为防止容器重启后“已使用兑换码”的历史记录丢失,docker-compose.yml 中配置了 volume 映射:
volumes:
- ./used_codes.json:/app/used_codes.json
注意:部署前必须在宿主机手动创建好这个空文件(见下方部署指南),否则 Docker 会错误地创建一个同名文件夹。
请确保你的服务器已安装 Docker 和 Docker Compose。
如果你直接使用 Docker Hub 的镜像,只需在服务器新建一个目录,并创建 docker-compose.yml 文件(内容参考本项目中的配置)。如果基于源码部署,请 git clone 本仓库并进入根目录。
在包含 docker-compose.yml 的目录下,执行以下命令创建一个空的 JSON 文件,用于存储已兑换的记录:
echo "[]" > used_codes.json
使用以下命令在后台启动服务:
选项 A: 直接使用线上镜像 (推荐,最快)
在 docker-compose.yml 的 services.langrisser-scraper 下添加 image: dangerwolf/langrisser-code-scraper:latest 并删除 build: .,然后运行:
docker-compose up -d
选项 B: 基于源码本地构建镜像
# 第一次构建并启动
docker-compose up -d --build
你可以通过以下命令实时查看爬虫在后台的抓取日志与工作状态:
docker logs -f langrisser-scraper
现在,打开浏览器访问 http://你的服务器IP:你设置的端口 即可进入可视化管理界面!
Content type
Image
Digest
sha256:0d765ead9…
Size
447.3 MB
Last updated
6 months ago
docker pull dangerwolf/langrisser-code-scraper:1.1.1