Интеграция с Python

Python може да бъде защитен напълно — без пакет и без зависимости. Проверката е едно-единствено HTTPS повикване.

Не публикуваме Python SDK. Това казва нещо за нашата дистрибуция, не за вашата защита: каквото правят SDK-тата, го прави и повикването по-долу със стандартната библиотека.

1. Вграждане на притурката

Скриптът измерва поведението в браузъра и поставя скрито поле във всяка форма. Добавете го веднъж в заглавната част на страниците.

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. Проверка на сървъра

При изпращане прочетете скритото поле и ни попитайте, преди да приемете изпращането. Без тази стъпка решава само браузърът — а бот без JavaScript минава покрай него.

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 и FastAPI

Функцията по-горе не зависи от рамка. Трите места на извикване са в коментар в края на откъса: Flask чете речника на формата, Django данните POST, FastAPI параметър на формата.

Когато сме недостъпни

Откъсът пропуска посетителя. Несправедливо отказан клиент струва повече от пропуснат бот. Ако желаете обратното, върнете невярно в клона за грешка — тогава прекъсване ще ви струва изпращания.

ИИ агенти

Съобщавайте наблюденията на агенти по същия модел към телеметричната точка: едно POST и същата заглавка.

Локалното прилагане на правилата не е възможно от Python — проверява се подпис Ed25519 върху пакет с правила. Поставете enforcer пред приложението като sidecar или използвайте Cloudflare Worker.