Кто к вам на самом деле ходит
Что решаем
Заголовок раздела «Что решаем»Каждый гайд советует опубликовать 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-User | 341 | 4 | 337 |
| YandexBot | 244 | 3 | 241 |
| bingbot | 155 | 3 | 152 |
| OAI-SearchBot | 82 | 4 | 78 |
| Googlebot | 79 | 4 | 75 |
| GPTBot | 55 | 14 | 41 |
| meta-externalagent | 41 | 3 | 38 |
| Claude-User | 34 | 12 | 22 |
| PerplexityBot | 25 | 7 | 18 |
| Amazonbot | 22 | 2 | 20 |
| Applebot | 7 | 3 | 4 |
| ClaudeBot | 6 | 6 | 0 |
| Perplexity-User | 3 | 3 | 0 |
Две строки оказались моими целиком: у 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 августа.
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-text | 64 |
/robots.txt | 56 |
| Пост о расшифровке голосового в Telegram | 18 |
/ru | 17 |
/sitemap.xml | 14 |
| Тот же пост со сравнением, по-русски | 6 |
| Тот же пост о расшифровке, по-русски | 2 |
/llms.txt | 0 |
Сорок пять обращений к llms.txt, сорок четыре из них мои
Заголовок раздела «Сорок пять обращений к llms.txt, сорок четыре из них мои»llms.txt за весь период запросили 45 раз, всеми клиентами вместе. 44 запроса пришли с моего адреса.
Единственный чужой — SiteAuditBot от Semrush, 11 августа, ответ 200. Ни один AI-агент файл не просил вообще.
Прошлая версия страницы писала «примерно по одному запросу на агента» и называла файл оглавлением, в которое заглядывают, и это чтение оказалось одним моим циклом.
Семнадцать таких строк укладываются между 18:21:12 и 18:21:15 седьмого августа, по одной строке на имя краулера, и все с моего адреса. Это curl, идущий по списку user agent. Тринадцать вендоров за четыре секунды не приходили.
Так что llms.txt — не маршрут, по которому ходят агенты, и на этой машине в это окно он не был даже оглавлением. Направление вывода я оставил, а цифру пришлось убрать.
Порядок работы
Заголовок раздела «Порядок работы»-
Писать лог по сайту, а не по машине — строка
access_logвнутри каждого блокаserver.server {server_name example.com;access_log /var/log/nginx/example.access.log;}Один общий лог без
$hostвlog_formatне скажет, на какой сайт пришёл запрос. -
Открывать ротированные архивы, а не только сегодняшний файл —
zcat -fчитает и обычные, и gzip.Окно терминала zcat -f /var/log/nginx/example.access.log* | wc -lГлубину хранения смотреть в конфиге
logrotate. Это и есть ваше настоящее окно. -
Узнать свой адрес раньше, чем считать что-либо — одна команда, и она меняет все таблицы ниже.
Окно терминала curl -s https://api.ipify.orgМой лежал в логе 4 221 раз под 56 разными user agent, и две недели я читал это как трафик.
-
Вычитать адрес, а не только свой
curl— браузер, smoke-тест и подделанный агент падают в тот же файл.Окно терминала zcat -f /var/log/nginx/example.access.log* | awk '$1 != "203.0.113.9"'Фильтр по
curlпоймал 26 из 44 моих строк сllms.txt, а остальные 18 — мои же имена краулеров и мой браузер. -
Посчитать агентов за всё окно — по одному совпадению на запрос, без учёта регистра.
Окно терминала 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 цитирует не вас.
