Python-integratie
Python kan volledig worden beschermd — zonder pakket en zonder afhankelijkheid. De controle is één HTTPS-aanroep.
Wij leveren geen Python-SDK. Dat gaat over onze distributie, niet over uw bescherming: wat de SDK's doen, doet de aanroep hieronder met de standaardbibliotheek.
1. Widget invoegen
Het script meet gedrag in de browser en plaatst een verborgen veld in elk formulier. Voeg het één keer toe aan de kop van uw pagina's.
<!-- 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. Controleren op uw server
Lees bij verzending het verborgen veld en vraag het ons voordat u de inzending aanneemt. Zonder deze stap beslist alleen de browser — en een bot zonder JavaScript loopt er langs.
# 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 en FastAPI
De functie hierboven is framework-onafhankelijk. De drie aanroepplekken staan als commentaar aan het eind van het fragment: Flask leest het formulierwoordenboek, Django de POST-gegevens, FastAPI een formulierparameter.
Als wij onbereikbaar zijn
Het fragment laat de bezoeker dan door. Een ten onrechte geweigerde klant kost meer dan een doorgelaten bot. Wilt u het omgekeerde, geef dan onwaar terug in de fouttak — bij een storing verliest u inzendingen.
AI-agenten
Meld waarnemingen van agenten volgens hetzelfde patroon aan het telemetrie-eindpunt: één POST, dezelfde header.
De regels lokaal afdwingen kan niet vanuit Python: daarvoor wordt een Ed25519-handtekening over een regelpakket gecontroleerd. Zet de enforcer als sidecar voor uw toepassing of gebruik de Cloudflare Worker.