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:
+25
-10
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user