Перейти к содержимому

Кто к вам на самом деле ходит

Каждый гайд советует опубликовать llms.txt. Ни один не показывает строку лога, где этот файл кто-то запросил.

Я прочитал свой. Одна машина, несколько маленьких сайтов, access-логи nginx по сайтам, с 19 июля по 12 августа 2026.

В окне дыра. Ничего между 20 и 28 июля ротацию не пережило, так что дальше речь про 16 дней записей.

Это трафик одного оператора, а не выборка по вебу. Зато это замер. У советов вокруг нет и такого.

Первым замер нашёл меня. Мой собственный адрес сделал за окно 4 221 запрос к этой машине, и 81 запрос из них ушёл под именем краулера.

Сначала прочитайте весь период целиком, а отдельного агента — потом.

Столбец «Мои» — это строки, у которых первое поле лога совпало с моим собственным исходящим адресом. Адрес я взял curl -s https://api.ipify.org с той же машины, с которой проверял сайт, и дальше он просто вычитается:

Окно терминала
zcat -f /var/log/nginx/example.access.log* \
| awk 'tolower($0) ~ /claudebot/ {mine += ($1 == "203.0.113.9"); all++}
END {print "в логе", all, "| мои", mine, "| остальное", all - mine}'

Признак грубый: он ловит только запросы с одного адреса, а если вы ходили на сайт ещё и с телефона или из CI, эти строки в «Мои» не попадут. Зато он ничего не додумывает, и его хватило, чтобы две строки в таблице ниже обнулились.

АгентВ логеМоиОстальное
ChatGPT-User3414337
YandexBot2443241
bingbot1553152
OAI-SearchBot82478
Googlebot79475
GPTBot551441
meta-externalagent41338
Claude-User341222
PerplexityBot25718
Amazonbot22220
Applebot734
ClaudeBot660
Perplexity-User330

Две строки оказались моими целиком: у ClaudeBot и Perplexity-User все запросы пришли с моего адреса, и после вычитания там остаётся ноль.

Прошлая версия страницы валила эти строки на неизвестный сканер: там было написано, что один клиент прислал с единственного адреса 56 разных имён краулеров.

Счёт был почти верный. Клиентом был я. С этого адреса за окно пришло 56 разных строк User-Agent, и 18 из них — имена краулеров, все из curl, которым я проверял собственные правила доступа.

Google-Extended был в этом наборе. Своего user agent у него нет: это управляющий токен для robots.txt, а ходят обычные агенты Google.

То есть строка была настоящая, а краулера за ней не было, и Google-Extended вы не выгрепаете из своего лога никогда, разве что наберёте его сами себе.

Самая большая строка — та, которую я не могу никому приписать

Заголовок раздела «Самая большая строка — та, которую я не могу никому приписать»

ChatGPT-User стоит первым, и именно эту строку лог объясняет хуже всего, потому что агент срабатывает, когда человек вставляет ссылку в чат.

Четыре запроса из 341 пришли с моего адреса, и это был curl с руками выставленной строкой. Остальные 337 пришли с 272 адресов. С опубликованными диапазонами вендоров я эти адреса не сверял.

Если агент настоящий, запрос уходит с серверов OpenAI и когда ссылку вставил я, и когда посторонний: по адресу нас в любом случае не различить.

Сказать по логу можно немного. Запросы приходят круглые сутки, и это видно лучше, чем читается: вот тот же агент на свежем срезе за 15 августа.

ChatGPT-User по часам суток, 317 запросов за 15 дней

00:0012:0023:00

Всего 317. Наведите на столбик, чтобы увидеть значение.

ChatGPT-User по часам суток, 317 запросов за 15 дней. 00:00 — 5, 01:00 — 9, 02:00 — 4, 03:00 — 10, 04:00 — 8, 05:00 — 8, 06:00 — 17, 07:00 — 9, 08:00 — 23, 09:00 — 16, 10:00 — 14, 11:00 — 12, 12:00 — 17, 13:00 — 20, 14:00 — 16, 15:00 — 15, 16:00 — 18, 17:00 — 18, 18:00 — 21, 19:00 — 13, 20:00 — 15, 21:00 — 14, 22:00 — 9, 23:00 — 6.

Замер 15 августа 2026 года, лог voice-ai. Пустого часа нет ни одного, а провал приходится на ночь по UTC.

Из тех 337 запросов 12 августа тридцать восемь попали в пять минут от запроса с моего адреса.

Одиннадцать процентов — слабый довод против версии «это всё я», а про то, кто приходил, они не говорят вообще ничего. Чтобы развести версии, нужно окно, в которое я сайт не трогаю. Такого окна я не снимал.

Всю строку ChatGPT-User надо читать так. Это счёт обращений агента, которого обязан запустить человек, и кто был этим человеком, лог не говорит.

AI-агенты — ChatGPT-User, OAI-SearchBot, GPTBot, PerplexityBot, Perplexity-User, Claude-User, ClaudeBot и meta-externalagent вместе, с вычтенным моим адресом:

ПутьЗапросов
/280
Пост со сравнением моделей speech-to-text64
/robots.txt56
Пост о расшифровке голосового в Telegram18
/ru17
/sitemap.xml14
Тот же пост со сравнением, по-русски6
Тот же пост о расшифровке, по-русски2
/llms.txt0

Сорок пять обращений к llms.txt, сорок четыре из них мои

Заголовок раздела «Сорок пять обращений к llms.txt, сорок четыре из них мои»

llms.txt за весь период запросили 45 раз, всеми клиентами вместе. 44 запроса пришли с моего адреса.

Единственный чужой — SiteAuditBot от Semrush, 11 августа, ответ 200. Ни один AI-агент файл не просил вообще.

Прошлая версия страницы писала «примерно по одному запросу на агента» и называла файл оглавлением, в которое заглядывают, и это чтение оказалось одним моим циклом.

Семнадцать таких строк укладываются между 18:21:12 и 18:21:15 седьмого августа, по одной строке на имя краулера, и все с моего адреса. Это curl, идущий по списку user agent. Тринадцать вендоров за четыре секунды не приходили.

Так что llms.txt — не маршрут, по которому ходят агенты, и на этой машине в это окно он не был даже оглавлением. Направление вывода я оставил, а цифру пришлось убрать.

  1. Писать лог по сайту, а не по машине — строка access_log внутри каждого блока server.

    server {
    server_name example.com;
    access_log /var/log/nginx/example.access.log;
    }

    Один общий лог без $host в log_format не скажет, на какой сайт пришёл запрос.

  2. Открывать ротированные архивы, а не только сегодняшний файлzcat -f читает и обычные, и gzip.

    Окно терминала
    zcat -f /var/log/nginx/example.access.log* | wc -l

    Глубину хранения смотреть в конфиге logrotate. Это и есть ваше настоящее окно.

  3. Узнать свой адрес раньше, чем считать что-либо — одна команда, и она меняет все таблицы ниже.

    Окно терминала
    curl -s https://api.ipify.org

    Мой лежал в логе 4 221 раз под 56 разными user agent, и две недели я читал это как трафик.

  4. Вычитать адрес, а не только свой curl — браузер, smoke-тест и подделанный агент падают в тот же файл.

    Окно терминала
    zcat -f /var/log/nginx/example.access.log* | awk '$1 != "203.0.113.9"'

    Фильтр по curl поймал 26 из 44 моих строк с llms.txt, а остальные 18 — мои же имена краулеров и мой браузер.

  5. Посчитать агентов за всё окно — по одному совпадению на запрос, без учёта регистра.

    Окно терминала
    zcat -f /var/log/nginx/example.access.log* \
    | awk 'match(tolower($0), /chatgpt-user|oai-searchbot|gptbot|perplexitybot|perplexity-user|claude-user|claudebot|meta-externalagent|googlebot|bingbot|yandexbot|applebot|amazonbot/) {
    print substr(tolower($0), RSTART, RLENGTH)
    }' \
    | sort | uniq -c | sort -rn

    Здесь важен именно awk, а не grep -oE, который эта страница когда-то и публиковала. grep печатает вхождения, а не строки, и один запрос bingbot называет себя дважды: в токене и в адресе +http://…/bingbot.htm.

В этом окне выходит 336 вхождений против 155 запросов. awk берёт первое совпадение в строке, и одна строка снова значит один запрос. 6. Посчитать пути по AI-агентам, вычтя свой адрес — седьмое поле в combined-формате это путь запроса.

Окно терминала
zcat -f /var/log/nginx/example.access.log* \
| grep -iE 'ChatGPT-User|OAI-SearchBot|GPTBot|Perplexity|Claude-User|ClaudeBot|meta-externalagent' \
| awk '$1 != "203.0.113.9" {print $7}' | sort | uniq -c | sort -rn | head -20

Здесь grep без -o отбирает строки целиком, так что запросы считаются сразу правильно.

Сравнение, ради которого всё и затевалось: 0 обращений к llms.txt против 56 к robots.txt. robots.txt взял каждый AI-агент из таблицы. llms.txt не взял ни один. Это не значит «файл бесполезен», а значит ровно то, что подтверждает лог одной машины за 16 дней.

К / пришло 280 запросов, больше, чем ко всем остальным путям вместе, но прочитать это как предпочтение нельзя. Голый домен, вставленный в чат, и агент, начавший с корня, дают одну и ту же строку: лог записывает путь и никогда причину. Держать хорошие страницы достижимыми от корня — здравый совет, только доказывает его не эта таблица.

Пост со сравнением забрали 64 раза и ещё 6 раз по-русски — больше, чем весь остальной блог вместе, и это всё, что знает про него nginx. Ответ 200 значит, что байты ушли. Попало ли из них слово в чужой ответ, видно в переходах с хостов ассистентов и в самих ответах, а не в логе.

robots.txt забрали 56 раз, sitemap.xml — 14. Это протокол, а не интерес ко мне. Crawler берёт robots.txt в начале каждой сессии, так что большое число значит, что рукопожатие работает. Про правильный sitemap не пишут постов, а агенты просят его раньше любой вашей прозы.

И всё это стоит на личностях, которых я не проверял, а цену окно показало дважды: сначала я прочитал свои же подделанные строки как тринадцать вендоров, потом Google-Extended там, где такой строки не бывает. По-хорошему нужен обратный DNS на каждый адрес или сверка с диапазонами вендора.

  • Посчитать свой трафик за агентский. Мой адрес лежит в логе 4 221 раз, 81 строка — под именем краулера, и суммы я опубликовал вместе со всем этим. Странные строки списал на неизвестный сканер; сканером был мой же цикл на curl, и выяснилось это одним запросом к api.ipify.org.
  • Вывод про llms.txt с первого захода. Страница писала «примерно по одному обращению на агента» и строила на этом вывод. Семнадцать строк из этого счёта — четыре секунды моего цикла 7 августа. Настоящее число за 16 дней: 0.
  • Прочитать живой лог и на этом остановиться. Первый заход пришёлся на файл, начатый тем же утром, и там было 0 запросов к llms.txt — число верное случайно, рассуждение нет. В архивах нашлись 45 запросов, 44 из них мои.
  • Опубликовать команду, которая не даёт эту таблицу. Вариант с grep -oE был регистрозависимым и bingbot не находил вовсе, а с флагом регистра считал вхождения вместо запросов и удваивал строку. Читатель получал не таблицу и не ошибку.
  • Считать календарные дни вместо дней на диске. Сначала на этой странице между теми же датами стояло 24 дня. logrotate держит здесь 14 суточных архивов, и девяти из этих дней на момент подсчёта уже не было.
  • Отнести суммы к одному сайту. Цифры собраны по всем посайтовым логам машины, и 340 запросов ChatGPT-User из 341 принадлежат одному сайту. Разделение сделано по путям, а не по полю в логе.
  • Считать имя в логе личностью. Каждый агент в таблицах выше — непроверенная строка User-Agent. Мои строки были откровенно поддельными. И я всё равно не скажу, какие из оставшихся написал чей-то сканер.
  • Считать лог nginx полным счётом. Запрос, который Cloudflare отдал из кэша, до машины не доходит. Эти цифры — нижняя граница, а не итог.
  • Забрать для сравнения цифры со стороны Cloudflare. Запрос к API упал на правах токена, поэтому сравнения на этой странице нет. Всё, что впитал edge, в таблицы выше не попало.
  • Напечатайте свой публичный адрес и выгрепите его из лога раньше, чем прочитаете хоть одну сумму. У меня это был самый крупный клиент машины.
  • Повторите подсчёт через месяц и сравнивайте форму, а не суммы. По одному окну не понять, что на вашей машине вообще нормально.
  • Проверьте глубину хранения в logrotate, прежде чем верить своему окну. У меня она оказалась больше, чем файл, который я открыл первым.
  • Запросите /llms.txt сами и найдите эту строку в логе. Не нашли — значит вы читаете не тот файл.
  • Посчитайте коды ответа по агентам. Стена 403 значит, что кому-то отказывают. В суммах это читается ровно как «никто не приходил».
  • Считайте строки, а не вхождения. Прогоните одни и те же данные через wc -l и через grep -o и сравните суммы.
  • Разрезолвите адреса главных агентов обратным DNS и сверьте с диапазонами вендора.
  • Снимите окно, в которое вы сайт не трогаете вообще. Иначе агента, которого запускает человек, честно не прочитать. Сам я такого окна пока не снимал.
  • Сравните лог с аналитикой своего CDN. У Cloudflare это AI Crawl Control, вкладки Crawlers и Metrics. Всё, что edge закэшировал или отклонил, для nginx невидимо.

Кто чем владеет и где на самом деле стоит блокировка: AI-crawler и llms.txt. Чем скачивание всё-таки не является: почему AI цитирует не вас.

Предложить правку · Страница не помогла