# Random Mage (new-pixiv-api) 自托管的 Pixiv 随机图片服务:将原图链接导入本地数据库后,通过 `GET /random` 按标签、热度、分辨率、R18、AI、作品类型等条件组合筛选并随机出图。项目同时提供管理后台(Web UI)与后台 Worker(导入/补全/代理探测等任务)。 官方演示站: - `https://i.mukyu.ru/random` - `https://i.mukyu.ru/docs` - `https://i.mukyu.ru/api/docs` > 免责声明:本项目为非官方实现。请遵守 Pixiv ToS、版权与当地法律法规;不要将 `refresh_token`、密钥、代理密码提交到仓库。 ## 近期功能更新(基于最近提交) - `ec9d373`:增强 `/wtf` 顶部筛选布局,支持标签排除筛选、`proxy` 参数自定义反代、选中反馈与单击放大。 - `ef66583`:支持导入 PixivBatchDownloader 导出的 `.json`,并默认关闭该格式的导入后补全。 - `9e437d8` + `80cd41f` + `5159d82` + `53e0890`:持续优化瀑布流页,新增标准/小格子两种展示模式。 - `6a843ce`:新增公开状态页 `/status` 与 JSON 版本 `/status.json`,并持久化随机请求总量。 - `638a285` + `ee0549b`:增强 pximg 反代能力(含 pixiv.cat / 镜像),改进 docs/status 页面与并发场景稳定性。 - `810b2da`:修复大量导入下的数据库冲突问题。 ## 项目能力总览 ### 1) 公开 API | 接口 | 说明 | | --- | --- | | `GET /random` | 随机取图(默认图片流),支持 `format=json/simple_json` 与复杂过滤条件 | | `GET /images` | 分页查询入库图片,支持标签、尺寸、时间等筛选 | | `GET /images/{image_id}` | 查询单张图片及标签 | | `GET /i/{image_id}.{ext}` | 本地代理/缓存路径(`/random?redirect=1` 跳转到这里) | | `GET /{illust_id}.{ext}` / `GET /{illust_id}-{page}.{ext}` | 兼容旧式直链路径 | | `GET /tags` / `GET /authors` | 标签与作者检索 | | `GET /healthz` | 健康检查(DB、Worker 心跳、队列状态) | | `GET /version` | 版本、构建时间、commit | | `GET /docs` | 人类可读文档页 | | `GET /status` / `GET /status.json` | 公开运行状态(图库统计 + 随机请求统计) | | `GET /wtf` | 瀑布流浏览页(标准/小格子视图) | | `GET /api/docs` / `GET /openapi.json` | Swagger/OpenAPI | `/random` 的常用能力: - 输出模式:`format=image|json|simple_json`,`redirect=1`。 - 策略:`strategy=quality|random`,`quality_samples`,可配置 recommendation 权重与倍率。 - 过滤:`r18`、`r18_strict`、`ai_type`、`illust_type`、`orientation/layout`。 - 阈值:`min_width`、`min_height`、`min_pixels`、`min_bookmarks`、`min_views`、`min_comments`。 - 标签:`included_tags`、`excluded_tags`(支持 `|` 表示组内 OR)。 - 其他:`user_id`、`illust_id`、`created_from`、`created_to`、`seed`、`attempts`、`adaptive=1`。 标签语义说明: - 组间是 AND:`included_tags=a&included_tags=b` - 组内是 OR:`included_tags=a|b` ### 2) 管理后台(`/admin` + `/admin/api/*`) 核心模块: - 登录鉴权:JWT 登录/登出。 - 导入中心:支持文本粘贴、`.txt` 上传、PixivBatchDownloader `.json` 上传、预检查(dry-run)、回滚。 - 图片管理:分页筛选、删除、批量删除、清库。 - 补全管理:创建/手动触发补全任务、暂停/恢复/取消。 - 任务队列:查看任务、重试、取消、转入 DLQ。 - 令牌管理:Pixiv refresh_token 增删改查、测试刷新、失败重置。 - 代理体系:代理节点导入/编辑/清理/探测,代理池维护。 - 绑定关系:Token 与代理池绑定重算、覆盖、清除覆盖。 - 系统设置:随机默认策略、代理路由模式、图片反代行为、安全开关等。 - 审计日志、汇总统计、公共 API Key 管理、请求日志清理。 ### 3) Worker(后台任务执行) 内置任务类型包括: - `import_images` - `hydrate_metadata` - `heal_url` - `proxy_probe` - `easy_proxies_import` 关键特性: - 按 `enabled token` 数自动调整并发(可关闭)。 - 写入 `worker.last_seen_at` 心跳到运行时设置。 - SQLite busy 重试与并发参数调优,降低高并发导入冲突概率。 ## 快速部署(Docker Compose,推荐) 前置:`Docker` + `Docker Compose`。 1. 准备环境变量 ```bash cp deploy/.env.example deploy/.env ``` 2. 编辑 `deploy/.env`(至少修改以下项) - `SECRET_KEY` - `ADMIN_PASSWORD` - `FIELD_ENCRYPTION_KEY`(生产环境必须提供) 3. 启动 ```bash docker compose -f deploy/docker-compose.yml up -d --build ``` 4. 访问 - API:`http://localhost:23222` - 文档页:`http://localhost:23222/docs` - 状态页:`http://localhost:23222/status` - Swagger:`http://localhost:23222/api/docs` - 管理后台:`http://localhost:23222/admin` ## 首次使用建议流程 1. 登录管理后台:使用 `ADMIN_USERNAME` / `ADMIN_PASSWORD`。 2. 导入图片链接(导入页): - 方式 A:粘贴多行原图 URL。 - 方式 B:上传 `.txt`(每行一个 URL)。 - 方式 C:上传 PixivBatchDownloader `.json`(会尽量提取并写入元数据/标签,默认不再额外补全)。 3. (可选但建议)配置 Pixiv refresh_token:用于后续补全/刷新元数据。 4. 观察状态: - `GET /healthz`:看 `worker_ok` 与队列状态。 - 管理后台任务页:看导入与补全进度。 ## 关键配置项(节选) 以 `deploy/.env.example` 为准,常用项如下: | 变量 | 作用 | | --- | --- | | `APP_ENV` | 运行环境(`dev` / `prod`) | | `DATABASE_URL` | 数据库连接(默认 SQLite) | | `SECRET_KEY` | JWT / API Key 哈希密钥 | | `FIELD_ENCRYPTION_KEY` / `FIELD_ENCRYPTION_KEY_FILE` | 敏感字段加密密钥 | | `ADMIN_USERNAME` / `ADMIN_PASSWORD` | 后台账号密码 | | `PIXIV_OAUTH_CLIENT_ID` / `PIXIV_OAUTH_CLIENT_SECRET` / `PIXIV_OAUTH_HASH_SECRET` | Pixiv OAuth 参数 | | `WORKER_AUTO_CONCURRENCY` / `WORKER_MAX_CONCURRENCY` | Worker 并发策略 | | `IMGPROXY_*` | imgproxy 签名 URL 能力 | | `PUBLIC_API_KEY_REQUIRED` / `PUBLIC_API_KEY_RPM` / `PUBLIC_API_KEY_BURST` | 公开接口 API Key 与限流 | 高级运行参数(按需): - `SQLITE_BUSY_TIMEOUT_MS`、`SQLITE_POOL_SIZE`、`SQLITE_MAX_OVERFLOW`、`SQLITE_POOL_TIMEOUT_S` - `IMPORT_MAX_BYTES`、`IMPORT_INLINE_MAX_ACCEPTED` - `RANDOM_TOTALS_PERSIST_INTERVAL_SECONDS` - `WORKER_HEARTBEAT_INTERVAL_SECONDS`、`WORKER_HEARTBEAT_STALE_SECONDS` ## 本地开发 ### 后端(Python 3.11) ```bash cd backend python -m venv .venv .\.venv\Scripts\activate python -m pip install -r ..\requirements-dev.txt alembic upgrade head uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 ``` 另开一个终端运行 Worker: ```bash cd backend .\.venv\Scripts\activate python -m app.worker ``` ### 前端(Node 20) ```bash cd frontend npm ci npm run dev ``` 如需前端直连本地后端,可设置 `VITE_API_BASE_URL=http://localhost:8000`。 ## 测试与检查 - 后端:`python -m pytest -q backend/tests` - 前端:`cd frontend && npm test` - 一键脚本: - `scripts/test_backend.ps1` - `scripts/test_frontend.ps1` - `scripts/test_all.ps1` ## 目录结构(简版) ```text . ├─ backend/ │ ├─ app/ │ │ ├─ api/ # public + admin 路由 │ │ ├─ core/ # 配置、安全、代理路由、指标 │ │ ├─ db/ # 模型与查询 │ │ ├─ jobs/ # 队列、调度、任务处理器 │ │ └─ worker.py │ └─ tests/ ├─ frontend/ # React + Vite 管理后台 ├─ deploy/ # compose 与环境变量示例 └─ scripts/ # 测试与辅助脚本 ``` ## 合规与安全建议 - 切勿将任何真实令牌或密钥提交到仓库。 - 公网部署建议开启 `PUBLIC_API_KEY_REQUIRED` 并配置限流。 - 生产环境务必设置强密码与独立密钥。