Åbner i en ny fane
GEO 5 min læsetid

De fleste “GPTBot”-besøg er falske: Sådan sporer du ægte AI-crawlere

Serverlog med falske og ægte GPTBot-forespørgsler: 80 % var falske

Første gang jeg søgte i mine serverlogs efter AI-crawlere, så billedet alarmerende ud: hundredvis af forespørgsler fra GPTBot, ClaudeBot og PerplexityBot, og de fleste endte i fejl. Det lignede, at AI-firmaerne hamrede løs på mit site og intet fik.

Så tjekkede jeg IP-adresserne. De fleste af de “AI-crawlere” var slet ikke AI-crawlere. Det var sårbarhedsscannere i et AI-firmas navn, der ledte efter adgangskoder og API-nøgler.

Her er, hvad jeg fandt i en uges logs, hvorfor det betyder noget for både sikkerhed og GEO, og det korte script, jeg brugte, så du kan køre samme tjek på dit eget site.

Den korte version:

  • 80 % af de forespørgsler, der kaldte sig GPTBot, var falske. For Perplexity-User var det 100 %.
  • De falske crawlede ikke indhold. De ledte efter filer som .env, cloud-adgangsnøgler og Kubernetes-tokens.
  • De rigtige crawlere opførte sig pænt: Næsten alle deres forespørgsler lykkedes.
  • Den rigtige ChatGPT-User hentede mine sider 56 gange på en uge, men kun 2 besøg kom fra ChatGPT. Analytics viser dig kun de 2.

Tre slags AI-bots

Før man tæller noget, hjælper det at vide, at hvert AI-firma kører flere bots til forskellige opgaver. Det har forskellige konsekvenser at blokere eller tillade dem (se OpenAIs dokumentation for detaljerne om OpenAIs).

OpgaveOpenAIAnthropicPerplexityHvad det betyder for dig
TræningGPTBotClaudeBot–Dit indhold kan ende i fremtidige modeller
SøgeindeksOAI-SearchBotClaude-SearchBotPerplexityBotOm du overhovedet kan dukke op i AI-søgesvar
Live-hentning for en brugerChatGPT-UserClaude-UserPerplexity-UserNogen har stillet et spørgsmål, og AI’en læser din side lige nu

Hvad jeg målte

Jeg tog nginx-adgangslogs for phillipstemann.com fra 8. til 15. oktober 2026 (69.015 forespørgsler) og sammenlignede hver forespørgsel, der påstod at være en AI-crawler, med den IP-liste, firmaet selv offentliggør. En forespørgsel tæller kun som ægte, hvis både navn og IP passer.

User agentPåståetÆgteFalskAndel falske
GPTBot1372711080 %
OAI-SearchBot5514539818 %
ChatGPT-User1575610164 %
ClaudeBot28517610938 %
PerplexityBot1605110968 %
Perplexity-User1050105100 %

Det er ikke kun AI-navne. Med samme tjek mod Googles officielle liste var 56 % af de forespørgsler, der kaldte sig Googlebot, også falske.

Hvad de falske lavede

De falske forespørgsler læste ikke blogindlæg. De gik efter filer, der aldrig burde være offentlige: /.env, /.env.local, /.npmrc, /.bashrc, /serverless.yml, /firebase-credentials.json, /proc/self/environ og stier til Kubernetes-tokens. På mit site giver de alle 404, hvilket er præcis det, du vil have.

Hvorfor udgive sig for at være GPTBot? Fordi mange siteejere nu lukker AI-crawlere igennem deres firewall eller botbeskyttelse for at kunne dukke op i AI-svar. Hvis den regel kun tjekker user agent, slipper en angriber igennem ved at skrive et navn.

Lektien for sikkerhed: Tillad aldrig en bot ud fra dens user agent alene. Bruger du Cloudflare, så brug deres verificerede bot-kategorier i stedet for user-agent-regler. Skriver du dine egne regler, så tjek IP’en.

Hvad de ægte crawlere lavede

De verificerede crawlere opførte sig pænt. Ægte ChatGPT-User, PerplexityBot og ClaudeBot fik næsten alle deres forespørgsler igennem, og de hentede de sider, man håber på: forsiden, min liste over HARO-alternativer, min SEO-ydelse, min Search Console-guide og min podcastliste. Uden de falske forsvandt problemet med “AI-crawlere, der rammer fejl” helt.

GEO-tallet, analytics ikke kan vise dig

Det her er den del, jeg synes er mest brugbar. ChatGPT-User henter kun en side, når et rigtigt menneske spørger ChatGPT om noget, og ChatGPT beslutter at læse siden for at svare. I samme uge:

  • Verificeret ChatGPT-User hentede 14 af mine sider, 56 gange.
  • Kun 2 besøg kom fra ChatGPT (ét med chatgpt.com som henvisning, ét tagget utm_source=chatgpt.com).

Det er cirka 28 svar bygget på mine sider for hvert besøg, jeg fik. Ser du kun på analytics, ser du de 2 besøg og konkluderer, at ChatGPT ikke betyder noget. Loggene viser, at ChatGPT læser dit indhold langt oftere, end den sender nogen videre. Til GEO er live AI-hentninger per side et bedre mål for synlighed end klik.

Sådan kører du samme tjek på dit site

1. Find dine adgangslogs

Hos de fleste hosts ligger de i kontrolpanelet eller din hjemmemappe. På CloudPanel ligger de i ~/logs/nginx/, på cPanel under Raw Access. Står du bag Cloudflare, så tjek to ting: at dine logs gemmer den besøgendes rigtige IP (Cloudflare sender den i headeren CF-Connecting-IP), og at de sider, du interesserer dig for, ikke caches hos Cloudflare, for cachede svar når aldrig din server.

2. Hent de officielle IP-lister

Hvert firma offentliggør de IP-intervaller, dets bots bruger, som en lille JSON-fil:

  • OpenAI: openai.com/gptbot.json, openai.com/searchbot.json, openai.com/chatgpt-user.json
  • Anthropic: claude.com/crawling/bots.json
  • Perplexity: perplexity.com/perplexitybot.json, perplexity.com/perplexity-user.json
  • Google: developers.google.com/static/search/apis/ipranges/googlebot.json

3. Kør scriptet

Det her er præcis det script, der lavede tabellen ovenfor. Det kræver kun Python 3. Det forventer klientens IP som det sidste felt i anførselstegn på hver loglinje, som er sådan CloudPanel logger det bag Cloudflare; har du et andet format, så ret den ene linje. Kør det med python3 verify_ai_bots.py access.log.

import ipaddress, json, re, sys, urllib.request
from collections import Counter

# Official IP lists published by each company
LISTS = {
    "GPTBot":          "https://openai.com/gptbot.json",
    "OAI-SearchBot":   "https://openai.com/searchbot.json",
    "ChatGPT-User":    "https://openai.com/chatgpt-user.json",
    "ClaudeBot":       "https://claude.com/crawling/bots.json",
    "PerplexityBot":   "https://www.perplexity.com/perplexitybot.json",
    "Perplexity-User": "https://www.perplexity.com/perplexity-user.json",
}

def load(url):
    data = json.load(urllib.request.urlopen(urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})))
    return [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix")) for p in data["prefixes"]]

ranges = {bot: load(url) for bot, url in LISTS.items()}
real, fake = Counter(), Counter()

for line in open(sys.argv[1], errors="replace"):
    for bot in ranges:
        if bot in line:
            ip = re.findall(r'"([0-9a-fA-F.:]+)"\s*$', line)  # client IP as the last quoted field
            ip = ip[0] if ip else line.split()[0]
            ok = any(ipaddress.ip_address(ip) in net for net in ranges[bot])
            (real if ok else fake)[bot] += 1
            break

for bot in ranges:
    total = real[bot] + fake[bot]
    if total:
        print(f"{bot:16} {total:5} claimed  {real[bot]:5} real  {fake[bot]:5} fake ({fake[bot] / total:.0%})")

4. Kig på tre ting

  • Andelen af falske. Er den høj, så sørg for, at ingen firewallregel stoler på AI-user-agents.
  • Hvilke sider de ægte crawlere henter. Det er de sider, AI-værktøjerne kender dig for. Er dine vigtigste sider ikke på listen, er det din GEO-to-do-liste.
  • Live-hentninger (ChatGPT-User, Perplexity-User, Claude-User) per side over tid. Det er det tætteste, du kommer på et mål for AI-synlighed ud fra dine egne data.

Forbehold

  • Ét site, én uge. Dine tal vil være anderledes, og derfor er det værd at køre selv.
  • IP-listerne ændrer sig. Hent dem friske hver gang; det gør scriptet.
  • Anthropics liste er ny, så en ældre guide siger måske stadig, at Claudes IP’er ikke kan verificeres. Det kan de nu.

Vil du have det her som en løbende rapport i stedet for et engangsscript, er det en del af min tracking- og analytics-ydelse. Og hvis du undrer dig over, om nogen af crawlerne læste din llms.txt: det tjekkede jeg også.