chore: 仓库与线上一致性补齐

- pixiv.py: 补录线上 2026-09-17 版(图源错误码处理/fetch_illust_url 返回 api_status)
- nginx/00-limits.conf: 限流 zone 定义入库(站点 conf 引用, 缺失将导致 nginx -t 失败)
- nginx/00-websocket.conf: connection_upgrade map 入库(同上)
- docs: 迁移第 4 步改为套用 nginx/ 三件套; 记录一致性核对结果
This commit is contained in:
RRRosmontis
2026-10-21 18:56:58 +08:00
parent 67aa9be3da
commit 4dee7a3c0c
5 changed files with 48 additions and 12 deletions
+25 -10
View File
@@ -31,9 +31,11 @@ def get_access_token():
def fetch_illust_url(pid, page):
"""返回 (original_url, api_status)。api_status: 200 成功 / 404 作品不存在 /
401|403 认证失败 / 429 限流 / 0 网络等临时错误 / -1 数据异常。"""
access_token = get_access_token()
if not access_token:
return None
return None, 403
try:
resp = requests.get(
f"https://{API_HOST}/v1/illust/detail",
@@ -47,16 +49,17 @@ def fetch_illust_url(pid, page):
verify=False
)
if resp.status_code != 200:
return None
return None, resp.status_code
data = resp.json()
if data.get("error"):
return None
return None, -1
illust = data.get("illust")
if not illust:
return None
return None, -1
page_count = illust.get("page_count", 1)
if page >= page_count:
return None
# 页码超出:作品存在但请求的分页不存在,按 404 语义处理
return None, 404
original_url = None
if page_count > 1:
meta_pages = illust.get("meta_pages")
@@ -69,10 +72,12 @@ def fetch_illust_url(pid, page):
if not original_url:
original_url = illust.get("image_urls", {}).get("large")
if not original_url:
return None
return original_url.replace("i.pximg.net", IMAGE_PROXY_DOMAIN)
return None, -1
return original_url.replace("i.pximg.net", IMAGE_PROXY_DOMAIN), 200
except requests.RequestException:
return None, 0 # 网络等临时错误:可继续尝试备用源
except Exception:
return None
return None, -1
def make_re_url(pid, page):
@@ -146,9 +151,19 @@ def serve_image(path):
return send_file(cached_file, mimetype=mime, max_age=3600)
urls_to_try = []
official_url = fetch_illust_url(pid, page)
official_url, api_status = fetch_illust_url(pid, page)
if official_url:
urls_to_try.append(official_url)
# 明确的作品级错误直接返回,不再做无意义的备用源重试:
# 404 = 作品不存在/已删除/分页不存在(官方 API 已裁决)
# 401/403 = token 失效(refresh 由独立服务负责,这里明确报错)
# 429 = pixiv API 限流(备用源同样是 pixiv 数据,重试无意义)
if api_status == 404:
return jsonify(error="作品不存在或已删除", code="not_found"), 404
if api_status in (401, 403):
return jsonify(error="pixiv 认证失败,token 可能失效", code="auth_error"), 502
if api_status == 429:
return jsonify(error="pixiv API 限流,请稍后再试", code="rate_limited"), 503
urls_to_try.append(make_re_url(pid, page))
urls_to_try.append(make_cat_url(pid, page))
@@ -157,7 +172,7 @@ def serve_image(path):
if img_path:
return send_file(img_path, mimetype=mime, max_age=3600)
return jsonify(error="Failed to fetch image from all sources"), 500
return jsonify(error="所有图源均取图失败,请稍后再试", code="all_sources_failed"), 500
@app.route('/health')