Исправление URL со статусом «Discovered / Crawled – Currently Not Indexed» с DeepSeek Harness

Запустите пайплайн индексации Search Console в DeepSeek Harness: разовая партия с dsh --profile headless или интерактивные сессии в Web UI с еженедельным расписанием — оба пути отправляют список через Google Indexing API (200 URL в день).

DeepSeek Harness (dsh) запускает агентов, которые делают реальную работу — и мало какая SEO-задача подходит лучше, чем пайплайн неиндексированных URL: прочитать список, проверить каждый URL, классифицировать, дождаться утверждения, отправить, верифицировать. Каждый этап — команда или файл, ровно та территория, где живут харнесс-агенты.

Два вопроса определяют вашу конфигурацию. Нужна разовая партия, которую можно скриптовать и поставить в cron? Идите в headless. Хотите видеть, как всё работает, отвечать на вопросы агента и утверждать партию за партией в чате? Используйте Web UI. Этот гайд показывает оба пути; лежащий в основе пайплайн одинаков для обоих. Глубокое объяснение двух статусов (включая то, почему Google обходит одни страницы и не обходит другие) подробно разобрано в версии Hermes Agent этого процесса. Здесь мы фокусируемся на исполнении через dsh.

Выбор пути

Разовая партия headless

Web UI + расписание

Идеально для

Скриптованные партии, cron, запуски в стиле CI, тесты

Интерактивный триаж, первый сетап, изучение суждений агента

Старт

dsh --profile headless "задача"

dsh web (открывает 127.0.0.1:3080)

Утверждение

Предварительно утверждённый список в файле; если правила требуют человека, агент спрашивает своим инструментом вопросов

Спрашивает в чате в реальном времени, утверждаете партию за партией

Расписание

cron (или инструмент расписания dsh, если ваш профиль загружает плагин Schedule)

То же, но каждый запуск виден

Вывод

Файлы отчётов в папке проекта

Файлы отчётов плюс транскрипт чата

Схема решения, сравнивающая путь разовой headless-партии dsh с циклом Web UI плюс расписание

Партии — headless, первый сетап — Web UI. Пайплайн ниже одинаков.

Оба пути разделяют одно правило: этап записи (отправка в Google) остаётся за шлюзом человеческого утверждения. В headless-режиме это значит, что вы просматриваете файлы, созданные агентом, прежде чем позволить ему выполнить команды отправки. В web-режиме вы утверждаете в чате.

Что вы получаете

Папку проекта indexing/ с: инвентарём URL, классифицированными списками (to-submit.txt, skip.txt, needs-fix.txt), утверждённой очередью отправки и журналами запусков. На каждом запуске dsh выдаёт краткий отчёт: сколько отправлено, сколько пропущено и почему, что изменилось с прошлого раза. Первый сетап 60–90 минут (в основном учётные данные Google), еженедельный запуск 15 минут.

Перед началом

  • dsh установлен и настроен. Обновите через npx @deepseek-ai/dsh@latest web, если нужно. Ваш API-ключ и настройки в ~/.dsh/ (profiles, sessions, settings.yaml); dsh web запускается или headless-задача успешна = установка подтверждена.
  • Свойство GSC, владельцем которого вы являетесь, в формате sc-domain:example.com.
  • Учётные данные для чтения: OAuth-клиент для Search Console API (client ID + секрет).
  • Учётные данные для записи: проект Google Cloud с включённой Indexing API, JSON-ключ сервисного аккаунта, и e-mail сервисного аккаунта, добавленный как владелец в GSC → Настройки → Пользователи и права. 403 при отправке = этот шаг провален.
  • Две папки скриптов GSC в workspace: скилл чтения (sitemap, Search Analytics, проверка URL) и скилл индексации (index_submit.py). Python 3 и pip install google-auth google-api-python-client.
  • Папка проекта, например ~/gsc-indexing-project с data/, scripts/, logs/.

Google-часть сетапа идентична для любого агента; документация скилла gsc-indexing проведёт вас по консоли Cloud: включить Indexing API, создать сервисный аккаунт, скачать ключ, добавить его владельцем.

Путь A: headless-запуск партии

Headless-режим — это dsh --profile headless "задача": одна задача, один ответ, конец. Вы кладёте весь пайплайн в один промпт или разбиваете на несколько запусков, пока отлаживаете.

Первый запуск (из папки проекта):

bash
dsh --profile headless "Выполни этап 1 пайплайна индексации GSC. Скриптом gsc_query.py перечисли sitemap для sc-domain:example.com, извлеки все URL с lastmod, дедуплицируй и запиши в data/url-inventory.csv. Сообщи итог."

Хороший результат: настоящий CSV с итогом, согласующимся с отчётом sitemap в GSC, и без выдуманных колонок. Контроль качества: откройте файл и проверьте пять случайных URL. Если агент сообщает об ошибке аутентификации, повторите OAuth-поток GSC и попробуйте снова; скрипту чтения нужен свежий токен.

Этап 2:

bash
dsh --profile headless "Проверь URL из data/url-inventory.csv через URL Inspection API и раздели на data/to-submit.txt, data/skip.txt (с причиной в каждой строке) и data/needs-fix.txt. Включи только URL с lastmod за последние 90 дней."

Агент выполняет скрипты проверки партиями (у API есть лимиты частоты на свойство; актуальная квота в Google Cloud Console). Проверьте разделение: в списке пропущенных должны доминировать noindex, отклонения canonical и дубликаты. Если needs-fix пуст на сайте с тысячами URL, расширьте входное окно.

Этап 3 — шлюз утверждения, никогда не выполняется без надзора:

bash
dsh --profile headless "Прочитай data/needs-fix.txt и data/skip.txt. Подготовь очередь исправлений и отправок таблицей: URL, предполагаемая причина (нет внутренних ссылок, дубликат, canonical, noindex, слабый, soft 404), доказательство, предлагаемое действие, уровень риска. Ничего не отправляй."

Просмотрите таблицу в отчёте, сократите data/to-submit.txt до URL, которые вы утверждаете, и выполните этап 4:

bash
dsh --profile headless "Отправь URL из data/approved-urls.txt скриптом индексации (index_submit.py submit --urls-file data/approved-urls.txt). Сначала выполни check-auth. Запиши каждый результат в logs/submissions.log."

Ожидаемый вывод: строка результата уведомления на каждый URL, без 403. Восстановление: 403 означает, что сервисный аккаунт не владелец свойства; 429 — вы упёрлись в квоту 200/день или 600/минуту — разнесите список по дням. Если запуск умер на середине, возобновите через dsh --profile headless --resume <session>.

Путь B: Web UI и еженедельное расписание

dsh web открывает браузерный интерфейс на 127.0.0.1:3080. Те же этапы, но через чат и интерактивно: агент просит подтвердить классификационные списки и ещё раз перед каждой командой отправки. Этот поток утверждения в реальном времени — главная причина выбрать этот путь на первом сетапе: вы видите, что агент собирается сделать с вашим Google-свойством, до того как он это сделает.

Когда пайплайн налажен, добавьте ритм. Плагин Schedule в dsh регистрирует schedule_create и повторяет задачи по таймеру внутри живой сессии:

schedule_create: every 7 days, run "Inspect data/url-inventory.csv, classify new and changed URLs, and draft the submission queue. Do not submit."

Если ваш профиль не загружает плагин Schedule, строка cron вокруг headless-команды даёт тот же результат:

bash
0 9 * * 1 cd ~/gsc-indexing-project && dsh --profile headless "Выполни еженедельный обзор индексации GSC и подготовь очередь отправки." >> logs/weekly.log 2>&1
Цикл еженедельного расписания пайплайна индексации dsh с остановкой на человеческое утверждение

Расписание гоняет первые три станции; отправка остаётся за человеческим шлюзом.

Не кладите этап отправки в расписание. Еженедельный обзор, классификация и подготовка очереди могут идти без надзора; отправка ждёт человека.

Правила триажа, которые применяет агент

Классификация и очередь опираются на небольшую таблицу. Положите её в папку проекта, чтобы каждый запуск использовал одни и те же правила:

Причина

Исправление

Отправлять после исправления?

Нет внутренних ссылок

Добавить контекстные ссылки с индексированных страниц

Да

Совершенно новая страница

Исправлять нечего; отправить один раз и ждать 1–2 недели

Да, один раз

Блокировка robots.txt

Снять блокировку пути

Да

Дублированный или слабый контент

Переписать, объединить или удалить

Только после реального изменения

canonical указывает в другую сторону

Исправить, если ошибка; намеренно — оставить URL

Только после исправления

noindex на момент обхода

Убрать noindex

Да, после удаления

Soft 404, архивы, бесполезные facets

Исправить или удалить; постоянный пропуск

Нет

Глубокое чтение двух статусов (включая то, почему Google обходит одни страницы и не обходит другие) — в гайде Hermes Agent. Причины одни и те же, независимо от того, какой харнесс исполняет пайплайн.

Верификация, затем ожидание

После каждой партии проверьте уведомление через status: это доказывает лишь наличие метаданных URL у Google, а не индексацию страницы. Перепроверьте отправленные URL через 3–7 дней и сравните статусы. Здоровая схема — discovered → crawled → indexed за 1–2 недели. Данные GSC приходят с задержкой в несколько дней, и Google переобходит по своему расписанию — URL, остающийся в «Crawled – currently not indexed» 10–14 дней после реальных исправлений, это вердикт о качестве контента, а не проблема отправки. Файл журнала делает это видимым: дата, URL, тип уведомления, статус проверки на следующем запуске. Вот метрика: список неиндексированных, сжимающийся со временем, а не количество уведомлений.

Честные ограничения

  • Indexing API официально документирована для страниц JobPosting и BroadcastEvent. Отправка обычных страниц — распространённая практика, но Google не даёт гарантий и не обещает поддержку для типа страниц.
  • Кнопка «Запросить индексацию» в Search Console не имеет публичного API. Indexing API — ближайший скриптуемый канал, но не клон кнопки.
  • Автоматизация не создаёт приоритет. Если страница так и не индексируется после исправления и отправки, следующий шаг — работа над контентом, а не очередной запланированный запуск.

Частые вопросы

Можно ли работать только в headless, без Web UI? Да. dsh --profile headless "задача" выполняет задачу и завершается. Учётные данные остаются в ~/.dsh/, и скрипты чтения работают так же. Проверьте пайплайн от начала до конца один раз в Web UI, прежде чем скриптовать.

Если запуск умер, я теряю работу? Нет. Возобновите через dsh --profile headless --resume <session> и снова выполните скрипт отправки; он дедуплицирует URL, так что повторная отправка уже уведомлённых URL из той же партии безвредна.

Я управляю несколькими свойствами GSC. Придётся всё переделывать для каждого сайта? Скрипты принимают аргумент --site sc-domain:..., поэтому один workspace может содержать инвентари и журналы нескольких свойств. Держите файл утверждённой очереди и команду отправки на каждое свойство; ошибка квоты на одном сайте не блокирует остальные.

Авторка: Камилла Родс, архитектор более 300 ИИ-контентных воркфлоу в Auspia. Пишет об автоматизации контента, системах публикации и процессах, превращающих ИИ-агентов в надёжные операции роста.

Изучить тему

Продолжайте по той же траектории роста