11# Random Mage (new-pixiv-api)
22
3- 一个自托管的随机图片 API:把 Pixiv 原图链接导入到本地数据库后,即可通过 ` /random ` 按 ** 标签 / 热度 / 分辨率 / R18 / AI / 作品类型** 等条件组合筛选并随机出图;同时提供管理后台(Web UI)+ 后台 Worker,用于导入、补全元数据、代理探测等任务。
4-
5- 官方 Demo(公开站点):
3+ 自托管的 Pixiv 随机图片服务:将原图链接导入本地数据库后,通过 ` GET /random ` 按标签、热度、分辨率、R18、AI、作品类型等条件组合筛选并随机出图。项目同时提供管理后台(Web UI)与后台 Worker(导入/补全/代理探测等任务)。
64
5+ 官方演示站:
76- ` https://i.mukyu.ru/random `
87- ` https://i.mukyu.ru/docs `
98- ` https://i.mukyu.ru/api/docs `
109
11- > 免责声明:本项目为非官方实现;请遵守 Pixiv ToS/版权与当地法律法规,自行承担使用风险。不要将任何 refresh_token / 密钥 / 代理密码提交到仓库。
12-
13- ## 功能概览
14-
15- - 公共 API
16- - ` GET /random ` :默认直接返回图片流;也可 ` format=json|simple_json ` 返回 JSON;支持大量筛选参数
17- - ` GET /images ` / ` GET /images/{id} ` :按条件分页查看已入库图片
18- - ` GET /i/{image_id}.{ext} ` :本地代理/缓存路径(` /random?redirect=1 ` 会跳转到这里)
19- - ` GET /tags ` 、` GET /authors ` 、` GET /healthz ` 、` GET /version ` 、` GET /docs ` (人类可读文档页)
20- - Swagger / OpenAPI:` GET /api/docs ` 、` GET /openapi.json `
21- - 管理后台(` /admin ` )
22- - 登录后可管理:Pixiv refresh_token、代理池、导入、任务队列、运行时开关、审计/统计等
23- - Worker(后台任务)
24- - 导入图片 URL、补全元数据(tags/宽高/浏览收藏等)、修复失效 URL、代理探测等
25- - 可选能力
26- - 公网访问保护:启用 Public API Key + 限流
27- - ` imgproxy ` :对外提供签名处理 URL(可隐藏 origin URL)
28- - 代理路由:为上游图片/接口选择代理
29-
30- ## 快速体验(使用官方 Demo)
31-
32- ``` bash
33- curl -L " https://i.mukyu.ru/random?redirect=1"
34- curl " https://i.mukyu.ru/random?format=simple_json"
35- ```
36-
37- ## 一键部署(Docker Compose,推荐)
38-
39- 前置:安装 Docker + Docker Compose。
40-
41- 1 ) 准备环境变量
10+ > 免责声明:本项目为非官方实现。请遵守 Pixiv ToS、版权与当地法律法规;不要将 ` refresh_token ` 、密钥、代理密码提交到仓库。
11+
12+ ## 近期功能更新(基于最近提交)
13+
14+ - ` ec9d373 ` :增强 ` /wtf ` 顶部筛选布局,支持标签排除筛选、` proxy ` 参数自定义反代、选中反馈与单击放大。
15+ - ` ef66583 ` :支持导入 PixivBatchDownloader 导出的 ` .json ` ,并默认关闭该格式的导入后补全。
16+ - ` 9e437d8 ` + ` 80cd41f ` + ` 5159d82 ` + ` 53e0890 ` :持续优化瀑布流页,新增标准/小格子两种展示模式。
17+ - ` 6a843ce ` :新增公开状态页 ` /status ` 与 JSON 版本 ` /status.json ` ,并持久化随机请求总量。
18+ - ` 638a285 ` + ` ee0549b ` :增强 pximg 反代能力(含 pixiv.cat / 镜像),改进 docs/status 页面与并发场景稳定性。
19+ - ` 810b2da ` :修复大量导入下的数据库冲突问题。
20+
21+ ## 项目能力总览
22+
23+ ### 1) 公开 API
24+
25+ | 接口 | 说明 |
26+ | --- | --- |
27+ | ` GET /random ` | 随机取图(默认图片流),支持 ` format=json/simple_json ` 与复杂过滤条件 |
28+ | ` GET /images ` | 分页查询入库图片,支持标签、尺寸、时间等筛选 |
29+ | ` GET /images/{image_id} ` | 查询单张图片及标签 |
30+ | ` GET /i/{image_id}.{ext} ` | 本地代理/缓存路径(` /random?redirect=1 ` 跳转到这里) |
31+ | ` GET /{illust_id}.{ext} ` / ` GET /{illust_id}-{page}.{ext} ` | 兼容旧式直链路径 |
32+ | ` GET /tags ` / ` GET /authors ` | 标签与作者检索 |
33+ | ` GET /healthz ` | 健康检查(DB、Worker 心跳、队列状态) |
34+ | ` GET /version ` | 版本、构建时间、commit |
35+ | ` GET /docs ` | 人类可读文档页 |
36+ | ` GET /status ` / ` GET /status.json ` | 公开运行状态(图库统计 + 随机请求统计) |
37+ | ` GET /wtf ` | 瀑布流浏览页(标准/小格子视图) |
38+ | ` GET /api/docs ` / ` GET /openapi.json ` | Swagger/OpenAPI |
39+
40+ ` /random ` 的常用能力:
41+ - 输出模式:` format=image|json|simple_json ` ,` redirect=1 ` 。
42+ - 策略:` strategy=quality|random ` ,` quality_samples ` ,可配置 recommendation 权重与倍率。
43+ - 过滤:` r18 ` 、` r18_strict ` 、` ai_type ` 、` illust_type ` 、` orientation/layout ` 。
44+ - 阈值:` min_width ` 、` min_height ` 、` min_pixels ` 、` min_bookmarks ` 、` min_views ` 、` min_comments ` 。
45+ - 标签:` included_tags ` 、` excluded_tags ` (支持 ` | ` 表示组内 OR)。
46+ - 其他:` user_id ` 、` illust_id ` 、` created_from ` 、` created_to ` 、` seed ` 、` attempts ` 、` adaptive=1 ` 。
47+
48+ 标签语义说明:
49+ - 组间是 AND:` included_tags=a&included_tags=b `
50+ - 组内是 OR:` included_tags=a|b `
51+
52+ ### 2) 管理后台(` /admin ` + ` /admin/api/* ` )
53+
54+ 核心模块:
55+ - 登录鉴权:JWT 登录/登出。
56+ - 导入中心:支持文本粘贴、` .txt ` 上传、PixivBatchDownloader ` .json ` 上传、预检查(dry-run)、回滚。
57+ - 图片管理:分页筛选、删除、批量删除、清库。
58+ - 补全管理:创建/手动触发补全任务、暂停/恢复/取消。
59+ - 任务队列:查看任务、重试、取消、转入 DLQ。
60+ - 令牌管理:Pixiv refresh_token 增删改查、测试刷新、失败重置。
61+ - 代理体系:代理节点导入/编辑/清理/探测,代理池维护。
62+ - 绑定关系:Token 与代理池绑定重算、覆盖、清除覆盖。
63+ - 系统设置:随机默认策略、代理路由模式、图片反代行为、安全开关等。
64+ - 审计日志、汇总统计、公共 API Key 管理、请求日志清理。
65+
66+ ### 3) Worker(后台任务执行)
67+
68+ 内置任务类型包括:
69+ - ` import_images `
70+ - ` hydrate_metadata `
71+ - ` heal_url `
72+ - ` proxy_probe `
73+ - ` easy_proxies_import `
74+
75+ 关键特性:
76+ - 按 ` enabled token ` 数自动调整并发(可关闭)。
77+ - 写入 ` worker.last_seen_at ` 心跳到运行时设置。
78+ - SQLite busy 重试与并发参数调优,降低高并发导入冲突概率。
79+
80+ ## 快速部署(Docker Compose,推荐)
81+
82+ 前置:` Docker ` + ` Docker Compose ` 。
83+
84+ 1 . 准备环境变量
4285
4386``` bash
4487cp deploy/.env.example deploy/.env
4588```
4689
47- 然后编辑 ` deploy/.env ` ,至少建议修改:
48-
49- - ` SECRET_KEY ` :JWT/API Key 哈希用(生产环境必须修改)
50- - ` ADMIN_PASSWORD ` :后台密码(生产环境必须修改)
51- - ` FIELD_ENCRYPTION_KEY ` :用于加密保存 refresh_token(生产环境必须提供;建议用 secret 挂载或文件方式)
90+ 2 . 编辑 ` deploy/.env ` (至少修改以下项)
91+ - ` SECRET_KEY `
92+ - ` ADMIN_PASSWORD `
93+ - ` FIELD_ENCRYPTION_KEY ` (生产环境必须提供)
5294
53- 2 ) 启动
95+ 3 . 启动
5496
5597``` bash
5698docker compose -f deploy/docker-compose.yml up -d --build
5799```
58100
59- 3 ) 访问
60-
61- - API 基址:` http://localhost:23222 `
62- - 健康检查:` GET http://localhost:23222/healthz `
63- - 文档页:` GET http://localhost:23222/docs `
64- - 后台 UI:` http://localhost:23222/admin `
101+ 4 . 访问
102+ - API:` http://localhost:23222 `
103+ - 文档页:` http://localhost:23222/docs `
104+ - 状态页:` http://localhost:23222/status `
65105- Swagger:` http://localhost:23222/api/docs `
66-
67- ## 首次使用(导入数据 + 补全元数据)
68-
69- 这个项目不会“自动替你抓全站图片”,你需要先把图片记录导入数据库。
70-
71- 1 ) 登录后台
72-
73- - 打开 ` http://localhost:23222/admin `
74- - 使用 ` deploy/.env ` 中的 ` ADMIN_USERNAME ` / ` ADMIN_PASSWORD ` 登录
75-
76- 2 ) 导入图片原图 URL
77-
78- 后台提供“导入”入口,支持:
79-
80- - 直接粘贴多行文本(每行一个 URL)
81- - 上传 ` .txt ` 文件(同样每行一个 URL)
82-
83- 导入内容应为 Pixiv 原图链接(例如 ` i.pximg.net/.../img-original/... ` 这类)。导入时会自动去重(按 illust_id + page)。
84-
85- 3 ) 配置 Pixiv refresh_token(可选,但强烈建议)
86-
87- 若你希望 Worker 自动补全/刷新元数据(tags、宽高、浏览/收藏/评论、R18 标记、AI 类型等),需要:
88-
89- - 在后台添加一个或多个 refresh_token
90- - 配置 ` PIXIV_OAUTH_CLIENT_ID ` / ` PIXIV_OAUTH_CLIENT_SECRET ` (以及可选的 ` PIXIV_OAUTH_HASH_SECRET ` )
91-
92- > 安全提示:refresh_token 属于敏感凭据;请只放在运行环境里(` deploy/.env ` / secret 管理),不要写进代码/仓库。
93-
94- 4 ) 确认 Worker 正常
95-
96- ` /healthz ` 会同时检查 DB、队列、以及 Worker 心跳;如果 ` worker_ok=false ` ,通常意味着 Worker 没启动或无法连接数据库卷。
97-
98- ## 配置说明(节选)
99-
100- 所有配置均通过环境变量注入(见 ` deploy/.env.example ` ):
101-
102- - ` APP_ENV ` :` dev ` / ` prod ` (` prod ` 会启用更严格的必填校验)
103- - ` DATABASE_URL ` :默认 SQLite(容器内 ` /app/data/app.db ` ,通过 ` ../data:/app/data ` 挂载)
104- - ` PUBLIC_API_KEY_REQUIRED ` / ` PUBLIC_API_KEY_RPM ` / ` PUBLIC_API_KEY_BURST ` :公网访问保护(可选)
105- - ` WORKER_* ` 、` IMPORT_* ` 、` SQLITE_BUSY_TIMEOUT_MS ` :Worker/导入/SQLite 运行参数
106- - ` IMGPROXY_* ` :imgproxy 集成(可选)
107-
108- ## 本地开发(可选)
109-
110- 后端(Python 3.11):
106+ - 管理后台:` http://localhost:23222/admin `
107+
108+ ## 首次使用建议流程
109+
110+ 1 . 登录管理后台:使用 ` ADMIN_USERNAME ` / ` ADMIN_PASSWORD ` 。
111+ 2 . 导入图片链接(导入页):
112+ - 方式 A:粘贴多行原图 URL。
113+ - 方式 B:上传 ` .txt ` (每行一个 URL)。
114+ - 方式 C:上传 PixivBatchDownloader ` .json ` (会尽量提取并写入元数据/标签,默认不再额外补全)。
115+ 3 . (可选但建议)配置 Pixiv refresh_token:用于后续补全/刷新元数据。
116+ 4 . 观察状态:
117+ - ` GET /healthz ` :看 ` worker_ok ` 与队列状态。
118+ - 管理后台任务页:看导入与补全进度。
119+
120+ ## 关键配置项(节选)
121+
122+ 以 ` deploy/.env.example ` 为准,常用项如下:
123+
124+ | 变量 | 作用 |
125+ | --- | --- |
126+ | ` APP_ENV ` | 运行环境(` dev ` / ` prod ` ) |
127+ | ` DATABASE_URL ` | 数据库连接(默认 SQLite) |
128+ | ` SECRET_KEY ` | JWT / API Key 哈希密钥 |
129+ | ` FIELD_ENCRYPTION_KEY ` / ` FIELD_ENCRYPTION_KEY_FILE ` | 敏感字段加密密钥 |
130+ | ` ADMIN_USERNAME ` / ` ADMIN_PASSWORD ` | 后台账号密码 |
131+ | ` PIXIV_OAUTH_CLIENT_ID ` / ` PIXIV_OAUTH_CLIENT_SECRET ` / ` PIXIV_OAUTH_HASH_SECRET ` | Pixiv OAuth 参数 |
132+ | ` WORKER_AUTO_CONCURRENCY ` / ` WORKER_MAX_CONCURRENCY ` | Worker 并发策略 |
133+ | ` IMGPROXY_* ` | imgproxy 签名 URL 能力 |
134+ | ` PUBLIC_API_KEY_REQUIRED ` / ` PUBLIC_API_KEY_RPM ` / ` PUBLIC_API_KEY_BURST ` | 公开接口 API Key 与限流 |
135+
136+ 高级运行参数(按需):
137+ - ` SQLITE_BUSY_TIMEOUT_MS ` 、` SQLITE_POOL_SIZE ` 、` SQLITE_MAX_OVERFLOW ` 、` SQLITE_POOL_TIMEOUT_S `
138+ - ` IMPORT_MAX_BYTES ` 、` IMPORT_INLINE_MAX_ACCEPTED `
139+ - ` RANDOM_TOTALS_PERSIST_INTERVAL_SECONDS `
140+ - ` WORKER_HEARTBEAT_INTERVAL_SECONDS ` 、` WORKER_HEARTBEAT_STALE_SECONDS `
141+
142+ ## 本地开发
143+
144+ ### 后端(Python 3.11)
111145
112146``` bash
113147cd backend
@@ -118,17 +152,53 @@ alembic upgrade head
118152uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
119153```
120154
121- 前端管理台(Node 20):
155+ 另开一个终端运行 Worker:
156+
157+ ``` bash
158+ cd backend
159+ .\. venv\S cripts\a ctivate
160+ python -m app.worker
161+ ```
162+
163+ ### 前端(Node 20)
122164
123165``` bash
124166cd frontend
125167npm ci
126168npm run dev
127169```
128170
129- 如需让前端直连本地后端,设置 ` VITE_API_BASE_URL ` (例如 ` http://localhost:8000 ` ) 。
171+ 如需前端直连本地后端,可设置 ` VITE_API_BASE_URL= http://localhost:8000 ` 。
130172
131- ## 运行测试
173+ ## 测试与检查
132174
133175- 后端:` python -m pytest -q backend/tests `
134176- 前端:` cd frontend && npm test `
177+ - 一键脚本:
178+ - ` scripts/test_backend.ps1 `
179+ - ` scripts/test_frontend.ps1 `
180+ - ` scripts/test_all.ps1 `
181+
182+ ## 目录结构(简版)
183+
184+ ``` text
185+ .
186+ ├─ backend/
187+ │ ├─ app/
188+ │ │ ├─ api/ # public + admin 路由
189+ │ │ ├─ core/ # 配置、安全、代理路由、指标
190+ │ │ ├─ db/ # 模型与查询
191+ │ │ ├─ jobs/ # 队列、调度、任务处理器
192+ │ │ └─ worker.py
193+ │ └─ tests/
194+ ├─ frontend/ # React + Vite 管理后台
195+ ├─ deploy/ # compose 与环境变量示例
196+ └─ scripts/ # 测试与辅助脚本
197+ ```
198+
199+ ## 合规与安全建议
200+
201+ - 切勿将任何真实令牌或密钥提交到仓库。
202+ - 公网部署建议开启 ` PUBLIC_API_KEY_REQUIRED ` 并配置限流。
203+ - 生产环境务必设置强密码与独立密钥。
204+
0 commit comments