Tehisintellekti agentide vaatlemine

Tehisintellekti roomajad — GPTBotist ClaudeBoti ja PerplexityBotini — loevad teie saiti iga päev ja enamik saidiomanikke ei näe sellest midagi. Vaatlusrežiim on SilentShieldi tehisintellekti agentide kontrolli 1. tase: see salvestab, millised tehisintellekti teenused milliseid lehti külastavad — ilma midagi blokeerimata ja teie saidi käitumist muutmata.

Nähtavus käib kontrolli ees: alles siis, kui teate, kes teie sisu loeb, saate mõistlikult otsustada, keda lubada, piirata või blokeerida. Iga külastus liigitatakse selleks ühte kolmest kategooriast:

Treening
Roomaja kogub teie sisu, et treenida tulevasi tehisintellekti mudeleid (nt GPTBot, ClaudeBot, CCBot).
Tehisintellekti otsing
Teenus loeb lehti, et vastata kasutajate küsimustele, ja võib seejuures teie saiti allikana tsiteerida (nt OAI-SearchBot, PerplexityBot).
Agendid
Bott tegutseb reaalajas konkreetse kasutaja nimel, näiteks uurib toodet või täidab teie saidil vormi (nt ChatGPT-User, Claude-User).

Seadistamine platvormi kaupa

WordPress

Sisseehitatud observer saabub SilentShieldi plugina eelseisva uuendusega. Seni aktiveeri jälgimine väikese must-use pluginaga — üks fail, ilma seadistuseta:

Loo fail wp-content/mu-plugins/silentshield-observer.php selle sisuga (mu-pluginad laaditakse automaatselt; keelamiseks kustuta fail):

wp-config.phpphp
<?php
/**
 * Plugin Name: SilentShield — AI Agent Observer
 * Description: Reports AI crawler visits to SilentShield (fire-and-forget;
 * IP/UA are hashed server-side, GDPR). Delete this file to disable.
 *
 * Install: save this file as wp-content/mu-plugins/silentshield-observer.php
 * (mu-plugins load automatically — no activation needed). To force it off
 * without deleting: define('SILENTSHIELD_OBSERVER', false) in wp-config.php.
 * An upcoming SilentShield plugin update will build this in.
 */
if (!defined('ABSPATH')) exit;
if (defined('SILENTSHIELD_OBSERVER') && !SILENTSHIELD_OBSERVER) return;

const SS_OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const SS_API_KEY = "YOUR_API_KEY"; // publishable site key
// For the always-fresh list, cache https://api.silentshield.io/api/v1/agent/bot-directory daily.
$ss_bots = ["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User",
  "PerplexityBot","Perplexity-User","Bingbot","Applebot","Amazonbot","CCBot",
  "Bytespider","meta-externalagent","Google-Agent"];

register_shutdown_function(function () use ($ss_bots) {
  $ua = $_SERVER["HTTP_USER_AGENT"] ?? "";
  $signed = !empty($_SERVER["HTTP_SIGNATURE"]);
  $isBot = $signed;
  foreach ($ss_bots as $b) { if (stripos($ua, $b) !== false) { $isBot = true; break; } }
  if (!$isBot) return;

  if (function_exists("fastcgi_finish_request")) { fastcgi_finish_request(); }

  wp_remote_post(SS_OBSERVE_URL, [
    "timeout"  => 3,
    "blocking" => false,
    "headers"  => ["Content-Type" => "application/json", "x-api-key" => SS_API_KEY],
    "body"     => wp_json_encode(["sightings" => [[
      "ua"     => $ua,
      "ip"     => $_SERVER["REMOTE_ADDR"] ?? "",
      "path"   => strtok($_SERVER["REQUEST_URI"] ?? "/", "?"),
      "method" => $_SERVER["REQUEST_METHOD"] ?? "GET",
    ]]]),
  ]);
});

Next.js

Iseseisev middleware — ilma SDK-ta. Jälgimine töötab event.waitUntil() kaudu, väljaspool vastuse teed, ega aeglusta seega kunagi sinu lehti:

middleware.tstypescript
// middleware.ts — self-contained observer, no SDK required.
// Sightings are reported via event.waitUntil(), off the response path,
// so your pages never wait. Best-effort and fail-open by design.

import { NextResponse, type NextRequest } from "next/server";

const OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const API_KEY = "YOUR_API_KEY"; // publishable site key

// Known AI-agent UA tokens. For the always-fresh list, fetch
// https://api.silentshield.io/api/v1/agent/bot-directory once a day and cache it.
const BOTS = ["GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot", "Claude-User",
  "PerplexityBot", "Perplexity-User", "Bingbot", "Applebot", "Amazonbot", "CCBot",
  "Bytespider", "meta-externalagent", "Google-Agent"];

export function middleware(req: NextRequest, event: { waitUntil(p: Promise<unknown>): void }) {
  const ua = req.headers.get("user-agent") ?? "";
  const signed = !!req.headers.get("signature");
  if (signed || BOTS.some((b) => ua.toLowerCase().includes(b.toLowerCase()))) {
    const sighting = {
      ua,
      path: req.nextUrl.pathname,
      method: req.method,
      ip: req.headers.get("x-forwarded-for")?.split(",")[0]?.trim(),
      ...(signed && {
        signature: req.headers.get("signature"),
        signature_input: req.headers.get("signature-input"),
        signature_agent: req.headers.get("signature-agent"),
        authority: req.nextUrl.host,
        scheme: req.nextUrl.protocol.replace(":", ""),
      }),
    };
    event.waitUntil(
      fetch(OBSERVE_URL, {
        method: "POST",
        headers: { "Content-Type": "application/json", "x-api-key": API_KEY },
        body: JSON.stringify({ sightings: [sighting] }),
      }).catch(() => {}) // best-effort, fail-open
    );
  }
  return NextResponse.next();
}

Node.js (Express)

Expressi (või mis tahes muu Node'i serveri) jaoks lisage fire-and-forget-middleware. See raporteerib ainult päringud, mille User-Agent vastab teadaolevale tehisintellekti agendile või mis kannavad Web Bot Auth signatuuri — ja vastust ei blokeeri see kunagi:

server.jsjavascript
import express from "express";
const app = express();

const OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const API_KEY = "YOUR_API_KEY";

// Known AI-agent UA tokens. For the always-fresh list, fetch
// https://api.silentshield.io/api/v1/agent/bot-directory once a day and cache it.
const BOTS = ["GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot", "Claude-User",
  "PerplexityBot", "Perplexity-User", "Bingbot", "Applebot", "Amazonbot", "CCBot",
  "Bytespider", "meta-externalagent", "Google-Agent"];

// Fire-and-forget observer — never blocks the response.
app.use((req, res, next) => {
  const ua = req.headers["user-agent"] || "";
  const signed = !!req.headers["signature"];
  if (signed || BOTS.some((b) => ua.toLowerCase().includes(b.toLowerCase()))) {
    const sighting = {
      ua, ip: req.ip, path: req.path, method: req.method,
      ...(signed && {
        signature: req.headers["signature"],
        signature_input: req.headers["signature-input"],
        signature_agent: req.headers["signature-agent"],
        authority: req.headers["host"], scheme: req.protocol,
      }),
    };
    fetch(OBSERVE_URL, {
      method: "POST",
      headers: { "Content-Type": "application/json", "x-api-key": API_KEY },
      body: JSON.stringify({ sightings: [sighting] }),
    }).catch(() => {}); // best-effort, fail-open
  }
  next();
});

PHP

Puhta PHP puhul kaasake see vaatleja oma front controlleri kõige algusesse. See saadab külastuse alles pärast vastuse ärasaatmist (fastcgi_finish_request), nii et leht ei muutu kunagi aeglasemaks:

observer.phpphp
<?php
// Drop-in observer: include at the very top of your front controller.
// It runs after the response is sent (fastcgi_finish_request) so it never
// slows down the page. Reuses the same publishable key.

const SS_OBSERVE_URL = "https://api.silentshield.io/api/v1/agent/telemetry";
const SS_API_KEY = "YOUR_API_KEY";
// For the always-fresh list, cache https://api.silentshield.io/api/v1/agent/bot-directory daily.
$ss_bots = ["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-User",
  "PerplexityBot","Perplexity-User","Bingbot","Applebot","Amazonbot","CCBot",
  "Bytespider","meta-externalagent","Google-Agent"];

register_shutdown_function(function () use ($ss_bots) {
  $ua = $_SERVER["HTTP_USER_AGENT"] ?? "";
  $signed = !empty($_SERVER["HTTP_SIGNATURE"]);
  $isBot = $signed;
  foreach ($ss_bots as $b) { if (stripos($ua, $b) !== false) { $isBot = true; break; } }
  if (!$isBot) return;

  if (function_exists("fastcgi_finish_request")) { fastcgi_finish_request(); }

  $sighting = [
    "ua" => $ua,
    "ip" => $_SERVER["REMOTE_ADDR"] ?? "",
    "path" => strtok($_SERVER["REQUEST_URI"] ?? "/", "?"),
    "method" => $_SERVER["REQUEST_METHOD"] ?? "GET",
  ];
  $ch = curl_init(SS_OBSERVE_URL);
  curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 3,
    CURLOPT_HTTPHEADER => ["Content-Type: application/json", "x-api-key: " . SS_API_KEY],
    CURLOPT_POSTFIELDS => json_encode(["sightings" => [$sighting]]),
  ]);
  curl_exec($ch); // best-effort, fail-open
  curl_close($ch);
});

Go

Iseseisev observer mõne reaga — ainult standardteek, ilma SDK-ta. Tuvastused saadetakse fire-and-forget-stiilis, nii et ükski päring ei muutu aeglasemaks:

main.gogo
// Self-contained observer — stdlib only, no SDK required.
// Reports AI-agent sightings fire-and-forget: never blocks a request,
// fail-open on any error. For the always-fresh bot list, cache
// https://api.silentshield.io/api/v1/agent/bot-directory daily.

const observeURL = "https://api.silentshield.io/api/v1/agent/telemetry"
const siteKey = "YOUR_API_KEY" // publishable — or os.Getenv("SILENTSHIELD_SITE_KEY")

var bots = []string{"GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot",
    "Claude-User", "PerplexityBot", "Perplexity-User", "Bingbot", "Applebot",
    "Amazonbot", "CCBot", "Bytespider", "meta-externalagent", "Google-Agent"}

func observe(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        ua, signed := r.UserAgent(), r.Header.Get("Signature") != ""
        hit := signed
        for _, b := range bots {
            if strings.Contains(strings.ToLower(ua), strings.ToLower(b)) {
                hit = true
                break
            }
        }
        if hit {
            ip, _, _ := net.SplitHostPort(r.RemoteAddr)
            s := map[string]any{"ua": ua, "ip": ip, "path": r.URL.Path, "method": r.Method}
            if signed { // Web Bot Auth (RFC 9421) — forward for verification
                s["signature"] = r.Header.Get("Signature")
                s["signature_input"] = r.Header.Get("Signature-Input")
                s["signature_agent"] = r.Header.Get("Signature-Agent")
                s["authority"] = r.Host
            }
            body, _ := json.Marshal(map[string]any{"sightings": []any{s}})
            go func() { // best-effort, fail-open
                req, _ := http.NewRequest("POST", observeURL, bytes.NewReader(body))
                req.Header.Set("Content-Type", "application/json")
                req.Header.Set("x-api-key", siteKey)
                if resp, err := (&http.Client{Timeout: 3 * time.Second}).Do(req); err == nil {
                    resp.Body.Close()
                }
            }()
        }
        next.ServeHTTP(w, r)
    })
}

// net/http:  http.ListenAndServe(":8080", observe(mux))
// Gin:       srv := &http.Server{Addr: ":8080", Handler: observe(r)}
//            srv.ListenAndServe()

Ühenduse testimine

Te ei pea integratsiooni toimimise kontrollimiseks ootama esimest päris tehisintellekti roomajat. Saatke tühi partii — see registreerib teie võtme jaoks heartbeat'i, ilma ühtegi valekülastust kirjutamata:

Terminalbash
curl -X POST https://api.silentshield.io/api/v1/agent/telemetry \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  --data '{"sightings":[]}'

Teie API-võtme agendikeskus (API-võtmed → valige võti → Agent) läheb seejärel olekust „ühendamata“ olekusse „ühendatud — kuulab“. Teie aruanne jääb tühjaks, kuni päris agent külastab: SilentShield ei mõtle andmeid välja.

GDPR

Vaatlus tugineb õigustatud huvile (GDPR art 6 lg 1 p f). IP-aadressid räsitakse serveripoolselt iga päev vahetuva soolaga — toores-IP-sid ei salvestata kunagi. Külastusi säilitatakse 14 päeva ja üldse salvestatakse ainult teadaolevate tehisintellekti agentide päringud: tavaliste külastajate liiklust ei salvestata kunagi.

KKK

Kas see muudab mu saidi aeglasemaks?

Ei. Iga integratsioon on fire-and-forget: Next.js kasutab event.waitUntil(), PHP raporteerib alles pärast vastuse ärasaatmist, Node ja Go saadavad taustal. Ja kui SilentShieldi API peaks kunagi olema kättesaamatu, ei mõjuta see teie saiti — kõik töötab fail-open-põhimõttel.

Mis loeb tehisintellekti agendiks?

Ainult päringud, mis vastavad SilentShieldi teadaolevate tehisintellekti roomajate ja agentide botikataloogile (GPTBot, ClaudeBot, PerplexityBot, …) või kannavad Web Bot Auth signatuuri. Alati ajakohase loendi leiate aadressilt https://api.silentshield.io/api/v1/agent/bot-directory.

Miks ma veel andmeid ei näe?

Tehisintellekti roomajad tulevad oma ajakava järgi. Enamikul saitidel ilmuvad esimesed külastused 24–72 tunni jooksul; väiksematel saitidel võib see kauem aega võtta. Seni kinnitab heartbeat teie agendikeskuses, et integratsioon ise töötab.

Edasi: agendireeglite jõustamine (2. tase) →