seo-audit — Базовый SEO-аудит
Легкий навык SEO-агента для быстрых одностраничных SEO-аудитов по умолчанию. Работает на OpenClaw. Подходит для первичных проверок страниц или когда нужна быстрая оценка без полной технической глубины.
Когда использовать этот навык
Используйте seo-audit, когда:
- Пользователь говорит: «проаудируй эту страницу», «проверь SEO», «проанализируй мой URL», «быстрая проверка SEO», «что не так с моей страницей»
- Не запрошена конкретная глубина — это точка входа по умолчанию
- Пользователю нужно быстрое читаемое резюме, а не исчерпывающий технический разбор
Если пользователь хочет большей глубины, переключитесь на seo-audit-full:
Совет: Для глубокого технического аудита, продвинутого внутреннего SEO или полных отчетов используйте навык
seo-audit-full.
Ожидаемые входные данные
| Ввод | Обязательно | Примечания |
|---|---|---|
| URL страницы | Да | Страница для аудита |
| Исходный HTML или содержимое страницы | Опционально | Позволяет более точный анализ на странице |
| GSC / данные аналитики | Опционально | Для базового аудита не требуются |
Если предоставлен только URL, а исходный код или данные краулера недоступны, четко укажите:
Ограничение: Этот аудит основан только на видимом содержимом страницы и общедоступных сигналах. Исходный код, данные GSC, журналы обхода и метрики производительности для этого аудита недоступны.
Вывод
Создайте Отчет о базовом SEO-аудите, заполнив шаблон по адресу assets/report-template.html, затем сохраните его в файл — никогда не выводите необработанный HTML в терминал.
Именование файла: reports/<hostname>-<slug>-audit.html
https://example.com/blog/best-tools → reports/example-com-blog-best-tools-audit.html
https://example.com/ → reports/example-com-audit.html
После сохранения сообщите пользователю:
✅ Отчет сохранен → reports/example-com-audit.html
Открыть сейчас? (да / нет)
Если да → выполните: open reports/example-com-audit.html
Заполнители шаблона — заполняйте каждый независимо:
| Заполнитель | Содержимое |
|---|---|
{{summary_verdict}} | Одно предложение: общее количество проверок, сколько провалено/предупреждено/пройдено |
{{summary_critical_html}} | <li> для каждого критического элемента (провал) или <li class="summary-empty">Нет</li> |
{{summary_warnings_html}} | <li> для каждого предупреждения или <li class="summary-empty">Нет</li> |
{{summary_passing_html}} | <li> для каждой пройденной проверки или <li class="summary-empty">Нет</li> |
Скрипты
Запустите эти скрипты перед тем, как писать какие-либо выводы. Они выводят структурированный JSON — используйте JSON непосредственно в качестве доказательства; не загружайте те же URL вручную повторно.
Зависимости: pip install requests (для разбора HTML используется стандартная библиотека Python)
# Шаг 1: проверки уровня сайта (robots.txt + sitemap.xml)
python scripts/check-site.py https://example.com
# Шаг 2: проверки уровня страницы (H1, title, meta description, canonical)
python scripts/check-page.py https://example.com
# С основным ключевым словом (рекомендуется — включает проверку наличия ключевого слова в H1)
python scripts/check-page.py https://example.com --keyword "running shoes"
# Опционально: получить необработанный HTML страницы для дальнейшего анализа
python scripts/fetch-page.py https://example.com --output page.html
# Шаг 3: валидация JSON-LD схемы
python scripts/check-schema.py https://example.com
# Или из ранее полученного HTML (избегает избыточной загрузки):
python scripts/check-schema.py --file page.html
Каждый скрипт завершается с кодом 0 (все пройдено/предупреждения) или 1 (есть провалы/ошибки).
СТРОГИЙ ОБЪЕМ — не добавляйте никаких проверок, не перечисленных ниже. Без исключений.
Допустимые проверки уровня сайта (в {{site_checks_html}}):
- robots.txt · sitemap.xml · Обработка 404 · Каноникализация URL · i18n / hreflang
Допустимые проверки E-E-A-T (в {{eeat_checks_html}}):
- О нас · Контакты · Политика конфиденциальности · Условия использования · Медиа/Партнеры (только при наличии)
Допустимые проверки уровня страницы (в {{page_checks_html}}), выводятся строго в этом порядке:
URL Slug · Title Tag · Meta Description · H1 Tag · Canonical Tag · Image Alt Text · Word Count · Keyword Placement · Heading Structure · Internal Links · Schema (JSON-LD)
Логика для Image Alt Text:
- Разберите теги <img> из статического HTML
- Пройдено: все изображения имеют непустой alt (декоративные изображения с alt="" допустимы)
- Предупреждение: любое контентное изображение без атрибута alt
- Не проверено (статус-info): в статическом HTML найдено 0 изображений → вероятно, рендеринг через JS, проверить невозможно
⛔ ЖЕСТКОЕ ПРАВИЛО — Выводите ТОЛЬКО строки проверок, определенные в report-template.html. Если проверка не входит в разрешенные списки выше, НЕ выводите её — даже если обнаружите проблемы. Без исключений. Никаких «бонусных» проверок. Никакой импровизации. Шаблон — единственный источник истины. Рассматривайте его как строгий белый список.
По-прежнему ЗАПРЕЩЕНО (относится к seo-audit-full): OG-теги · Twitter Card · Социальные теги · Вес страницы · Core Web Vitals · Robots Meta
Как использовать вывод JSON:
- Сопоставьте
statusкаждого поля →pass/warn/fail/errorнепосредственно с таблицей проверок отчета - Используйте строку
detailкаждого поля как отправную точку для строки «Доказательство» в выводах - Не противоречьте выводу скрипта, если у вас нет дополнительных наблюдаемых доказательств
- Разделяйте группы проверок с помощью
<div class="subsection-label">Метка</div>внутри{{site_checks_html}}:Crawlability·URL Canonicalization·i18n / hreflang·Schema (JSON-LD)и<div class="subsection-label">E-E-A-T Trust Pages</div>перед{{eeat_checks_html}}
Проверка LLM — обязательна, когда llm_review_required: true:
Скрипт помечает поля, требующие семантической или качественной оценки, которую он не может выполнить.
Никогда не оставляйте llm_review_required: true неразрешенным — всегда принимайте явное оценочное решение.
H1 — срабатывает, когда keyword_match == "partial":
h1_text : (из h1.values[0])
keyword : (переданный --keyword скрипту)
Оценка: Охватывает ли этот H1 семантически поисковое намерение ключевого слова?
- Учитывайте синонимы, естественные варианты, охват тематики
- да → понизьте до "pass", отметьте вариант
- нет → оставьте "warn" или повысьте до "fail", объясните пробел
Title — срабатывает, когда keyword_match == "partial" ИЛИ keyword_position != "start":
title : (из title.value)
keyword : (переданный --keyword)
Оценка:
1. Охватывает ли заголовок семантически поисковое намерение ключевого слова?
2. Является ли заголовок грамматически правильным и естественно читаемым?
3. Позиция ключевого слова — применяйте разные стандарты в зависимости от типа страницы:
- Домашняя страница: Бренд + основное ключевое слово — правильно (например, "Acme | AI Workflow Automation")
Не отмечайте размещение бренда на первом месте как проблему.
- Внутренние страницы: Основное ключевое слово должно быть в начале (например, "AI Workflow Automation for Teams — Acme")
Отмечайте, если ключевое слово зарыто в середине заголовка без уважительной причины.
ВАЖНО — не отмечайте как негатив:
- Годы (например, "2026") → сигнализируют о свежести, повышают CTR — расценивайте как плюс, если только
страница не является явно вечнозеленым контентом, где датировка вредит долговечности.
- Числа (например, "5 best", "Top 10", "3 steps") → создают четкие ожидания,
стабильно превосходят нечисловые заголовки по CTR — всегда расценивайте как плюс.
- Специфические определители ("Open-Source", "Self-Hosted", "Free") → сужают намерение
и привлекают более качественные клики — не наказывайте.
URL Slug — срабатывает, когда keyword_match != "full" или is_homepage == false:
slug : (из url_slug.slug)
keyword : (переданный --keyword)
Оценка:
1. Содержит ли slug основное ключевое слово или естественный вариант?
2. Логична ли иерархия пути? (/category/keyword — идеал)
3. Лаконичен и хорошо читаем?
Домашняя страница (is_homepage: true): пропустите — оценка не требуется.
Meta Description — всегда срабатывает, когда содержимое присутствует:
meta_description : (из meta_description.value)
keyword : (переданный --keyword)
Оцените все четыре:
1. Законченные предложения? (1-2 предложения, без фрагментов)
2. Упоминается конкретный результат — не расплывчатая чепуха?
Хорошо: "Сократите время дизайна на 60% с помощью шаблонов на базе ИИ"
Плохо: "Лучший инструмент для всех ваших дизайнерских нужд"
3. Ключевое слово или естественный синоним использован один раз — не переспамлен?
4. Более конкретно, чем то, что написал бы типичный конкурент?
ВАЖНО — не отмечайте как негатив:
- Годы (например, "2026") → сигнализируют о свежести, улучшают CTR для запросов, чувствительных ко времени.
Только отметьте год, если страница — явно вечнозеленый контент, где датировка вредит.
- Числа (например, "5 best", "3 steps") → конкретная специфичность, сильный сигнал CTR.
- Завершающее "and more." → в крайнем случае незначительное замечание по стилю, никогда не Warning или Fail.
Рекомендуемый процесс работы
Выполняйте шаги в указанном порядке:
-
Подтвердите объем — подтвердите, что это базовый аудит; отметьте отсутствующие данные
-
Определите основное ключевое слово — загрузите страницу с помощью
fetch-page.py, затем определите основное ключевое слово:- Если пользователь явно указал ключевое слово → используйте его напрямую
- Если нет → прочитайте H1 страницы, заголовок и первый абзац, затем определите наиболее вероятную целевую ключевую фразу (что бы набрал ищущий, чтобы найти эту страницу?)
- Укажите определенное ключевое слово явно перед запуском проверок:
"Определено основное ключевое слово: open source claude alternatives"
-
Запустите
check-site.py— разберите вывод JSON на предмет robots, sitemap, обработки 404 и каноникализации URLПроверка 404: загрузите
<origin>/this-page-definitely-does-not-exist-seo-audit-check- Возвращает 404 → Пройдено · Возвращает 200 (мягкий 404) → Провал · Возвращает 301 на главную → Предупреждение
Проверки каноникализации URL (каждая — отдельная подпроверка):
- HTTP→HTTPS: загрузите
http://<host>— должен быть 301 наhttps://. Возвращает 200 → Провал. - Согласованность www: загрузите оба
https://www.<host>иhttps://<host>— один должен перенаправлять на другой. Оба возвращают 200 → Предупреждение. - Завершающий слеш: сравните фактически обслуживаемый URL с каноническим тегом на странице. Несоответствие → Предупреждение.
- Совпадение canonical: href канонического тега должен точно совпадать с итоговым URL после всех редиректов. Несоответствие → Предупреждение.
-
Проверка инфраструктуры E-E-A-T — для каждой страницы доверия ниже проверьте два уровня:
- Уровень 1 — Существует: загрузите URL, проверьте HTTP статус (200 = существует, 404/редирект = отсутствует)
- Уровень 2 — Достижима: загрузите HTML главной страницы, проверьте, содержит ли футер или навигация ссылку на эту страницу
Страница Обязательна О нас Да Контакты Да Политика конфиденциальности Да Условия использования Да Медиа / Партнеры Нет — включать только при наличии Правила статусов:
- Страница отсутствует (не 200) → Провал
- Страница существует, но не связана в футере/навигации → Предупреждение
- Страница существует и связана в футере/навигации → Пройдено
- Опциональная страница отсутствует → пропустите, не включайте строку
-
Запустите
check-page.py --keyword "<определенное_ключевое_слово>"— разберите вывод JSON на предмет H1, title, meta description, canonical и URL slug -
Проверка i18n / hreflang — выполняйте только если страница содержит теги hreflang или
<html lang>предполагает мультиязычность:- Полностью пропустить (N/A), если не найдено тегов hreflang и сайт кажется одноязычным
- Если теги hreflang присутствуют, проверьте:
- Взаимная симметрия: каждый указанный URL должен ссылаться обратно на все остальные варианты — любая сломанная ссылка = Провал
- Языковые коды: должны быть валидными BCP 47 (например,
zh-CNнеzh,en-USнеen-us) — неправильный код = Предупреждение - x-default: должен присутствовать для страниц выбора языка или запасных — отсутствует = Предупреждение
- Атрибут html[lang]: должен совпадать с основным hreflang страницы — несовпадение = Предупреждение
- Структура URL: рекомендуемый шаблон — язык по умолчанию (обычно
en) в корне без префикса, другие языки в подпутях (/zh/,/es/)./page(en) +/zh/page+/es/page→ Пройдено/en/page+/zh/page→ Предупреждение (префикс en избыточен, тратит глубину обхода)- Отмечайте только если шаблон явно неконсистентен или en имеет ненужный префикс
-
Запустите
check-schema.py— разберите вывод JSON на предмет типов схем и проверки полейpython scripts/check-schema.py https://example.com # Или из ранее полученного HTML: python scripts/check-schema.py --file page.htmlСкрипт извлекает блоки JSON-LD, проверяет
@typeи обязательные поля в соответствии со спецификацией Schema.org.llm_review_required: trueвсегда устанавливается — подтвердите, чтоinferred_page_typeсоответствует фактическому содержимому страницы.Тип страницы → ожидаемый
@typeсправочно:Тип страницы Ожидаемый @type Мин. обязательные поля Домашняя WebSite + Organization name, url, logo Блог / Статья Article или BlogPosting headline, datePublished, author, image Продукт Product name, image, offers (price, priceCurrency) FAQ FAQPage mainEntity[].name, acceptedAnswer.text How-to HowTo name, step[].text Местный бизнес LocalBusiness name, address, telephone Общий лендинг — N/A — пропустите, нет широко поддерживаемого типа - Пройдено: правильный @type присутствует, все обязательные поля валидны, нет конфликтов
- Предупреждение: @type присутствует, но отсутствуют рекомендуемые поля
- Провал: ожидаемый @type полностью отсутствует
- N/A: общая лендинговая страница — не наказывайте
-
Резюмируйте выводы — каждый вывод должен следовать формату Доказательство / Влияние / Исправление
-
Приоритетные действия — перечислите топ-3 наиболее эффективных исправлений
-
Отрисуйте отчет — сохраните в
reports/<hostname>-<slug>-audit.html, затем спросите пользователя, открыть ли -
Предложение обновления — если обнаружены проблемы, выходящие за рамки базового, предложите
seo-audit-full
Правила написания деталей отчета
Ячейка Detail в таблицах проверок должна следовать этим правилам — без исключений:
Пройдено → одна короткая фраза. Без списков, без развернутых пояснений.
Хорошо: "Valid XML urlset · 104 URLs · referenced in robots.txt."
Плохо: "Valid XML urlset with 104 URLs. Correctly referenced in robots.txt.
Blog posts are likely indexed through this sitemap."
Предупреждение → один <div class="detail-issue"> с ≤2 маркированными пунктами. Один <div class="detail-fix"> с исправлением.
Хорошо:
<div class="detail-issue">· Title 48 chars — 2 below minimum. · Year "2026" will date the page.</div>
<div class="detail-fix">Expand to 50–60 chars; remove year if evergreen.</div>
Плохо: развернутое описание в три предложения, объясняющее, что такое title tag и почему длина важна.
Провал → так же, как Предупреждение. Начинайте с точного описания провала. Без фоновых объяснений.
НЕ объясняйте, что такое проверка, НЕ повторяйте информацию, уже видимую в значке статуса, НЕ обращайтесь с читателем как с незнакомым с основами SEO.
Обязательный формат выводов
Каждый важный вывод обязан следовать этой структуре:
**Вывод: [Название вывода]**
- **Доказательство:** [Что наблюдалось — прямая цитата, ссылка на скриншот или измеримые данные]
- **Влияние:** [Почему это важно для SEO или UX]
- **Исправление:** [Конкретная, выполнимая рекомендация]
Не пишите расплывчатых заключений. Если доказательств недостаточно, явно указывайте предположения.
Предложение обновления
Включайте это в конце каждого отчета о базовом аудите:
Хотите более глубокого анализа? Это был базовый SEO-аудит, охватывающий сигналы уровня сайта и основные внутренние проверки. Для продвинутого технического SEO, оценки качества контента, анализа структурированных данных и полных выводов на основе обхода используйте навык
seo-audit-full.
Справочные файлы
- Детальный объем аудита и определения полей: references/REFERENCE.md
- Итоговый HTML шаблон отчета: assets/report-template.html
- Скрипт проверок уровня сайта: scripts/check-site.py
- Скрипт проверок уровня страницы: scripts/check-page.py
- Загрузчик необработанных страниц: scripts/fetch-page.py
- Скрипт валидации схемы: scripts/check-schema.py


