Fallback mint/TOS HTTP from broken curl_cffi TLS to std requests.

Windows hosts hitting OPENSSL_internal:invalid library (curl 35) now retry SSO OAuth and post-reg TOS/NSFW via standard requests so CPA export can proceed.
This commit is contained in:
chaos committed 2026-07-14 09:56:11 +08:00
1 parent fc879c09ea
commit 2e833f2af3
2 files changed
+214 -54

No files matched your search

+92 -20
View File
@@ -2012,6 +2012,9 @@ def set_birth_date(session, log_callback=None):
)
return False, f"set_birth_date HTTP {res.status_code}: {response_preview(res)}"
except Exception as e:
# TLS 库损坏类错误上抛,供 enable_nsfw_for_token 切到 std requests
if _is_curl_tls_error(e):
raise
if log_callback:
log_callback(f"[set_birth_date] 异常: {e}")
return False, f"set_birth_date 异常: {e}"
@@ -2042,6 +2045,8 @@ def set_tos_accepted(session, log_callback=None):
)
return False, f"set_tos_accepted HTTP {res.status_code}: {response_preview(res)}"
except Exception as e:
if _is_curl_tls_error(e):
raise
if log_callback:
log_callback(f"[set_tos_accepted] 异常: {e}")
return False, f"set_tos_accepted 异常: {e}"
@@ -2082,35 +2087,102 @@ def update_nsfw_settings(session, log_callback=None):
)
return False, f"update_nsfw_settings HTTP {res.status_code}: {response_preview(res)}"
except Exception as e:
if _is_curl_tls_error(e):
raise
if log_callback:
log_callback(f"[update_nsfw] 异常: {e}")
return False, f"update_nsfw_settings 异常: {e}"
def _is_curl_tls_error(exc) -> bool:
text = str(exc or "").lower()
return any(
n in text
for n in (
"openssl_internal:invalid library",
"tls connect error",
"curl: (35)",
"failed to perform, curl: (35)",
"ssl_error_syscall",
"ssl connect error",
)
)
def _make_post_reg_session(proxies=None, *, prefer: str = "curl"):
"""注册后 set_tos / nsfw 用的 session;curl TLS 坏了时回退 std requests。"""
prefer = (prefer or "curl").strip().lower()
if prefer != "requests":
try:
return requests.Session(impersonate="chrome120", proxies=proxies)
except TypeError:
# 极老 curl_cffi 无 impersonate
try:
return requests.Session(proxies=proxies)
except Exception:
pass
except Exception:
pass
try:
import requests as std_requests
except ImportError as exc: # pragma: no cover
raise RuntimeError("需要 curl_cffi 或 requests") from exc
sess = std_requests.Session()
if proxies:
sess.proxies.update(proxies)
return sess
def enable_nsfw_for_token(token, cf_clearance="", log_callback=None):
proxies = get_proxies()
user_agent = get_user_agent()
log = log_callback or (lambda *_: None)
def _run(session):
cookie_parts = [f"sso={token}", f"sso-rw={token}"]
if cf_clearance:
cookie_parts.append(f"cf_clearance={cf_clearance}")
session.headers.update(
{
"user-agent": user_agent,
"cookie": "; ".join(cookie_parts),
}
)
ok, message = set_tos_accepted(session, log_callback)
if not ok:
return False, message
ok, message = set_birth_date(session, log_callback)
if not ok:
return False, message
ok, message = update_nsfw_settings(session, log_callback)
if not ok:
return False, message
return True, "成功开启 NSFW"
def _close(session):
try:
session.close()
except Exception:
pass
try:
with requests.Session(impersonate="chrome120", proxies=proxies) as session:
cookie_parts = [f"sso={token}", f"sso-rw={token}"]
if cf_clearance:
cookie_parts.append(f"cf_clearance={cf_clearance}")
session.headers.update(
{
"user-agent": user_agent,
"cookie": "; ".join(cookie_parts),
}
)
ok, message = set_tos_accepted(session, log_callback)
if not ok:
return False, message
ok, message = set_birth_date(session, log_callback)
if not ok:
return False, message
ok, message = update_nsfw_settings(session, log_callback)
if not ok:
return False, message
return True, "成功开启 NSFW"
session = _make_post_reg_session(proxies, prefer="curl")
try:
return _run(session)
except Exception as exc:
if not _is_curl_tls_error(exc):
return False, f"异常: {exc}"
log(f"[Debug] curl TLS 异常,set_tos/nsfw 回退 requests: {exc}")
_close(session)
session = _make_post_reg_session(proxies, prefer="requests")
try:
return _run(session)
finally:
_close(session)
session = None
finally:
if session is not None:
_close(session)
except Exception as e:
return False, f"异常: {str(e)}"