Ενσωμάτωση με Python
Η Python μπορεί να προστατευτεί πλήρως — χωρίς πακέτο και χωρίς εξαρτήσεις. Ο έλεγχος είναι μία μόνο κλήση HTTPS.
Δεν εκδίδουμε SDK για Python. Αυτό αφορά τη διανομή μας, όχι την προστασία σας: ό,τι κάνουν τα SDK, το κάνει η παρακάτω κλήση με την τυπική βιβλιοθήκη.
1. Ενσωμάτωση του widget
Το script μετρά τη συμπεριφορά στο πρόγραμμα περιήγησης και τοποθετεί ένα κρυφό πεδίο σε κάθε φόρμα. Προσθέστε το μία φορά στην κεφαλίδα των σελίδων.
<!-- 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. Έλεγχος στον διακομιστή
Κατά την υποβολή διαβάστε το κρυφό πεδίο και ρωτήστε μας προτού δεχτείτε την υποβολή. Χωρίς αυτό το βήμα αποφασίζει μόνο το πρόγραμμα περιήγησης — και ένα bot χωρίς JavaScript το προσπερνά.
# 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 και FastAPI
Η παραπάνω συνάρτηση είναι ανεξάρτητη από framework. Τα τρία σημεία κλήσης βρίσκονται ως σχόλια στο τέλος του αποσπάσματος: το Flask διαβάζει το λεξικό της φόρμας, το Django τα δεδομένα POST, το FastAPI μια παράμετρο φόρμας.
Όταν δεν είμαστε προσβάσιμοι
Το απόσπασμα αφήνει τον επισκέπτη να περάσει. Ένας πελάτης που απορρίπτεται άδικα κοστίζει περισσότερο από ένα bot που περνά. Αν θέλετε το αντίθετο, επιστρέψτε ψευδές στον κλάδο σφάλματος — τότε μια διακοπή σας κοστίζει υποβολές.
Πράκτορες ΤΝ
Αναφέρετε τις παρατηρήσεις πρακτόρων με το ίδιο μοτίβο στο σημείο τηλεμετρίας: ένα POST και η ίδια κεφαλίδα.
Η τοπική επιβολή των κανόνων δεν είναι δυνατή από Python — επαληθεύεται υπογραφή Ed25519 σε δέσμη κανόνων. Τοποθετήστε τον enforcer μπροστά από την εφαρμογή ως sidecar ή χρησιμοποιήστε το Cloudflare Worker.