Библиотека · Маркетинг, продажи и аналитика на AI

SEO-машина — полный стек с Claude Code

Строитель65 минОбновлено: октябрь 2026
68 из 105 в библиотеке

Время: ~25 мин теории + 40 мин практики


Суть урока

SEO в 2026 году — это не просто "попасть в Google". Часть запросов теперь закрывают AI-ответы: пользователь спросил ChatGPT про агентство недвижимости в Куэнке — и ушёл с ответом, не заходя ни на один сайт. Новая игра: появляться и в Google, и в ответах AI. Claude Code позволяет автоматизировать почти весь стек — от keyword research до еженедельного аудита — при небольших расходах на токены.

🎨 Образ: SEO-машина — как сад который плодоносит годами. Посадил статью (немного токенов и около 30 минут времени) — она может приводить посетителей годами, если её обновлять. Чем больше посадил и чем лучше ухаживаешь — тем больше урожай.


Ключевые концепции

  • Google AI Overviews (раньше назывались SGE) — AI-блоки в выдаче Google; на часть информационных запросов они забирают клики у обычных результатов
  • AEO (Answer Engine Optimization) — оптимизация под AI-ответы (ChatGPT, Claude, Gemini, Perplexity)
  • Keyword Gap — ключевые слова по которым ранжируется конкурент, но не ты
  • Schema Markup — машиночитаемая разметка, помогает AI понять о чём страница
  • Core Web Vitals — скорость и стабильность страницы, фактор ранжирования Google
  • searchfit-seo:* — плагин с SEO-навыками для Claude Code (ставится через /plugin)

Теория

SEO в 2026 — что изменилось с AI

До 2024 задача была одна: попасть на первую страницу Google. В 2026 картина сложнее.

🎨 Образ: раньше SEO — попасть на витрину магазина. Покупатель шёл по улице, заходил, смотрел. Теперь у покупателей появился персональный консультант (AI) который заходит на все витрины сам, делает выборку и приносит покупателю уже готовый ответ. Твоя задача — чтобы этот консультант тебя рекомендовал.

Что изменилось:

Было (до 2024) Стало (2026)
Цель: позиция 1-3 в Google Цель: позиция в Google + упоминание в AI-ответах
Трафик = клики из поисковика Трафик = клики из поисковика + бренд-запросы после AI
Ключевые слова → статьи Вопросы и ответы → авторитет источника
Ссылочная масса = рейтинг Ссылочная масса + упоминания в авторитетных источниках
Технический SEO Технический SEO + структурированные данные

Google AI Overviews (раньше SGE) показывается над обычными результатами на часть информационных запросов; доля зависит от темы, региона и языка. Если ты не среди источников в AI Overview, трафика с таких запросов становится меньше.

ChatGPT, Claude, Gemini чаще опираются на источники которые:

  • Часто цитируются в авторитетных материалах
  • Имеют чёткую структуру вопрос-ответ
  • Используют Schema Markup (Article и другие типы)
  • Имеют хороший технический SEO

Какую роль разметка играет у каждого AI-сервиса, они официально не раскрывают. Считай её хорошей гигиеной, а не рычагом с гарантированным эффектом.

AEO vs SEO — не противоречат, дополняют друг друга. Хорошая SEO-статья = хорошая AEO-статья при правильной структуре.


Ключевые инструменты стека

Плагин searchfit-seo добавляет в Claude Code готовые SEO-навыки. Ставится через /plugin из marketplace; список ниже дан на октябрь 2026:

bash
# Навыки плагина searchfit-seo (ставятся через /plugin из marketplace):
# searchfit-seo:seo-audit          — полный аудит сайта
# searchfit-seo:keyword-clustering  — группировка ключевых слов
# searchfit-seo:content-brief       — техзадание для статьи
# searchfit-seo:on-page-seo         — оптимизация страницы
# searchfit-seo:schema-markup       — разметка для AI и Google
# searchfit-seo:ai-visibility       — проверка видимости в AI-ответах
# searchfit-seo:content-strategy   — контент-стратегия
# searchfit-seo:internal-linking    — стратегия внутренних ссылок
# searchfit-seo:technical-seo       — технический аудит

# Внешние инструменты (через API):
# Google Search Console API — позиции, клики, впечатления (бесплатно)
# Ahrefs API                — ключевые слова конкурентов (платно, цены на сайте)
# Google PageSpeed API      — Core Web Vitals (бесплатно)

Для старта достаточно Google Search Console (бесплатно) + searchfit-seo skills. Ahrefs добавляешь когда масштабируешься.


Keyword Research автоматически

Находим где деньги лежат — ключевые слова с трафиком и коммерческим интентом.

python
import anthropic
import os
import json

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

def find_keyword_opportunities(topic: str, our_domain: str) -> dict:
    """
    Анализирует keyword opportunities для заданной темы.
    Без Ahrefs API — использует только Claude для генерации гипотез.
    С Ahrefs API — добавляешь реальные объёмы (см. комментарий ниже).
    """
    
    response = "".join(b.text for b in client.messages.create(
        model="claude-sonnet-5-5",
        max_tokens=3000,
        messages=[{
            "role": "user",
            "content": f"""Проведи keyword research для темы: "{topic}"
            Домен: {our_domain}
            
            Задача: найти 30 ключевых слов с коммерческим потенциалом.
            
            Разбей по категориям:
            
            1. ТРАНЗАКЦИОННЫЕ (люди хотят купить/заказать):
               Примеры: "купить квартиру Куэнка", "агентство недвижимости Эквадор"
               
            2. ИНФОРМАЦИОННЫЕ (люди ищут информацию):
               Примеры: "как купить недвижимость в Эквадоре иностранцу", "жизнь в Куэнке отзывы"
               
            3. НАВИГАЦИОННЫЕ (люди ищут конкретный бренд/сайт):
               Примеры: "Acme Realty недвижимость", "агентство Куэнка русские"
               
            4. LONG-TAIL (длинный хвост, меньше конкуренции):
               Примеры: "как купить квартиру в Куэнке пенсионеру из России", "районы Куэнки где живут русские"
            
            Для каждого ключевого слова оцени:
            - Предполагаемый объём запросов (низкий/средний/высокий)
            - Уровень конкуренции (низкий/средний/высокий)
            - Коммерческий потенциал (1-5)
            - Тип контента для создания (статья/FAQ/гид/сравнение)
            
            Формат ответа: JSON список объектов:
            {{
              "keyword": "...",
              "category": "транзакционное/информационное/навигационное/long-tail",
              "estimated_volume": "низкий/средний/высокий",
              "competition": "низкий/средний/высокий",
              "commercial_potential": 1-5,
              "content_type": "...",
              "priority": "high/medium/low"
            }}
            
            Верни только валидный JSON массив."""
        }]
    ).content if b.type == "text")
    
    keywords = json.loads(response)
    
    # Фильтруем приоритетные возможности
    high_priority = [k for k in keywords if k["priority"] == "high"]
    
    print(f"Всего ключевых слов: {len(keywords)}")
    print(f"Приоритетных (high): {len(high_priority)}")
    print("\nТоп-10 по приоритету:")
    for i, kw in enumerate(high_priority[:10], 1):
        print(f"  {i}. {kw['keyword']} | потенциал: {kw['commercial_potential']}/5 | конкуренция: {kw['competition']}")
    
    return {"all": keywords, "high_priority": high_priority}


def find_keyword_gap(our_keywords: list, competitor_keywords: list) -> list:
    """
    Находит ключевые слова которые есть у конкурента, но нет у нас.
    our_keywords / competitor_keywords — списки строк (ключевых слов).
    """
    
    response = "".join(b.text for b in client.messages.create(
        model="claude-sonnet-5-5",
        max_tokens=2000,
        messages=[{
            "role": "user",
            "content": f"""Проведи keyword gap анализ.
            
            Наши ключевые слова: {json.dumps(our_keywords[:50], ensure_ascii=False)}
            Ключевые слова конкурента: {json.dumps(competitor_keywords[:50], ensure_ascii=False)}
            
            Найди:
            1. Топ-20 ключевых слов конкурента которых нет у нас — приоритизируй по коммерческому интенту
            2. Быстрые победы: наши слова где позиции 11-30 (можно поднять в топ-10 за 2-4 недели)
            3. Общие слова: где мы конкурируем напрямую — сравни потенциальные позиции
            
            Формат: JSON с тремя массивами:
            {{
              "gap_keywords": [{{"keyword": "...", "why_valuable": "...", "urgency": "high/medium"}}],
              "quick_wins": [{{"keyword": "...", "current_position_estimate": "11-30", "action": "..."}}],
              "competitive": [{{"keyword": "...", "our_advantage": "...", "their_advantage": "..."}}]
            }}"""
        }]
    ).content if b.type == "text")
    
    return json.loads(response)


# Пример использования
if __name__ == "__main__":
    # Базовый keyword research без API
    opportunities = find_keyword_opportunities(
        topic="недвижимость в Эквадоре для русскоязычных",
        our_domain="acme-realty.example"
    )
    
    # Сохраняем для дальнейшей работы
    with open("keyword-research.json", "w", encoding="utf-8") as f:
        json.dump(opportunities, f, ensure_ascii=False, indent=2)
    
    print("\nРезультаты сохранены в keyword-research.json")

Content Brief за 5 минут

Вместо написания технических заданий вручную — Claude делает это автоматически.

Используй searchfit-seo:content-brief skill напрямую из Claude Code:

Напиши в чат
Claude, используй searchfit-seo:content-brief skill.

Тема: "купить квартиру в Куэнке Эквадор"
Наша аудитория: русскоязычные инвесторы и эмигранты 35-55 лет
Конкуренты для анализа: [URL статьи конкурента 1, URL статьи конкурента 2]

Дай полный контент-бриф:
- Основное ключевое слово и LSI-ключевые слова
- Заголовок H1 (clickable, с ключевым словом)
- Структура статьи (H2, H3 с описанием содержания каждого раздела)
- Что есть у конкурентов но чего не хватает (наш competitive advantage)
- Рекомендуемая длина (слов)
- Schema markup тип (Article / FAQ / HowTo / LocalBusiness)
- CTA в конце статьи

Или через Python для автоматизации в потоке:

python
def generate_content_brief(keyword: str, audience: str, competitor_urls: list) -> str:
    """Генерирует контент-бриф для конкретного ключевого слова"""
    
    response = "".join(b.text for b in client.messages.create(
        model="claude-sonnet-5-5",
        max_tokens=2500,
        messages=[{
            "role": "user",
            "content": f"""Создай контент-бриф для SEO-статьи.
            
            Целевое ключевое слово: "{keyword}"
            Аудитория: {audience}
            Конкуренты: {', '.join(competitor_urls) if competitor_urls else 'не указаны'}
            
            Бриф должен включать:
            
            ## Ключевые слова
            - Основное: {keyword}
            - LSI (семантически связанные): [список 10-15 слов]
            - Long-tail вариации: [список 5-7 фраз]
            
            ## Заголовок H1
            [Кликабельный заголовок с основным ключевым словом, 50-60 символов]
            
            ## Meta Description
            [155 символов, включает ключевое слово, призыв к действию]
            
            ## Структура статьи
            [H2 блок 1 — название]
            - Что включить: ...
            - Примерная длина: ... слов
            
            [H2 блок 2 — название]
            ...
            
            ## FAQ раздел
            [5-7 вопросов которые реально задают люди на эту тему]
            
            ## Рекомендации
            - Длина: ... слов
            - Schema markup: ...
            - Тип контента: статья/гид/сравнение/FAQ
            - Уникальный угол (что отличает нас от конкурентов): ...
            
            Пиши на русском языке."""
        }]
    ).content if b.type == "text")
    
    return response


# Генерируем брифы для топ-5 приоритетных ключевых слов
priority_keywords = [
    "купить квартиру в Куэнке",
    "жизнь в Эквадоре для русских",
    "недвижимость Эквадор инвестиции",
    "переезд в Куэнку из России",
    "стоимость жизни в Куэнке 2026",
]

for kw in priority_keywords:
    brief = generate_content_brief(
        keyword=kw,
        audience="русскоязычные 35-55 лет, рассматривают переезд или инвестиции",
        competitor_urls=[]
    )
    
    # Сохраняем каждый бриф в отдельный файл
    filename = kw.replace(" ", "-").replace("/", "-") + ".md"
    with open(f"briefs/{filename}", "w", encoding="utf-8") as f:
        f.write(f"# Контент-бриф: {kw}\n\n")
        f.write(brief)
    
    print(f"Бриф создан: briefs/{filename}")

Schema Markup автоматически

Schema.org разметка помогает поисковикам понять структуру контента. Попадание в расширенные результаты или в AI Overviews она не гарантирует.

python
def add_schema_markup(page_content: str, page_type: str, business_info: dict) -> str:
    """
    Генерирует JSON-LD Schema markup для страницы.
    
    page_type: "article" / "faq" / "local_business" / "howto" / "product"
    business_info: словарь с данными о бизнесе (название, адрес, телефон, и т.д.)
    """
    
    schema_prompt = f"""
    Создай JSON-LD schema.org разметку для страницы.
    
    Тип страницы: {page_type}
    Данные бизнеса: {json.dumps(business_info, ensure_ascii=False)}
    
    Контент страницы (первые 1500 символов):
    {page_content[:1500]}
    
    Требования:
    1. Используй наиболее подходящий тип schema.org
    2. Заполни все обязательные поля (required properties)
    3. Добавь рекомендуемые поля (recommended properties) где возможно
    4. Для FAQ страниц: добавь FAQPage schema с реальными вопросами из контента
    5. Для статей: добавь Article schema с автором и датой публикации
    6. Для локального бизнеса: добавь LocalBusiness + GeoCoordinates
    7. Для инструкций: добавь HowTo schema с пошаговыми шагами
    
    Верни только валидный JSON-LD объект (без markdown блоков).
    """
    
    schema_json = "".join(b.text for b in client.messages.create(
        model="claude-sonnet-5-5",
        max_tokens=2000,
        messages=[{"role": "user", "content": schema_prompt}]
    ).content if b.type == "text").strip()
    
    # Оборачиваем в тег для вставки в HTML
    html_tag = f'<script type="application/ld+json">\n{schema_json}\n</script>'
    
    return html_tag


# Пример: Schema для агентства недвижимости
business_info = {
    "name": "Acme Realty",
    "url": "https://acme-realty.example",
    "telephone": "+593-XX-XXX-XXXX",
    "address": {
        "city": "Cuenca",
        "country": "Ecuador"
    },
    "description": "Агентство недвижимости в Куэнке для русскоязычных",
    "languages": ["ru", "es"],
    "priceRange": "$$"
}

faq_page_content = """
Сколько стоит квартира в Куэнке? [ответ с реальными цифрами от агентства]...
Как иностранцу купить недвижимость в Эквадоре? [ответ, проверенный юристом]...
Нужна ли виза для покупки недвижимости? [ответ, проверенный юристом]...
"""

schema_html = add_schema_markup(
    page_content=faq_page_content,
    page_type="faq",
    business_info=business_info
)

print("Schema markup создан:")
print(schema_html[:500] + "...")

Что изменилось в расширенных результатах. Расширенные результаты HowTo Google убрал в 2023 году, а расширенные результаты FAQ перестали показываться с 7 мая 2026 (так написано в документации Google Search Central). Сама разметка FAQPage и HowTo остаётся допустимой: она описывает структуру страницы для машин, но «раскрывающихся вопросов» в выдаче от неё ждать не стоит. Проверяй разметку на валидность и не строй на ней ожидания по трафику.


AI Visibility — появляться в ответах AI

AEO — молодая дисциплина. Цель: когда пользователь спрашивает ChatGPT или Claude про твою тему — ты в ответе.

Используй searchfit-seo:ai-visibility skill:

Напиши в чат
Claude, используй searchfit-seo:ai-visibility skill.

Наш сайт: acme-realty.example
Тема: недвижимость для русскоязычных в Эквадоре

Проверь нашу видимость в AI-ответах для этих запросов:
- "Как купить недвижимость в Эквадоре русскому гражданину"
- "Агентство недвижимости Куэнка на русском языке"
- "Жизнь в Эквадоре для русских: где жить"
- "Безопасно ли покупать недвижимость в Эквадоре"

Дай:
1. Текущий уровень AI-видимости (появляемся ли в ответах)
2. Что мешает AI нас рекомендовать
3. Конкретные изменения для улучшения AI-видимости:
   - Какие страницы добавить или переработать
   - Какую разметку добавить
   - Какой формат контента предпочитают AI-движки
4. Приоритет действий (что сделать в первую очередь)

Или через код для регулярного мониторинга. Это упрощённая проверка: Claude отвечает по памяти, без поиска в вебе, поэтому реальные ответы ChatGPT, Gemini, Perplexity и Google AI Mode скрипт не воспроизводит. Для настоящего замера открывай эти сервисы сам или возьми инструмент для мониторинга AI-видимости (например, Peec AI или OtterlyAI; цены и условия смотри на их сайтах).

python
def check_ai_visibility(brand_name: str, topics: list, test_queries: list) -> dict:
    """
    Проверяет насколько бренд упоминается в AI-ответах.
    Симулирует ответы AI на заданные запросы и ищет упоминания бренда.
    """
    
    results = {}
    
    for query in test_queries:
        # Симулируем ответ AI на запрос (без реального запроса к ChatGPT)
        response = "".join(b.text for b in client.messages.create(
            model="claude-sonnet-5-5",
            max_tokens=1000,
            system=f"""Ты — поисковый AI-ассистент который отвечает на вопросы пользователей.
                       Отвечай на основе реально существующей информации в интернете.
                       Если рекомендуешь конкретные ресурсы или компании — объясни почему.""",
            messages=[{
                "role": "user",
                "content": query
            }]
        ).content if b.type == "text")
        
        # Проверяем упоминается ли наш бренд
        brand_mentioned = brand_name.lower() in response.lower()
        
        # Анализируем что рекомендуется
        analysis = "".join(b.text for b in client.messages.create(
            model="claude-haiku-4-5",  # лёгкая модель для простой разметки ответа; актуальные названия моделей: страница «Актуальное сейчас»
            max_tokens=300,
            messages=[{
                "role": "user",
                "content": f"""Запрос пользователя: "{query}"
                
                AI-ответ: {response[:800]}
                
                Наш бренд: {brand_name}
                
                Ответь:
                1. Упоминается ли наш бренд? (да/нет)
                2. Кто/что рекомендуется? (перечисли)
                3. Почему эти источники упоминаются? (одна фраза)
                4. Что нам нужно сделать чтобы попасть в такой ответ? (одна фраза)
                
                Формат: JSON {{
                    "mentioned": true/false,
                    "recommended": ["...", "..."],
                    "why_they_rank": "...",
                    "our_action": "..."
                }}"""
            }]
        ).content if b.type == "text")
        
        results[query] = {
            "brand_mentioned": brand_mentioned,
            "analysis": json.loads(analysis)
        }
    
    # Общий вывод
    mention_rate = sum(1 for r in results.values() if r["brand_mentioned"]) / len(results)
    
    print(f"\nAI Visibility Report для {brand_name}:")
    print(f"Упоминаемость в AI-ответах: {mention_rate:.0%} ({sum(1 for r in results.values() if r['brand_mentioned'])}/{len(results)} запросов)")
    print("\nПо каждому запросу:")
    for query, data in results.items():
        status = "УПОМИНАЕМСЯ" if data["brand_mentioned"] else "не упоминаемся"
        print(f"  [{status}] {query[:60]}...")
    
    return results


# Пример использования
visibility = check_ai_visibility(
    brand_name="Acme Realty",
    topics=["недвижимость Эквадор", "Куэнка жилье"],
    test_queries=[
        "Как купить квартиру в Куэнке иностранцу?",
        "Агентство недвижимости в Куэнке для русских",
        "Безопасно ли покупать недвижимость в Эквадоре в 2026",
    ]
)

Автоматический SEO-аудит каждую неделю

Вместо ручной проверки раз в месяц — автоматический аудит каждый понедельник.

python
#!/usr/bin/env python3
# weekly-seo-audit.py — запускать через cron каждый понедельник

import anthropic
import requests
import json
import os
from datetime import datetime, timedelta

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

# Google Search Console API (требует настройки OAuth 2.0)
GSC_PROPERTY = os.environ.get("GSC_PROPERTY", "https://acme-realty.example/")


def get_gsc_data(days_back: int = 28) -> dict:
    """
    Получает данные из Google Search Console через API.
    Требует: google-auth-oauthlib, google-api-python-client
    pip install google-auth-oauthlib google-api-python-client
    
    Если нет настроенного GSC — возвращает заглушку для демо.
    """
    try:
        from google.oauth2.credentials import Credentials
        from googleapiclient.discovery import build
        
        creds = Credentials.from_authorized_user_file(
            os.environ.get("GSC_CREDENTIALS_FILE", "gsc-credentials.json")
        )
        service = build("searchconsole", "v1", credentials=creds)
        
        end_date = datetime.now().strftime("%Y-%m-%d")
        start_date = (datetime.now() - timedelta(days=days_back)).strftime("%Y-%m-%d")
        
        request = {
            "startDate": start_date,
            "endDate": end_date,
            "dimensions": ["query", "page"],
            "rowLimit": 100,
            # строки API отдаёт по убыванию кликов, отдельная сортировка не нужна
        }
        
        response = service.searchanalytics().query(
            siteUrl=GSC_PROPERTY, body=request
        ).execute()
        
        return response.get("rows", [])
    
    except Exception as e:
        # Демо-данные если GSC не настроен
        print(f"GSC не настроен ({e}). Используем демо-данные.")
        return [
            {"keys": ["купить квартиру куэнка", "acme-realty.example/"], "clicks": 45, "impressions": 890, "ctr": 0.051, "position": 8.2},
            {"keys": ["недвижимость эквадор русские", "acme-realty.example/blog/"], "clicks": 23, "impressions": 560, "ctr": 0.041, "position": 12.5},
            {"keys": ["жизнь куэнка отзывы", "acme-realty.example/blog/life/"], "clicks": 18, "impressions": 340, "ctr": 0.053, "position": 6.1},
        ]


def check_page_speed(url: str) -> dict:
    """Проверяет Core Web Vitals через Google PageSpeed Insights API (бесплатно)"""
    api_key = os.environ.get("PAGESPEED_API_KEY", "")
    
    params = {
        "url": url,
        "strategy": "mobile",  # mobile важнее для Google
    }
    if api_key:
        params["key"] = api_key
    
    try:
        response = requests.get(
            "https://www.googleapis.com/pagespeedonline/v5/runPagespeed",
            params=params,
            timeout=30
        )
        data = response.json()
        
        # Извлекаем основные метрики
        metrics = data.get("lighthouseResult", {}).get("audits", {})
        return {
            "lcp": metrics.get("largest-contentful-paint", {}).get("displayValue", "N/A"),
            "cls": metrics.get("cumulative-layout-shift", {}).get("displayValue", "N/A"),
            "tbt": metrics.get("total-blocking-time", {}).get("displayValue", "N/A"),  # в лаборатории вместо INP
            "score": data.get("lighthouseResult", {}).get("categories", {}).get("performance", {}).get("score", 0) * 100,
        }
    except Exception as e:
        return {"error": str(e)}


def run_weekly_audit(site_url: str, report_dir: str = "reports/seo") -> str:
    """Запускает полный еженедельный SEO-аудит"""
    
    today = datetime.now().strftime("%Y-%m-%d")
    os.makedirs(report_dir, exist_ok=True)
    
    print(f"Запускаю SEO-аудит для {site_url} ({today})")
    
    # 1. Данные из GSC
    print("  Получаю данные Google Search Console...")
    gsc_data = get_gsc_data(days_back=28)
    
    # 2. Core Web Vitals
    print("  Проверяю Core Web Vitals...")
    speed_data = check_page_speed(site_url)
    
    # 3. Claude анализирует всё и даёт рекомендации
    print("  Анализирую через Claude...")
    
    analysis = "".join(b.text for b in client.messages.create(
        model="claude-sonnet-5-5",
        max_tokens=3000,
        messages=[{
            "role": "user",
            "content": f"""Проведи анализ SEO-данных и дай рекомендации.

Сайт: {site_url}
Дата: {today}

Google Search Console (топ запросы за 28 дней):
{json.dumps(gsc_data[:20], ensure_ascii=False, indent=2)}

Core Web Vitals:
{json.dumps(speed_data, ensure_ascii=False, indent=2)}

Проведи анализ:

## 1. Быстрые победы (сделать за 1-2 недели)
Запросы где позиция 11-30 и есть шанс подняться в топ-10.
Для каждого: что конкретно сделать (переписать заголовок? добавить раздел? улучшить внутренние ссылки?)

## 2. Падение позиций
Если видишь высокий CTR при низкой позиции — страница релевантна но не ранжируется.
Что делать?

## 3. Техническое
Core Web Vitals — есть ли критические проблемы со скоростью?
Что починить в первую очередь?

## 4. Контентные возможности
Какие темы стоит осветить судя по данным GSC?
Какие запросы имеют много показов но мало кликов (проблема заголовка или meta)?

## 5. Приоритетный план на неделю
Топ-5 конкретных задач с оценкой времени (часов).

Пиши на русском. Конкретно, без воды."""
        }]
    ).content if b.type == "text")
    
    # 4. Сохраняем отчёт
    report_path = f"{report_dir}/seo-{today}.md"
    with open(report_path, "w", encoding="utf-8") as f:
        f.write(f"# SEO-аудит {today}\n\n")
        f.write(f"**Сайт:** {site_url}\n\n")
        f.write(f"**Core Web Vitals (mobile):** LCP {speed_data.get('lcp', 'N/A')} | Score {speed_data.get('score', 'N/A')}/100\n\n")
        f.write("---\n\n")
        f.write(analysis)
    
    print(f"\nОтчёт сохранён: {report_path}")
    return analysis


# Запуск
if __name__ == "__main__":
    run_weekly_audit(
        site_url="https://acme-realty.example",
        report_dir="reports/seo"
    )

Добавляем в cron для автозапуска:

bash
# Crontab: запуск каждый понедельник в 09:00
# crontab -e  →  добавить строку:
0 9 * * 1 cd /path/to/project && python weekly-seo-audit.py >> logs/seo-audit.log 2>&1

# Или через Routines в Claude Code: задача по расписанию в облаке (команда /schedule).
# На октябрь 2026 это research preview на платных тарифах, условия смотри в документации Claude Code.

Калькулятор SEO: как прикинуть, стоит ли вкладываться

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

Шаг расчёта Допущение для примера
Запросов в месяц по выбранной фразе 500
Доля кликов (CTR) на выбранной позиции 28% (в жизни сильно зависит от запроса и от AI-блоков в выдаче)
Визитов в месяц 500 × 28% = 140
Конверсия сайта в заявку 3%
Заявок в месяц 140 × 3% ≈ 4
Доля заявок, дошедших до сделки 25%
Выручка агентства с одной сделки $3,000
Выручка в месяц с одной фразы при этих допущениях 4 × 25% × $3,000 = $3,000

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

🎨 Образ: AEO = быть экспертом которого спрашивают AI. Когда ChatGPT рекомендует тебя — ты в топе без единого клика на рекламу. Каждая хорошо написанная статья с правильной разметкой — это ещё один эксперт который работает на тебя 24/7.


Практика

Задание: запустить SEO-машину для реального сайта или тестового домена.

Шаг 1: Настроить Google Search Console (15 мин)

  • Зайди на search.google.com/search-console
  • Добавь свой сайт и верифицируй через DNS или HTML-файл
  • Подожди 2-3 дня чтобы накопились данные (или используй демо-данные скрипта)

Шаг 2: Keyword Research через Claude (10 мин)

bash
# Запусти скрипт keyword research
python keyword-research.py

# Открой keyword-research.json
# Выбери топ-3 приоритетных ключевых слова для первых статей

Шаг 3: Content Brief через searchfit-seo skill (5 мин)

Напиши в чат
# В Claude Code используй skill:
Claude, используй searchfit-seo:content-brief skill.
Тема: [твоё ключевое слово из шага 2]
Аудитория: [описание твоей аудитории]

Шаг 4: Schema Markup для главной страницы (10 мин)

bash
# Запусти скрипт schema markup
python add-schema.py --page-type local_business --url https://твой-сайт.com
# Скопируй полученный JSON-LD и вставь в <head> сайта

Шаг 5: Настроить еженедельный аудит (10 мин)

bash
# Настрой cron:
crontab -e
# Добавь строку:
0 9 * * 1 cd /path/to/project && python weekly-seo-audit.py

# Или запусти вручную для первого отчёта:
python weekly-seo-audit.py

Шаг 6: AI Visibility check (5 мин)

bash
# Проверь видимость в AI-ответах:
python check-ai-visibility.py

# Сравни с результатами через 4 недели после внедрения изменений

Результат: к концу практики у тебя есть список ключевых слов, первые контент-брифы, schema разметка и автоматический еженедельный аудит.


Инструменты и ресурсы

  • Google Search Console — бесплатная аналитика позиций и трафика
  • Google PageSpeed Insights API — Core Web Vitals (бесплатно)
  • Schema.org — справочник всех типов разметки
  • Rich Results Test — проверка schema разметки от Google
  • Ahrefs — платный инструмент для keyword gap (цены на сайте; для своего сайта есть бесплатный Ahrefs Webmaster Tools)
  • Screaming Frog — технический SEO-аудит (есть бесплатная версия с лимитом на число URL, подробности на сайте)
  • searchfit-seo:* — плагин с SEO-навыками и командами для Claude Code
  • Google Search Console Python API — официальная документация
  • Модели Claude — названия в коде даны на октябрь 2026; актуальные цены и версии: Актуальное сейчас

Ключевые выводы

SEO в 2026 — это двойная игра: Google + AI-движки. Техники разные, контент общий: структурированные ответы на реальные вопросы аудитории.

AEO (Answer Engine Optimization) — не замена SEO, а надстройка. Понятная структура вопрос-ответ и аккуратная Schema разметка повышают шансы попасть и в Google, и в ответы ChatGPT, Claude, Gemini, но гарантии не дают.

Автоматизация SEO-машины: keyword research (Claude) → content brief (5 мин) → статья → schema markup → еженедельный аудит (автоматически). После настройки рутина идёт сама, но отчёты и тексты всё равно нужно читать и проверять.

Отдача от SEO приходит не сразу: обычно это месяцы, не дни, и она зависит от ниши, конкуренции и качества материалов. Гарантий позиций нет. Зато хорошая статья, которую обновляют, остаётся работающим активом.


Следующий урок

→ AI Реклама — генерация креативов, A/B тесты, умные ставки

Отметка хранится только в этом браузере и никуда не отправляется. Мой прогресс