diff --git a/README.md b/README.md index 05f96f6..cc2717a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 统一接口服务。线上入口:`https://openapi.rrrosmontis.icu` -聚合层把 **pixiv 图片服务**与 **bilibili 视频服务**收敛到单一对外入口。三个后端进程全部只监听 `127.0.0.1`,对外仅由 nginx 暴露 80/443——即"一个入口、零暴露端口"。 +聚合层把 **pixiv 图片服务**、**bilibili 视频服务**与 **dufe 银杏签到码查询服务**收敛到单一对外入口。四个后端进程全部只监听 `127.0.0.1`,对外仅由 nginx 暴露 80/443——即"一个入口、零暴露端口"。 ## 架构 @@ -10,6 +10,7 @@ 公网 443/80 nginx (server_name openapi.rrrosmontis.icu) ├── /pixiv/get_image?id=xxx -> 127.0.0.1:9008 main.py 聚合层 -> 127.0.0.1:9007 pixiv ├── /bilibili/get_video?bv=xxx -> 127.0.0.1:9008 main.py 聚合层 -> 127.0.0.1:9006 bilibili + ├── /dufe/ginkgostu_sign_in -> 127.0.0.1:9008 main.py 聚合层 -> 127.0.0.1:9005 dufe 签到码查询(GET|POST) ├── /img-master/ /img-original/ -> nginx 直接反代 i.pximg.net(无本地后端) └── / -> 127.0.0.1:9008(302 跳转文章页) ``` @@ -21,6 +22,7 @@ | openapi | `127.0.0.1:9008` | `source/main.py`(aiohttp) | 聚合层,纯转发,**唯一入口** | | pixiv | `127.0.0.1:9007` | `source/pixiv/pixiv.py`(Flask + waitress) | 图片代理 | | bilibili | `127.0.0.1:9006` | `source/bilibili/bilibili.py`(aiohttp + yt-dlp) | 视频代理 | +| dufe 签到 | `127.0.0.1:9005` | `source/dufe/ginkgostu_sign_in/ginkgo_sign_in.py`(Flask + waitress 16 线程) | 银杏(DUFE)签到码查询,`GET\|POST /dufe/ginkgostu_sign_in` | | pixiv-token-refresh | — | `source/pixiv/refresh_token.py` | token 刷新守护(每 30–60 分钟随机) | | bilibili-refresh | — | `source/bilibili/refresh_cookie.py` | cookie 刷新守护(每 50–70 分钟随机) | @@ -31,7 +33,7 @@ ``` source/ -├── main.py # 聚合层 (127.0.0.1:9008),三条路由:/ /pixiv/get_image /bilibili/get_video +├── main.py # 聚合层 (127.0.0.1:9008),四条路由:/ /pixiv/get_image /bilibili/get_video /dufe/ginkgostu_sign_in ├── pixiv/ │ ├── pixiv.py # Pixiv 图片服务 (127.0.0.1:9007) │ ├── refresh_token.py # Pixiv OAuth token 刷新守护 @@ -41,6 +43,9 @@ source/ │ ├── refresh_cookie.py # cookie 定时刷新守护 │ ├── qr_login.py # 扫码登录获取 cookie │ └── qr_login_fast.py +├── dufe/ +│ └── ginkgostu_sign_in/ +│ └── ginkgo_sign_in.py # 银杏(DUFE)签到码查询 (127.0.0.1:9005, GET|POST) └── cache/ # 运行时生成,不入库 ├── pixiv/images # 图片缓存 └── bilibili/ # 视频缓存 @@ -51,7 +56,8 @@ systemd/ ├── pixiv.service # Pixiv 图片服务(waitress --threads=8) ├── bilibili.service # bilibili 视频服务 ├── bilibili-refresh.service # cookie 刷新守护 -└── pixiv-token-refresh.service # Pixiv token 刷新守护 +├── pixiv-token-refresh.service # Pixiv token 刷新守护 +└── ginkgo_sign_in.service # 银杏(DUFE)签到码查询服务 docs/ └── 部署与运维.md # 线上服务器的路径、缓存、迁移步骤与变更记录 ``` @@ -86,12 +92,12 @@ curl -s 127.0.0.1:9006/bilibili/cache_info ## 部署 -1. **Python 环境**:三服务共用一个环境,需含 `flask`、`waitress`、`aiohttp`、`httpx`、`yt-dlp` +1. **Python 环境**:各服务共用一个环境,需含 `flask`、`waitress`、`aiohttp`、`httpx`、`yt-dlp` 2. **凭据**: - 复制 `source/pixiv/tokens.template.json` 为 `source/pixiv/tokens.json`(`chmod 600`)并填入实际 pixiv token - 放置 `source/bilibili/cookies.txt`(`name=value` 格式),或运行 `qr_login.py` 扫码生成 3. **服务**:将 `systemd/*.service` 安装到 `/etc/systemd/system/`,然后 - `systemctl daemon-reload && systemctl enable --now openapi pixiv bilibili bilibili-refresh pixiv-token-refresh` + `systemctl daemon-reload && systemctl enable --now openapi pixiv bilibili ginkgo_sign_in bilibili-refresh pixiv-token-refresh` 4. **nginx**:将 `nginx/openapi.rrrosmontis.icu.conf` 放入 `/etc/nginx/conf.d/`(需存在 `$connection_upgrade` 的 map 定义),`nginx -t && systemctl reload nginx` 5. **软链**(可选):`ln -s <部署根>/source/cache/pixiv/images /home/images` 6. **定时任务**:无 cron/timer——两个刷新守护均为常驻循环(内部随机间隔),systemd `Restart=always` 兜底 @@ -102,18 +108,20 @@ curl -s 127.0.0.1:9006/bilibili/cache_info curl -k "https://openapi.rrrosmontis.icu/pixiv/get_image?id=147113746" curl -k "https://openapi.rrrosmontis.icu/bilibili/get_video?bv=BV16a41157Q4" curl -kI "https://openapi.rrrosmontis.icu/bilibili/get_video?bv=BV16a41157Q4" # 只看头部,省流量 +curl -k "https://openapi.rrrosmontis.icu/dufe/ginkgostu_sign_in" # 无参应返回 400 JSON curl -s 127.0.0.1:9006/bilibili/cache_info ``` -端口暴露自检(三个后端都应"不可达",仅 443/80 通): +端口暴露自检(四个后端都应"不可达",仅 443/80 通): ```bash -for p in 9006 9007 9008; do timeout 3 bash -c "cat < /dev/null > /dev/tcp//$p" 2>/dev/null \ +for p in 9005 9006 9007 9008; do timeout 3 bash -c "cat < /dev/null > /dev/tcp//$p" 2>/dev/null \ && echo "$p 可连通(异常)" || echo "$p 不可达(正常)"; done ``` ## 版本要点 +- **2026-09-13**:新增 **dufe 银杏签到码查询服务**(`source/dufe/ginkgostu_sign_in/ginkgo_sign_in.py`,Flask + waitress 16 线程,`127.0.0.1:9005`,端点 `GET|POST /dufe/ginkgostu_sign_in`),并在聚合层 `main.py` 注册该路由——为此新增 `proxy_forward()`(保留请求方法与请求体,原 `proxy()` 保持固定 GET 不变,零改动既有行为) - **2026-09-12** - 端口重排 `9888/9088/19990 → 9008/9007/9006`,全部仅绑 `127.0.0.1`;pixiv 由 `0.0.0.0:9088` 收口 - 主入口 `main.py` 从 `source/openapi/` 上移到 `source/`,systemd `WorkingDirectory` 同步为 `source/` diff --git a/docs/部署与运维.md b/docs/部署与运维.md index 364dbe8..1e0ab1c 100644 --- a/docs/部署与运维.md +++ b/docs/部署与运维.md @@ -11,6 +11,7 @@ |---|---| | `/pixiv/get_image?id=xxx` | `127.0.0.1:9008`(main.py 聚合层)→ `127.0.0.1:9007`(pixiv) | | `/bilibili/get_video?bv=xxx` | `127.0.0.1:9008`(main.py 聚合层)→ `127.0.0.1:9006`(bilibili) | +| `/dufe/ginkgostu_sign_in` | `127.0.0.1:9008`(main.py 聚合层)→ `127.0.0.1:9005`(dufe 签到码查询,支持 GET\|POST) | | `/img-master/`、`/img-original/` | nginx 直接反代 `i.pximg.net`(无本地后端) | | `/` | `127.0.0.1:9008`(302 跳转文章页) | @@ -20,13 +21,14 @@ ## 进程与端口 -三个服务**全部只绑 `127.0.0.1`**,对外仅 nginx 的 443/80。 +四个服务**全部只绑 `127.0.0.1`**,对外仅 nginx 的 443/80。 | systemd 单元 | 源码 | 监听 | 说明 | |---|---|---|---| | `openapi.service` | `source/main.py` | `:9008` | 聚合层(aiohttp,纯转发,唯一入口) | | `pixiv.service` | `source/pixiv/pixiv.py` | `:9007` | Flask,由 waitress(8 线程)承载 | | `bilibili.service` | `source/bilibili/bilibili.py` | `:9006` | aiohttp + yt-dlp | +| `ginkgo_sign_in.service` | `source/dufe/ginkgostu_sign_in/ginkgo_sign_in.py` | `:9005` | 银杏(DUFE)签到码查询,Flask + waitress(16 线程),`GET\|POST` | | `pixiv-token-refresh.service` | `source/pixiv/refresh_token.py` | — | 常驻刷新 Pixiv OAuth token | | `bilibili-refresh.service` | `source/bilibili/refresh_cookie.py` | — | 常驻刷新 bilibili cookie | @@ -45,10 +47,13 @@ │ │ ├── cookies.txt bilibili cookie(敏感,不入库) │ │ ├── refresh_cookie.py cookie 刷新守护 │ │ └── qr_login*.py 扫码登录工具(cookie 失效时人工重登用) +│ ├── dufe/ +│ │ └── ginkgostu_sign_in/ +│ │ └── ginkgo_sign_in.py 银杏(DUFE)签到码查询服务(127.0.0.1:9005,GET|POST) │ └── cache/ 运行时缓存(不入库) │ ├── pixiv/images pixiv 图片缓存(代码中为 ../cache/pixiv/images) │ └── bilibili/ bilibili 视频缓存(上限 2 GiB / TTL 7 天) -├── systemd/ 5 个单元文件的归档副本(与 /etc/systemd/system/ 保持一致) +├── systemd/ 6 个单元文件的归档副本(与 /etc/systemd/system/ 保持一致) ├── nginx/ 宝塔导出的历史存档,非生效路径 ├── cert/ SSL 证书 ├── env/ Python 环境(general + env_general.tar.gz 整包) @@ -88,7 +93,7 @@ ## 迁移到新服务器 1. **环境**:解压 `env/env_general.tar.gz`,直接使用其 `bin/python`(依赖齐全,含 waitress) -2. **源码**:恢复 `source/{main.py,pixiv/,bilibili/}` 到 `/home/openapi/source/` +2. **源码**:恢复 `source/{main.py,pixiv/,bilibili/,dufe/}` 到 `/home/openapi/source/` 3. **systemd**:恢复 `systemd/*.service` 到 `/etc/systemd/system/`,`daemon-reload` + `enable` + `start` 4. **nginx**:套用 `conf.d/openapi.rrrosmontis.icu.conf`(并确保 `00-websocket.conf` 的 map 存在) 5. **SSL**:恢复 `cert/<域名>/` 到 `/etc/nginx/cert/<域名>/` @@ -98,19 +103,26 @@ ```bash curl -k "https://openapi.rrrosmontis.icu/pixiv/get_image?id=xxx" curl -k "https://openapi.rrrosmontis.icu/bilibili/get_video?bv=BV16a41157Q4" + curl -k "https://openapi.rrrosmontis.icu/dufe/ginkgostu_sign_in" # 无参应返回 400 JSON ``` ## 日志 ``` /var/log/openapi.log /var/log/pixiv.log /var/log/bilibili.log -/var/log/bilibili_refresh.log /var/log/pixiv_token_refresh.log +/var/log/ginkgo_sign_in.log /var/log/bilibili_refresh.log /var/log/pixiv_token_refresh.log ``` 缓存命中/落盘会在 `bilibili.log` 打印 `cache HIT / MISS / STORE`(已加 `flush`,实时可见)。 ## 变更记录 +**2026-09-13** + +- 新增 **dufe 银杏签到码查询服务**:`source/dufe/ginkgostu_sign_in/ginkgo_sign_in.py` + `ginkgo_sign_in.service`(`127.0.0.1:9005`,Flask + waitress 16 线程,端点 `GET|POST /dufe/ginkgostu_sign_in`) +- 在聚合层 `main.py` 注册该端点:新增 `DUFE_BACKEND` 与 `proxy_forward()`(保留请求方法/请求体;原 `proxy()` 固定 GET 行为未改动) +- nginx **无需改动**:`location /` 兜底已把 `/dufe/...` 转发给 `127.0.0.1:9008` + **2026-09-12** - 端口重排 `9888 / 9088 / 19990 → 9008 / 9007 / 9006`(全部仅 `127.0.0.1`)