Python-Integration
SilentShield lässt sich aus Python vollständig absichern — ohne Paket und ohne Abhängigkeit. Die Prüfung ist ein einziger HTTPS-Aufruf.
Es gibt kein Python-SDK von uns. Das ist eine Aussage über unsere Auslieferung, nicht über Ihren Schutz: Was die SDKs tun, erledigt der Aufruf unten mit der Standardbibliothek.
1. Widget einbinden
Das Skript misst das Verhalten im Browser und legt ein verstecktes Feld in jedes Formular. Fügen Sie es einmal in den Kopfbereich Ihrer Seiten ein.
<!-- 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. Serverseitig prüfen
Lesen Sie beim Absenden das versteckte Feld aus und fragen Sie uns, bevor Sie die Übermittlung annehmen. Ohne diesen Schritt entscheidet allein der Browser — und ein Bot ohne JavaScript kommt daran vorbei.
# 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 und FastAPI
Die Funktion oben ist unabhängig vom Rahmenwerk. Am Ende des Schnipsels stehen die drei Aufrufstellen als Kommentar: Flask liest aus dem Formular-Wörterbuch, Django aus den POST-Daten, FastAPI aus einem Formularparameter.
Wenn wir nicht erreichbar sind
Der Schnipsel lässt den Besucher dann durch. Ein zu Unrecht abgewiesener Kunde kostet mehr als ein durchgelassener Bot. Wollen Sie es umgekehrt, geben Sie im Fehlerzweig „falsch“ zurück — dann verlieren Sie bei einer Störung Übermittlungen.
KI-Agenten
Sichtungen von KI-Agenten melden Sie nach demselben Muster an den Telemetrie-Endpunkt: ein POST mit derselben Kopfzeile.
Die Regeln lokal durchzusetzen geht aus Python heraus nicht — dafür wird eine Ed25519-Signatur über ein Regelpaket geprüft. Setzen Sie den Enforcer als Sidecar vor Ihre Anwendung oder nutzen Sie den Cloudflare Worker.