Skip to main content

M'han trobat per ChatGPT: què diuen els registres de la web

· 7 min read
Enginyer de software

Dilluns em va escriure un propietari d'un pis turístic. Tenia un problema amb el programa de la seva gestora i em demanava ajuda. Dimecres, per telèfon, li vaig preguntar com m'havia trobat. «Per ChatGPT.» Li havia explicat el problema i el meu nom li havia sortit el primer, amb el telèfon inclòs.

Qui busca algú per resoldre un problema ja no només obre Google. Cada vegada més gent li pregunta a un assistent com ChatGPT, i l'assistent no torna deu enllaços: en recomana un o dos. Vaig voler veure-ho amb dades: si la visita havia quedat apuntada a la web, quins robots d'OpenAI llegeixen les meves webs de debò i quins només en porten el nom.

La visita porta una etiqueta

Quan ChatGPT enllaça una web en una resposta, hi afegeix ?utm_source=chatgpt.com. La pàgina no en fa res, però queda escrit al registre d'accés, el fitxer on el servidor apunta cada petició que rep. Al de joansanfeliu.com hi és:

2026-09-14 09:36:17 UTC   GET /es/?utm_source=chatgpt.com   200

Eren les 11:36 a Barcelona. El correu va arribar a les 12:11.

Com treure el registre d'Amplify

Les meves webs són a AWS Amplify, que guarda cada petició en el format de CloudFront i la dona amb una ordre (les dates, en la sintaxi del date de macOS):

aws amplify generate-access-logs \
--region eu-west-1 \
--app-id <id-de-l-app> \
--domain-name joansanfeliu.com \
--start-time $(date -u -v-7d +%s) \
--end-time $(date -u +%s) \
--query logUrl --output text

Retorna una adreça temporal a un CSV amb una fila per petició. Dues coses em van fer perdre temps:

  • El rang de dates té un límit, i no és el mateix per a totes les apps. Amb catorze dies, agencia.joansanfeliu.com i formacio.joansanfeliu.com van tornar el fitxer. joansanfeliu.com va respondre Unable to complete request for the given time range, reduce time range and try again i només va acceptar set dies.
  • Els noms de les columnes porten els parèntesis escapats, cs\(User-Agent) i cs\(Referer), i dins les cel·les també hi ha barres invertides (utm_source\=chatgpt.com). El primer recompte, buscant la columna cs(User-Agent), em va donar zero robots.

Llegint-ho bé:

import csv
from urllib.parse import unquote

def neteja(text):
return unquote(unquote(text)).replace('\\', '')

files = csv.reader(open('joansanfeliu.csv', newline=''))
I = {neteja(nom): i for i, nom in enumerate(next(files))}

for f in files:
if 'utm_source=chatgpt.com' in neteja(f[I['cs-uri-query']]):
print(f[I['date']], f[I['time']], f[I['cs-uri-stem']])

Els tres robots d'OpenAI

OpenAI té tres agents, i la seva documentació diu per a què serveix cadascun:

  • GPTBot recorre webs buscant contingut que pot servir per entrenar els seus models.
  • OAI-SearchBot serveix perquè les webs surtin als resultats de cerca de ChatGPT.
  • ChatGPT-User visita una pàgina quan algú fa una pregunta a ChatGPT. Com que l'acció la inicia una persona, OpenAI avisa que les regles del robots.txt poden no aplicar-s'hi.

En catorze dies, als registres de dues de les webs:

  • agencia.joansanfeliu.com: 93 peticions de GPTBot i 5 d'OAI-SearchBot, totes cinc a /robots.txt.
  • formacio.joansanfeliu.com: 151 de GPTBot i 6 d'OAI-SearchBot, també totes a /robots.txt.

El que més demana GPTBot és el mapa del lloc (sitemap-index.xml a l'una, sitemap.xml a l'altra). Totes aquestes peticions surten d'adreces que OpenAI publica com a seves.

Els que se'n fan passar

A joansanfeliu.com, en set dies, surt una altra cosa:

  • GPTBot: 116 peticions, 30 des d'adreces d'OpenAI.
  • OAI-SearchBot: 115, 35 des d'adreces d'OpenAI.
  • ChatGPT-User: 91, 2 des d'adreces d'OpenAI.

Més de la meitat de la resta no demana pàgines: demana /.env, /.aws/credentials, /@fs/etc/passwd o /id_ed25519, els fitxers on un projecte mal desplegat deixa contrasenyes i claus. /@fs/ és la ruta del servidor de desenvolupament de Vite per servir fitxers del disc, i joansanfeliu.com està fet amb Vite. Escriure el nom d'un robot d'OpenAI a l'agent d'usuari, la capçalera amb què cada programa diu qui és, no costa res.

Comptant tots els agents, aquella setmana hi va haver 2.059 peticions buscant fitxers d'aquest tipus. Totes van rebre HTML o un error: 1.765 van rebre un 200 amb la portada, perquè la web té una regla que envia qualsevol ruta desconeguda cap a l'index.html (és una web d'una sola pàgina, que dibuixa el contingut amb JavaScript), i 216 un 404. A agencia. i formacio., en catorze dies, no n'hi va haver cap.

Com saber si és OpenAI de debò

L'agent no prova res. L'adreça d'origen, en canvi, no es pot inventar en una connexió HTTP, i OpenAI publica les seves en tres fitxers: openai.com/gptbot.json, openai.com/searchbot.json i openai.com/chatgpt-user.json.

import ipaddress
import json
import urllib.request

xarxes = []
for nom in ['gptbot', 'searchbot', 'chatgpt-user']:
with urllib.request.urlopen(f'https://openai.com/{nom}.json') as r:
prefixos = json.load(r)['prefixes']
xarxes += [ipaddress.ip_network(p.get('ipv4Prefix') or p.get('ipv6Prefix')) for p in prefixos]

def es_openai(ip):
adreca = ipaddress.ip_address(ip)
return any(adreca in xarxa for xarxa in xarxes)

Una fila és d'OpenAI si l'agent ho diu i es_openai() ho confirma amb la columna c-ip. Els fitxers es refresquen: el de ChatGPT-User que vaig baixar era de l'11 de setembre, i una adreça que OpenAI ja no fa servir pot no ser-hi. Per això els números d'abans diuen «des d'adreces d'OpenAI» i no «falsos».

Què hi ha a les webs perquè una IA les llegeixi

No sé què va fer que ChatGPT em recomanés. Sé què hi ha a cada web:

  • agencia.joansanfeliu.com té un robots.txt que dona permís pel seu nom a GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot i la resta de robots d'IA coneguts, amb un comentari que explica per què, i un /llms.txt: un resum en text pla, pensat per a models, de qui som, on treballem i com.
  • formacio.joansanfeliu.com i joansanfeliu.com tenen un robots.txt que ho permet tot sense anomenar ningú, i cap llms.txt.
  • joansanfeliu.com porta a l'index.html les dades estructurades de la persona i de l'organització (JSON-LD, un format que els cercadors llegeixen sense haver d'interpretar el text).

La visita de ChatGPT va entrar per joansanfeliu.com, una web sense llms.txt.

Actualització del 16 de setembre al vespre. El mateix dia de publicar això ho vaig canviar:

  • joansanfeliu.com, formacio.joansanfeliu.com i getguestproof.com ja tenen un robots.txt que anomena els robots d'IA, amb Content-Signal: search=yes, ai-input=yes, ai-train=yes, i el seu /llms.txt.
  • formacio.joansanfeliu.com i getguestproof.com porten dades estructurades. Les de joansanfeliu.com fan servir els mateixos identificadors que les de l'agència: una sola persona i un sol estudi.
  • joansanfeliu.com genera cada pàgina en HTML quan es publica, en els cinc idiomes. Un robot que no executa JavaScript ja no rep la portada a totes les adreces: la pàgina de productes en castellà en porta més de quatre-centes paraules pròpies.
  • La regla que enviava qualsevol ruta desconeguda a la portada ja no hi és: /.env respon un 404.

Si voleu fer la mateixa comprovació

  1. Traieu el registre d'accés de la vostra web.
  2. Busqueu utm_source=chatgpt.com: són les visites que us arriben des de ChatGPT.
  3. Contrasteu cada GPTBot, OAI-SearchBot i ChatGPT-User amb les adreces que publica OpenAI.

El segon pas us diu si ja us recomanen. El tercer, qui entra a la web dient que és un altre.

T'aviso quan publiqui

Un correu per setmana com a molt, i només quan publiqui alguna cosa. De tant en tant t'hi explico el que faig: cursos, sessions, producte. Te'n pots donar de baixa quan vulguis, amb un clic.