Comment repérer les robots d'IA dans vos journaux serveur
Cherchez dans le champ user-agent de votre journal d'accès des jetons comme GPTBot, OAI-SearchBot, ClaudeBot, Claude-SearchBot et PerplexityBot, puis regardez les codes de statut qu'ils ont reçus. Un user-agent ne prouve rien à lui seul : vérifiez chaque IP source avec la liste d'IP publiée par l'éditeur, ou par DNS inverse puis direct pour Google et Apple.
Le robots.txt dit ce que vous demandez aux robots de faire. Votre journal d'accès montre ce qui s'est réellement passé : quels robots d'IA sont venus, quelles pages ils ont demandées et ce que votre serveur a répondu. C'est la preuve la plus directe dont vous disposez, et il suffit des fichiers de journaux et d'un terminal. Les exemples ci-dessous utilisent le format de journal combiné (combined) que nginx et Apache emploient par défaut.
Sur cette page
- À quoi ressemble la visite d'un robot d'IA dans un journal d'accès ?
- Comment compter les visites des robots d'IA ?
- Qu'a réellement reçu chaque robot ?
- Comment vérifier qu'une visite vient bien d'OpenAI, d'Anthropic ou de Perplexity ?
- Comment vérifier Googlebot, Applebot et CCBot ?
- À quoi ressemblent les faux robots d'IA ?
- Que ne peuvent pas vous dire les journaux ?
À quoi ressemble la visite d'un robot d'IA dans un journal d'accès ?
Dans le format combiné, chaque ligne contient l'IP du client, l'heure, la ligne de requête, le code de statut, la taille de la réponse, le référent et le user-agent. nginx le définit ainsi : $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent", et le format combined d'Apache a les mêmes champs. La visite du robot d'entraînement d'OpenAI ressemble à ceci :
20.171.206.5 - - [12/Nov/2026:10:00:01 +0000] "GET /pricing HTTP/1.1" 200 5120 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot"
Les jetons à chercher sont ceux que documentent les éditeurs : GPTBot, OAI-SearchBot et ChatGPT-User (OpenAI) ; ClaudeBot, Claude-SearchBot et Claude-User (Anthropic) ; PerplexityBot et Perplexity-User (Perplexity) ; Googlebot, Applebot, meta-externalagent, meta-webindexer et CCBot. Vous ne verrez jamais Google-Extended ni Applebot-Extended. Google indique que Google-Extended n'a pas de chaîne user-agent distincte, et Apple que Applebot-Extended n'explore pas ; ce sont uniquement des jetons robots.txt.
Comment compter les visites des robots d'IA ?
En découpant chaque ligne au niveau du guillemet double, le user-agent se trouve dans le champ 6. Ne tester que ce champ évite les fausses correspondances avec des URL qui contiennent par hasard le nom d'un robot. Cette commande compte les visites par robot dans le journal courant et dans les journaux archivés et compressés :
zcat -f /var/log/nginx/access.log* \
| awk -F'"' '{print $6}' \
| grep -Eo 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Googlebot|bingbot|Applebot|meta-externalagent|meta-webindexer|CCBot' \
| sort | uniq -c | sort -rn
Adaptez le chemin pour Apache, souvent /var/log/apache2/access.log* ou /var/log/httpd/access_log*. zcat -f lit à la fois les fichiers bruts et ceux compressés en gzip. Si un robot attendu est absent, cela ne prouve pas à soi seul un blocage : il n'est peut-être simplement pas venu pendant la période couverte par vos journaux.
Qu'a réellement reçu chaque robot ?
Les visites comptent moins que les réponses. Un robot qui reçoit un 403 à chaque requête est venu, mais n'a rien lu. Ces commandes montrent les codes de statut, les chemins les plus demandés et si le robot a récupéré le robots.txt :
# Status codes returned to PerplexityBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /PerplexityBot/ {split($3, s, " "); print s[1]}' | sort | uniq -c
# Most requested paths for OAI-SearchBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /OAI-SearchBot/ {split($2, r, " "); print r[2]}' | sort | uniq -c | sort -rn | head -20
# Did ClaudeBot fetch robots.txt, and what did it get?
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /ClaudeBot/ && $2 ~ /robots\.txt/ {split($3, s, " "); print s[1]}' | sort | uniq -c
Une majorité de 200 est ce que vous voulez. Beaucoup de 403 ou de 429 pointent vers une règle de pare-feu ou une limitation de débit. Des réponses 5xx sur le robots.txt sont graves : selon la RFC 9309, un robot qui reçoit une erreur serveur pour le robots.txt doit considérer que tout le site est interdit.
Si votre site est derrière un CDN, deux choses changent. Les requêtes que le CDN bloque n'atteignent jamais votre serveur d'origine et n'apparaissent donc pas du tout dans ses journaux ; consultez plutôt les événements de sécurité du CDN. Et, à moins de restaurer l'IP du visiteur, le serveur d'origine consigne l'adresse du CDN. Cloudflare, par exemple, transmet l'IP d'origine dans l'en-tête CF-Connecting-IP et consigne par défaut une IP Cloudflare.
Comment vérifier qu'une visite vient bien d'OpenAI, d'Anthropic ou de Perplexity ?
Ces éditeurs publient les plages d'IP que leurs agents utilisent : OpenAI sur openai.com/gptbot.json, openai.com/searchbot.json et openai.com/chatgpt-user.json ; Anthropic sur claude.com/crawling/bots.json ; Perplexity sur perplexity.ai/perplexitybot.json et perplexity.ai/perplexity-user.json. Anthropic indique qu'une IP source figurant sur sa liste signifie que le robot vient bien d'Anthropic. Aucun de ces trois éditeurs ne documente de vérification par DNS inverse : utilisez donc les listes.
Les fichiers ont tous la même forme, une liste prefixes d'entrées ipv4Prefix ou ipv6Prefix ; un petit script suffit donc pour comparer une IP à n'importe lequel d'entre eux :
python3 - 20.171.206.5 https://openai.com/gptbot.json <<'EOF'
import ipaddress, json, sys, urllib.request
ip = ipaddress.ip_address(sys.argv[1])
req = urllib.request.Request(sys.argv[2], headers={"User-Agent": "log-check"})
prefixes = json.load(urllib.request.urlopen(req))["prefixes"]
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix")) for p in prefixes]
print(ip, "listed" if any(ip in n for n in nets) else "NOT listed")
EOF
Pour lister les IP qui se réclamaient d'un robot donné, exécutez awk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}' sur le journal et passez le résultat dans sort | uniq -c | sort -rn. Comparez chacune à la liste correspondante. Les listes changent : récupérez-les à jour plutôt que de conserver une ancienne copie.
Comment vérifier Googlebot, Applebot et CCBot ?
Google, Apple et Common Crawl documentent une vérification par DNS inverse puis direct. Recherchez le nom d'hôte de l'IP, contrôlez son domaine, puis recherchez ce nom d'hôte et vérifiez qu'il renvoie bien à la même IP :
host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1
Pour Google, le nom d'hôte doit se terminer par googlebot.com, google.com ou googleusercontent.com, selon le robot ; Google publie aussi ses plages, celles de Googlebot figurant dans common-crawlers.json. Pour Apple, il doit appartenir à applebot.apple.com, avec des plages dans applebot.json. Pour Common Crawl, il doit se trouver sous crawl.commoncrawl.org, et Common Crawl met en garde : d'autres robots usurpent à tort le nom CCBot.
À quoi ressemblent les faux robots d'IA ?
Les scrapers empruntent souvent le user-agent d'un robot connu pour contourner les filtres. Signes typiques :
- Le user-agent nomme un robot, mais l'IP ne figure pas dans la liste publiée par cet éditeur, ou son DNS inverse ne correspond pas.
- La source est un réseau résidentiel ou un fournisseur cloud que l'éditeur ne liste pas.
- Le client ne demande jamais le robots.txt, ou demande des chemins que le robots.txt interdit à ce robot.
- Le rythme ou le schéma des requêtes diffère nettement du trafic vérifié sous le même nom, par exemple des rafales contre les points d'entrée de recherche ou de connexion.
Le problème inverse existe aussi : un robot qui utilise un user-agent de navigateur ordinaire ne peut pas du tout être identifié à partir de la ligne du journal. En 2025, Cloudflare a indiqué avoir observé Perplexity explorer des sites avec des user-agents non déclarés, semblables à ceux d'un navigateur, depuis des IP extérieures à ses plages publiées ; Perplexity a contesté ce récit et attribué une partie du trafic à un service tiers. Les journaux seuls ne permettent pas de trancher ce genre de cas, d'où l'importance de la vérification par plages d'IP publiées dans les deux sens.
Que ne peuvent pas vous dire les journaux ?
Les journaux montrent ce qui a atteint votre serveur. Ils ne montrent pas ce que votre CDN a bloqué avant le serveur d'origine, si une page qui a renvoyé 200 contenait le texte ou seulement une coquille de scripts, ni si un robot serait autorisé s'il venait aujourd'hui. Ils ne couvrent en outre que la période que vous conservez, et les sites peu fréquentés voient rarement passer des robots d'IA.
Dans un compte AISeeWhy, vous pouvez téléverser un journal d'accès au format combiné (brut ou .gz, jusqu'à 50 Mo) ; il est analysé puis supprimé, et les requêtes de chaque robot d'IA sont comptées avec leurs codes de statut et comparées aux plages d'IP publiées par les éditeurs.
Questions fréquentes
Pourquoi ne vois-je pas Google-Extended dans mes journaux ?
Google indique que Google-Extended n'a pas de chaîne user-agent distincte. L'exploration est faite par les robots existants de Google, et le jeton ne contrôle que la manière dont le contenu peut être utilisé. Il en va de même pour Applebot-Extended, qui, selon Apple, n'explore pas.
Puis-je me fier au user-agent de mes journaux ?
Non. N'importe qui peut envoyer n'importe quel user-agent. Considérez-le comme une affirmation et confirmez-la avec les plages d'IP publiées par l'éditeur ou, pour Google, Apple et Common Crawl, avec une recherche DNS inverse puis directe.
Mes journaux ne montrent aucune visite de robot d'IA. Suis-je bloqué ?
Pas forcément. Le robot n'est peut-être pas encore venu, votre CDN l'a peut-être bloqué avant le serveur d'origine, ou vos journaux n'enregistrent peut-être que les adresses IP du CDN. Consultez les événements de sécurité de votre CDN et testez la page avec le user-agent de chaque robot.
Le trafic de ChatGPT-User est-il celui d'un robot d'exploration ?
OpenAI indique que ChatGPT-User sert à certaines actions des utilisateurs et n'est pas utilisé pour explorer le web de façon automatique. Ses visites suivent généralement une personne qui interroge ChatGPT sur une page ; elles sont donc peu nombreuses.
Sources
- nginx : ngx_http_log_module (format de journal combiné)
- Apache HTTP Server 2.4 : fichiers journaux
- OpenAI : présentation des robots d'exploration OpenAI
- Anthropic : Anthropic explore-t-il le web, et comment les propriétaires de sites peuvent-ils bloquer son robot ?
- Perplexity : les robots d'exploration de Perplexity
- Google : vérifier les robots d'exploration et les agents de récupération de Google
- Google : robots d'exploration courants, dont Google-Extended
- Apple : à propos d'Applebot
- Common Crawl : CCBot
- RFC 9309 : protocole d'exclusion des robots
- Cloudflare : restaurer les adresses IP d'origine des visiteurs
- Cloudflare : Perplexity utilise des robots furtifs et non déclarés pour contourner les directives d'interdiction d'exploration des sites
- Perplexity : agents ou bots ? Comprendre l'IA sur le web ouvert