Cloudflare AI Crawl Analytics
Echtzeit-Analyse des AI-Bot-Traffics via Cloudflare GraphQL API (httpRequestsAdaptiveGroups). Zeigt welche AI-Bots die Seite crawlen, wie viel Traffic sie verursachen und welche Seiten am meisten abgerufen werden.
Admin-Seite: /admin/ai-agent-analytics
Architektur
graph TD
A["Cloudflare GraphQL API"] -->|"httpRequestsAdaptiveGroups"| B["CloudflareAiCrawlService"]
B -->|"Cache 1h"| C["Redis/DB Cache"]
B --> D["Livewire Component<br>AiAgentAnalytics/Index"]
D --> E["/admin/ai-agent-analytics"]
E --> F["KPI-Karten + ApexCharts"]
E --> G["Tabellen: Pfade, Status, Referral"]
E --> H["Bot-Konfiguration + Live-Traffic"]
I["Cloudflare Radar API"] -->|"Öffentlich, kein Auth"| B
Konfiguration
Umgebungsvariablen
# Cloudflare API Token (gleicher wie für R2)
CLOUDFLARE_API_TOKEN=your_api_token
# Cloudflare Zone-ID für zone-level GraphQL Queries
# Zu finden in: Cloudflare Dashboard > Zone Overview (rechte Seite)
CLOUDFLARE_ZONE_ID=your_zone_id_here
Token-Permissions
Der API-Token benötigt:
Zone > Analytics > Read(fürhttpRequestsAdaptiveGroups)- Ggf. bereits vorhanden wenn R2-Zugriff konfiguriert ist
Service: CloudflareAiCrawlService
Datei: app/Services/Cloudflare/CloudflareAiCrawlService.php
Methoden
| Methode | Beschreibung | Cache-Key |
|---|---|---|
isConfigured() | Prüft ob Token + Zone-ID gesetzt sind | – |
getAiBotTraffic(days) | Q1: Zeitreihe Requests pro Bot | cf-ai:bot-traffic:{days} |
getTopCrawledPaths(days, limit) | Q2: Top gecrawlte Pfade | cf-ai:top-paths:{days}:{limit} |
getDataTransferByBot(days) | Q3: Bytes pro Bot | Nutzt Q1-Cache |
getAiReferralTraffic(days) | Q4: Referral von ChatGPT/Perplexity | cf-ai:referral:{days} |
getResponseStatusByBot(days) | Q5: Status-Codes (2xx/3xx/4xx/5xx) | cf-ai:status:{days} |
discoverUnknownBots(days) | E1: Unbekannte Bots finden | cf-ai:discovery:{days} |
checkRobotsTxtCompliance(config, days) | E4: robots.txt Compliance | Nutzt Q1-Cache |
estimateContentValue(days) | E5: Content-Wert-Schätzung | Nutzt Q1-Cache |
getCrawlerEfficiency(days) | E9: Effizienz-Metriken | Nutzt Q3-Daten |
detectAnomalies(days) | E2: Anomalie-Erkennung | Nicht gecacht (vergleicht Perioden) |
getRadarAiBotStats() | E12: Globale Radar-Statistiken | cf-ai:radar:ai-bots |
flushCache() | Cache leeren | – |
Caching
- TTL: 1 Stunde (wie R2)
- Driver: Standard-Cache-Driver (Redis/Database)
- Prefix:
cf-ai: - On-demand: Daten werden nur bei Seitenaufruf geladen, kein Scheduled Command
Konfigurierte Bots
12 AI-Bots sind mit User-Agent-Patterns konfiguriert:
| Bot | Betreiber | Kategorie |
|---|---|---|
| GPTBot | OpenAI | AI Training |
| ChatGPT-User | OpenAI | AI Assistant |
| OAI-SearchBot | OpenAI | AI Search |
| ClaudeBot | Anthropic | AI Training |
| Claude-SearchBot | Anthropic | AI Search |
| Claude-User | Anthropic | AI Assistant |
| PerplexityBot | Perplexity | AI Search |
| DuckAssistBot | DuckDuckGo | AI Search |
| CCBot | Common Crawl | AI Training |
| Google-Extended | AI Training | |
| Meta-ExternalAgent | Meta | AI Training |
| Bytespider | ByteDance | AI Training |
UI-Komponenten
Tab-basiertes Lazy-Loading (seit 2026-03-08)
Die Seite lädt Cloudflare API-Daten nicht beim Seitenaufruf, sondern erst per Tab-Klick. So wird die Seite sofort sichtbar und API-Calls werden nur bei Bedarf gefeuert.
Basis-Ansicht (immer sichtbar):
- SEO-Dateien Status (robots.txt, llms.txt, llms-full.txt, sitemap.xml)
- AI-Bot Konfigurationstabelle (keine API-Calls)
Tabs (lazy-loaded per Klick):
| Tab | Inhalt | API-Calls |
|---|---|---|
| Traffic-Übersicht | KPI-Karten, Area-Chart, Content-Wert, Anomalien, Violations | Q1 + E2 + E4 + E5 |
| Detail-Analyse | Datentransfer (Donut), Top Pfade, Response-Status, Effizienz | Q2 + Q3 + Q5 + E9 |
| Discovery | Unbekannte Bots, Referral Traffic, Radar Stats | E1 + Q4 + E12 |
| IndexNow | Config-Status, KPI-Stats, Submission-Log | Keine Cloudflare-Calls |
Zeitraum-Toggle
- 24h | 7 Tage (Cloudflare
httpRequestsAdaptiveGroupsunterstützt max ~8 Tage)
Erweiterungen
| # | Feature | Status |
|---|---|---|
| E1 | Auto Bot Discovery | Implementiert |
| E2 | Anomalie-Erkennung (>200% Spike / >80% Drop) | Implementiert |
| E4 | robots.txt Compliance Check | Implementiert |
| E5 | Content-Wert-Schätzung (Pay-Per-Crawl) | Implementiert |
| E9 | Crawler-Effizienz-Metriken | Implementiert |
| E12 | Cloudflare Radar Integration | Implementiert |
| E7 | Webhook/Alert bei Bot-Blockierung | Tech Debt |
| E8 | Vergleich mit Matomo Bot-Daten | Tech Debt |
| E10 | Realtime-Widget (Polling) | Tech Debt |
| E11 | Bot Management Config (REST API) | Tech Debt |
API-Limits
- GraphQL API: Bis zu 320 Requests pro 5-Minuten-Fenster
- Unser Verbrauch: ~24 API-Calls/Tag max (Cache-TTL 1h, Seite wird selten aufgerufen)
- Gleicher API-Token wie für R2 — keine zusätzlichen Credentials
Tests
- Unit-Tests:
tests/Unit/Services/Cloudflare/CloudflareAiCrawlServiceTest.php(16 Tests) - Feature-Tests:
tests/Feature/Admin/AiAgentAnalyticsTest.php(12 Tests)