fill остаётся мгновенным. typing подводит курсор по кривой, кликает в поле, стирает старое значение и набирает текст посимвольно с паузами; символы вне раскладки (кириллица) больше не роняют ввод. Значение typing маскируется в логах. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""Запросы и ответы для лога без секретов клиента: креды прокси, ключ 2captcha, вводимые значения,
|
|
значения cookies, html и скриншот."""
|
|
import json
|
|
from urllib.parse import urlsplit
|
|
|
|
from api.schemas import SolveRequest
|
|
|
|
|
|
def mask_proxy(proxy_url: str | None) -> str | None:
|
|
if not proxy_url:
|
|
return proxy_url
|
|
parts = urlsplit(proxy_url)
|
|
return f"{parts.scheme}://{'***@' if parts.username else ''}{parts.hostname}:{parts.port}"
|
|
|
|
|
|
def safe_request_dump(payload: SolveRequest) -> str:
|
|
data = payload.model_dump(exclude_none=True)
|
|
data["proxy"] = mask_proxy(payload.proxy)
|
|
if payload.captcha:
|
|
data["captcha"] = "***"
|
|
if payload.cookies:
|
|
data["cookies"] = [c.get("name") for c in payload.cookies]
|
|
for act in data["actions"]:
|
|
if act["type"] in ("fill", "typing") and "value" in act:
|
|
act["value"] = "***"
|
|
return json.dumps(data, indent=2, ensure_ascii=False)
|
|
|
|
|
|
def safe_response_dump(result: dict) -> str:
|
|
data = dict(result)
|
|
if data.get("cookies"):
|
|
data["cookies"] = [c.get("name") for c in data["cookies"]]
|
|
for key in ("html", "screenshot"):
|
|
if data.get(key):
|
|
data[key] = f"<{len(data[key])} chars>"
|
|
return json.dumps(data, indent=2, ensure_ascii=False)
|