Integrare cu Python

Python poate fi protejat complet — fără pachet și fără dependențe. Verificarea este un singur apel HTTPS.

Nu publicăm un SDK pentru Python. Aceasta spune ceva despre distribuția noastră, nu despre protecția dumneavoastră: ceea ce fac SDK-urile, apelul de mai jos face cu biblioteca standard.

1. Inserarea widgetului

Scriptul măsoară comportamentul în browser și plasează un câmp ascuns în fiecare formular. Adăugați-l o singură dată în antetul paginilor.

HTMLhtml
<!-- Add to <head> with SRI for security -->
(function () {
  var KEY = "YOUR_API_KEY";
  var SITE = location.hostname;
  var V = "2025.09.1";
  var s = document.createElement('script');
  s.src = "https://api.silentshield.io/client.js?k=" + encodeURIComponent(KEY)
    + "&v=" + encodeURIComponent(V)
    + "&site=" + encodeURIComponent(SITE);
  s.async = true;
  s.crossOrigin = "anonymous";
  document.head.appendChild(s);
})();

2. Verificarea pe server

La trimitere citiți câmpul ascuns și întrebați-ne înainte de a accepta trimiterea. Fără acest pas decide doar browserul — iar un bot fără JavaScript trece pe lângă el.

Pythonpython
# No package required — the check is one HTTPS POST.
# Standard library only: nothing to install, nothing to keep updated.
import json
import os
import urllib.error
import urllib.request

VERIFY_URL = "https://api.silentshield.io/api/v1/captcha/verify-nonce"
API_KEY = os.environ["SILENTSHIELD_KEY"]  # never hard-code it


def is_human(nonce: str) -> bool:
    """Ask SilentShield about one submission.

    The hidden field `behavior_nonce` is injected by client.js;
    read it from the posted form and hand it over unchanged.
    """
    if not nonce:
        return False

    request = urllib.request.Request(
        VERIFY_URL,
        data=json.dumps({"nonce": nonce}).encode(),
        headers={
            "Content-Type": "application/json",
            "X-Api-Key": API_KEY,
            # Tells us which integration is in use, exactly like the SDKs do.
            "X-SS-SDK": "python-inline/1",
        },
        method="POST",
    )

    try:
        with urllib.request.urlopen(request, timeout=5) as response:
            data = json.loads(response.read())
    except (urllib.error.URLError, TimeoutError, ValueError):
        # We are unreachable. Let the visitor through: a real customer turned
        # away costs more than a bot let in. Flip this to False only if you
        # would rather lose submissions than accept one unchecked.
        return True

    return (
        data.get("ok") is True
        and data.get("verdict") == "human"
        and data.get("confidence", 0) >= 0.7
    )


# --- Flask ---------------------------------------------------------------
# @app.post("/contact")
# def contact():
#     if not is_human(request.form.get("behavior_nonce", "")):
#         abort(400, "Please submit the form again.")
#     ...

# --- Django --------------------------------------------------------------
# def contact(request):
#     if not is_human(request.POST.get("behavior_nonce", "")):
#         return HttpResponseBadRequest("Please submit the form again.")
#     ...

# --- FastAPI -------------------------------------------------------------
# @app.post("/contact")
# async def contact(behavior_nonce: str = Form("")):
#     if not is_human(behavior_nonce):
#         raise HTTPException(status_code=400, detail="Please submit the form again.")
#     ...

Flask, Django și FastAPI

Funcția de mai sus este independentă de framework. Cele trei puncte de apel sunt comentate la finalul fragmentului: Flask citește dicționarul formularului, Django datele POST, FastAPI un parametru de formular.

Când nu suntem accesibili

Fragmentul lasă vizitatorul să treacă. Un client respins pe nedrept costă mai mult decât un bot acceptat. Dacă doriți invers, returnați fals pe ramura de eroare — atunci o pană vă costă trimiteri.

Agenți AI

Raportați observațiile de agenți după același model către punctul de telemetrie: un POST și același antet.

Aplicarea locală a regulilor nu este posibilă din Python — se verifică o semnătură Ed25519 pe un pachet de reguli. Puneți enforcerul în fața aplicației ca sidecar sau folosiți Cloudflare Worker.