Παρακολούθηση πρακτόρων AI

Οι AI crawlers — από το GPTBot και το ClaudeBot έως το PerplexityBot — διαβάζουν τον ιστότοπό σας καθημερινά, και οι περισσότεροι ιδιοκτήτες ιστότοπων δεν το βλέπουν ποτέ. Η λειτουργία παρατήρησης είναι το στάδιο 1 του Ελέγχου πρακτόρων AI του SilentShield: καταγράφει ποιες υπηρεσίες AI επισκέπτονται ποιες σελίδες, χωρίς να μπλοκάρει τίποτα και χωρίς να αλλάζει τη συμπεριφορά του ιστότοπού σας.

Η ορατότητα προηγείται του ελέγχου: μόνο όταν γνωρίζετε ποιος διαβάζει το περιεχόμενό σας μπορείτε να αποφασίσετε ουσιαστικά ποιον θα επιτρέψετε, θα περιορίσετε ή θα μπλοκάρετε. Κάθε καταγραφή κατατάσσεται γι' αυτό σε μία από τρεις κατηγορίες:

Εκπαίδευση
Ο crawler συλλέγει το περιεχόμενό σας για να εκπαιδεύσει μελλοντικά μοντέλα AI (π.χ. GPTBot, ClaudeBot, CCBot).
Αναζήτηση AI
Η υπηρεσία διαβάζει σελίδες για να απαντήσει σε ερωτήσεις χρηστών και μπορεί να αναφέρει τον ιστότοπό σας ως πηγή (π.χ. OAI-SearchBot, PerplexityBot).
Πράκτορες
Ένα bot ενεργεί σε πραγματικό χρόνο για λογαριασμό ενός συγκεκριμένου χρήστη, για παράδειγμα ερευνά ένα προϊόν ή συμπληρώνει μια φόρμα στον ιστότοπό σας (π.χ. ChatGPT-User, Claude-User).

Ρύθμιση ανά πλατφόρμα

WordPress

Ο ενσωματωμένος observer έρχεται με μια επερχόμενη ενημέρωση του πρόσθετου SilentShield. Μέχρι τότε, ενεργοποιήστε την παρακολούθηση με ένα μικρό must-use πρόσθετο — ένα αρχείο, χωρίς ρυθμίσεις:

Δημιουργήστε το αρχείο wp-content/mu-plugins/silentshield-observer.php με αυτό το περιεχόμενο (τα mu-plugins φορτώνονται αυτόματα· διαγράψτε το αρχείο για απενεργοποίηση):

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

Ένα αυτόνομο middleware — χωρίς SDK. Η παρακολούθηση εκτελείται μέσω event.waitUntil(), εκτός της διαδρομής απόκρισης, οπότε δεν καθυστερεί ποτέ τις σελίδες σας:

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)

Για το Express (ή οποιονδήποτε άλλο διακομιστή Node) προσθέστε ένα fire-and-forget middleware. Αναφέρει μόνο αιτήματα των οποίων ο User-Agent αντιστοιχεί σε γνωστό πράκτορα AI ή που φέρουν υπογραφή Web Bot Auth — και δεν μπλοκάρει ποτέ την απόκριση:

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

Για απλή PHP, συμπεριλάβετε αυτόν τον παρατηρητή στην κορυφή του front controller σας. Στέλνει την καταγραφή μόνο αφού έχει παραδοθεί η απόκριση (fastcgi_finish_request), οπότε η σελίδα δεν επιβραδύνεται ποτέ:

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

Ένας αυτόνομος observer σε λίγες γραμμές — μόνο η τυπική βιβλιοθήκη, χωρίς SDK. Οι εντοπισμοί αποστέλλονται fire-and-forget, ώστε κανένα αίτημα να μην αποκτά καθυστέρηση:

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()

Δοκιμή σύνδεσης

Δεν χρειάζεται να περιμένετε τον πρώτο πραγματικό AI crawler για να επιβεβαιώσετε ότι η ενσωμάτωσή σας λειτουργεί. Στείλτε ένα κενό batch — καταχωρίζει ένα heartbeat για το κλειδί σας χωρίς να γράφει ψεύτικες καταγραφές:

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":[]}'

Το κέντρο πρακτόρων του κλειδιού API σας (Κλειδιά API → επιλέξτε ένα κλειδί → Πράκτορας) αλλάζει τότε από «δεν έχει συνδεθεί» σε «συνδεδεμένο — σε ακρόαση». Η αναφορά σας παραμένει κενή μέχρι να έρθει ένας πραγματικός πράκτορας: το SilentShield δεν επινοεί ποτέ δεδομένα.

GDPR

Η παρατήρηση βασίζεται στο έννομο συμφέρον (Άρθρο 6 παρ. 1 στοιχ. στ΄ GDPR). Οι διευθύνσεις IP κατακερματίζονται από την πλευρά του διακομιστή με ένα salt που εναλλάσσεται καθημερινά — οι ακατέργαστες IP δεν αποθηκεύονται ποτέ. Οι καταγραφές διατηρούνται για 14 ημέρες, και αποθηκεύονται αποκλειστικά αιτήματα από γνωστούς πράκτορες AI: η κανονική επισκεψιμότητα των επισκεπτών σας δεν καταγράφεται ποτέ.

FAQ

Επιβραδύνει τον ιστότοπό μου;

Όχι. Κάθε ενσωμάτωση είναι fire-and-forget: το Next.js χρησιμοποιεί το event.waitUntil(), η PHP αναφέρει μόνο μετά την αποστολή της απόκρισης, το Node και το Go στέλνουν στο παρασκήνιο. Και αν το API του SilentShield δεν είναι κάποια στιγμή προσβάσιμο, ο ιστότοπός σας δεν επηρεάζεται — όλα λειτουργούν fail-open.

Τι μετράει ως πράκτορας AI;

Μόνο αιτήματα που αντιστοιχούν στον κατάλογο bots του SilentShield με γνωστούς AI crawlers και πράκτορες (GPTBot, ClaudeBot, PerplexityBot, …) ή που φέρουν υπογραφή Web Bot Auth. Η πάντα ενημερωμένη λίστα είναι διαθέσιμη στο https://api.silentshield.io/api/v1/agent/bot-directory.

Γιατί δεν βλέπω ακόμη δεδομένα;

Οι AI crawlers έρχονται με το δικό τους πρόγραμμα. Στους περισσότερους ιστότοπους οι πρώτες καταγραφές εμφανίζονται εντός 24–72 ωρών· σε μικρότερους ιστότοπους μπορεί να χρειαστεί περισσότερος χρόνος. Στο μεταξύ, το heartbeat στο κέντρο πρακτόρων σας επιβεβαιώνει ότι η ίδια η ενσωμάτωση λειτουργεί.

Επόμενο: επιβολή κανόνων πρακτόρων (στάδιο 2) →