first commit
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
"""Civitai site API. Bearer only on civitai.com / .red / .green."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
import httpx
|
||||
|
||||
ALLOWED_HOSTS = ("civitai.com", "civitai.red", "civitai.green")
|
||||
|
||||
|
||||
@dataclass
|
||||
class CivitaiProbe:
|
||||
host: str
|
||||
ok: bool
|
||||
status: int | None
|
||||
detail: str
|
||||
|
||||
|
||||
def _normalize_host(host: str) -> str:
|
||||
h = host.strip().lower().removeprefix("https://").removeprefix("http://").split("/")[0]
|
||||
if h.startswith("www."):
|
||||
h = h[4:]
|
||||
return h
|
||||
|
||||
|
||||
def other_host(host: str) -> str:
|
||||
h = _normalize_host(host)
|
||||
if h.endswith(".red") or h == "civitai.red":
|
||||
return "civitai.com"
|
||||
return "civitai.red"
|
||||
|
||||
|
||||
def probe_me(token: str, host: str, timeout: float = 15.0) -> CivitaiProbe:
|
||||
host = _normalize_host(host)
|
||||
if host not in ALLOWED_HOSTS:
|
||||
return CivitaiProbe(host=host, ok=False, status=None, detail="хост не из allow-list")
|
||||
url = f"https://{host}/api/v1/me"
|
||||
try:
|
||||
with httpx.Client(timeout=timeout, follow_redirects=True) as client:
|
||||
response = client.get(url, headers={"Authorization": f"Bearer {token}"})
|
||||
except httpx.HTTPError as exc:
|
||||
return CivitaiProbe(host=host, ok=False, status=None, detail=str(exc))
|
||||
if response.status_code == 200:
|
||||
return CivitaiProbe(host=host, ok=True, status=200, detail="токен принят")
|
||||
if response.status_code in {401, 403}:
|
||||
return CivitaiProbe(
|
||||
host=host,
|
||||
ok=False,
|
||||
status=response.status_code,
|
||||
detail="токен отвергнут — перевыпусти ключ на civitai.com/user/account",
|
||||
)
|
||||
return CivitaiProbe(
|
||||
host=host,
|
||||
ok=False,
|
||||
status=response.status_code,
|
||||
detail=response.text[:200] or response.reason_phrase,
|
||||
)
|
||||
Reference in New Issue
Block a user