Files
SomeACG-RANDOMPIC/README.md
AkibaSo 7d30c12712 feat: 初始化随机图片服务项目
添加核心功能模块包括:
- 服务入口文件 app.js
- 图片服务、缓存管理、页数检测等核心服务
- 日志工具和定时任务调度器
- 项目配置文件和文档
2025-08-08 03:18:21 +08:00

176 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SomeACG 随机图片服务
基于 someacg 提供的图片列表 API开发的高性能随机图片服务。支持自动页数检测、智能缓存管理和定时更新功能。
## 功能特性
- 🚀 **高性能缓存**: 预加载全量图片数据100% 缓存命中率
- 🔄 **自动更新**: 每日凌晨自动检测最大页数并更新缓存
- 📱 **多端支持**: 支持桌面端和移动端不同尺寸的图片
- 🛡️ **错误处理**: 完善的重试机制和降级策略
- 📊 **状态监控**: 提供详细的服务状态和缓存统计信息
- 🗂️ **智能管理**: 自动清理过期缓存,支持配置缓存大小限制
## 快速开始
### 安装依赖
```bash
npm install
```
### 配置环境变量
复制 `.env.example``.env` 并根据需要修改配置:
```bash
cp .env.example .env
```
主要配置项:
```env
# 服务端口
PORT=3000
# 缓存配置
CACHE_DIR=./cache
MAX_CACHE_SIZE_MB=1024
# API 配置
SOMEACG_API_BASE=https://someacg.vercel.app/api
SOMEACG_CDN_BASE=https://cdn.someacg.top/graph/origin
```
### 启动服务
```bash
# 生产环境
npm start
# 开发环境
npm run dev
```
## API 接口
### 获取随机图片
```http
GET /api/random
```
**查询参数:**
| 参数 | 类型 | 说明 | 可选值 |
|------|------|------|--------|
| size | string/number | 图片尺寸类型 | `1`/`mobile`(移动端), `2`/`desktop`(桌面端),不传则随机 |
| type | string | 返回类型 | `url`(默认,返回图片信息), `image`(直接返回图片数据) |
**响应示例:**
```json
{
"_id": "68889a7645c10a92ad0e8e94",
"quality": true,
"title": "「綺麗。」",
"desc": "",
"file_name": "132641568_p0.jpg",
"size": {
"width": 3024,
"height": 4536,
"_id": "6894f7e091dd1a5cfedcd845"
},
"url": "https://cdn.someacg.top/graph/origin/132641568_p0.jpg",
"cached": true
}
```
### 服务状态
```http
GET /api/status
```
返回服务运行状态、内存使用情况、缓存统计等信息。
### 首页
```http
GET /
```
返回服务基本信息。
## 核心功能
### 页数检测
- 启动时自动检测 someacg API 的最大页数
- 使用二分法高效探测页数范围
- 每日凌晨 2:00 自动更新页数范围
- 支持桌面端和移动端分别检测
### 缓存策略
1. **预加载**: 启动时和每日更新后,全量拉取所有页面的图片列表
2. **随机排序**: 将获取的图片列表随机打乱,确保随机性
3. **本地缓存**: 按顺序下载并缓存图片到本地存储
4. **智能清理**: 达到缓存大小限制时,自动清理最早访问的图片
5. **100% 命中**: 所有用户请求都从本地缓存获取,无需访问外部 CDN
### 错误处理
- **网络重试**: API 请求失败时自动重试 3 次
- **降级策略**: 页数检测失败时使用前一天的缓存数据
- **跳过机制**: 缓存中图片丢失时自动跳到下一张
- **限流处理**: 遇到 429 错误时自动延长等待时间
### 定时任务
- **每日更新**: 凌晨 2:00 自动检测页数并重新预加载缓存
- **健康检查**: 每小时检查服务状态和内存使用情况
- **日志清理**: 每 6 小时执行一次日志清理和垃圾回收
## 项目结构
```
src/
├── app.js # 主应用入口
├── services/
│ ├── CacheManager.js # 缓存管理服务
│ ├── PageDetector.js # 页数检测服务
│ ├── ImageService.js # 图片服务(核心业务逻辑)
│ └── scheduler.js # 定时任务调度器
└── utils/
└── logger.js # 日志工具
```
## 配置说明
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| PORT | 3000 | 服务端口 |
| CACHE_DIR | ./cache | 缓存目录 |
| MAX_CACHE_SIZE_MB | 1024 | 最大缓存大小MB |
| MAX_PAGE_DETECTION_TIMEOUT | 30000 | 页数检测超时时间(毫秒) |
| MAX_RETRY_ATTEMPTS | 3 | 最大重试次数 |
| LOG_LEVEL | info | 日志级别 |
## 性能优化
- 使用本地缓存避免频繁访问外部 CDN
- 批量并发下载图片,提高预加载效率
- 智能缓存清理策略,避免磁盘空间不足
- 内存使用监控和垃圾回收机制
## 注意事项
1. 首次启动需要较长时间进行预加载,请耐心等待
2. 确保有足够的磁盘空间用于图片缓存
3. someacg CDN 对单 IP 有并发限制,预加载过程中可能遇到 429 错误
4. 建议在服务器环境中运行,以获得更好的网络稳定性
## 许可证
MIT License