Налаштування автоматичної перевірки індексації нових сторінок

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування автоматичної перевірки індексації нових сторінок
Середня
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування автоматичної перевірки індексації нових сторінок

Нова сторінка опублікована — це не значить що Google її знайшов. Бот може обійти її через 3 години, а може через 3 тижні: залежить від crawl budget, структури sitemap, частоти оновлень. Ручна перевірка через "site:" або GSC не масштабується: при публікації 50+ сторінок в місяць потрібна автоматизація.

Завдання системи: при появленні нової сторінки — відправити на індексацію, дочекатися підтвердження, зафіксувати в логі, уведомити при проблемах.

Рівень 1: Sitemap + Ping

Мінімальний варіант — автоматичне оновлення sitemap.xml та пінг поисковиків при додаванні нової сторінки.

Ping-endpoint Google:

https://www.google.com/ping?sitemap=https://example.com/sitemap.xml

Викликається GET-запитом. Можна вбудувати в деплой або хук публікації CMS:

import requests

def notify_google_sitemap(sitemap_url: str) -> bool:
    ping_url = f"https://www.google.com/ping?sitemap={sitemap_url}"
    resp = requests.get(ping_url, timeout=10)
    return resp.status_code == 200

Для WordPress — плагіни Yoast/RankMath роблять це автоматично. На кастомних CMS — хук в подію post_published.

Sitemap з lastmod:

<url>
  <loc>https://example.com/new-page/</loc>
  <lastmod>2024-11-15T10:30:00+03:00</lastmod>
  <changefreq>weekly</changefreq>
  <priority>0.8</priority>
</url>

lastmod повинен оновлюватися при кожній зміні сторінки — іначе Google ігнорує як статичний.

Рівень 2: Google Indexing API

Офіційний спосіб форсувати перевірку індексації. Спочатку тільки для сторінок з розміткою JobPosting/BroadcastEvent, але на практиці працює для будь-яких URL та значно прискорює індексацію.

Налаштування сервісного аккаунту:

  1. Google Cloud Console → IAM → Service Accounts → Create
  2. Створити ключ JSON
  3. У GSC додати сервісний аккаунт як Owner (не Viewer — повертає 403)

Код уведомлення:

from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/indexing']
KEY_FILE = 'service-account-key.json'

credentials = service_account.Credentials.from_service_account_file(
    KEY_FILE, scopes=SCOPES
)
service = build('indexing', 'v3', credentials=credentials)

def request_indexing(url: str, update_type: str = 'URL_UPDATED') -> dict:
    """update_type: URL_UPDATED | URL_DELETED"""
    response = service.urlNotifications().publish(
        body={
            'url': url,
            'type': update_type
        }
    ).execute()
    return response

# Результат містить urlNotificationMetadata
# {'url': 'https://...', 'latestUpdate': {...}, 'latestRemove': {...}}

Batch-запити (до 100 URL за раз):

def batch_request_indexing(urls: list[str]) -> list:
    batch = service.new_batch_http_request()
    results = []

    def callback(request_id, response, exception):
        if exception:
            results.append({'url': request_id, 'error': str(exception)})
        else:
            results.append(response)

    for url in urls[:100]:  # Ліміт API
        batch.add(
            service.urlNotifications().publish(
                body={'url': url, 'type': 'URL_UPDATED'}
            ),
            request_id=url,
            callback=callback
        )

    batch.execute()
    return results

Квота: 200 запитів/день для звичайних сайтів. При необхідності — запит на розширення квоти у Google Search Console.

Рівень 3: Перевірка статусу індексації

Відправити запит — це половина завдання. Потрібно знати чи проіндексирована сторінка.

GSC URL Inspection API:

def check_indexing_status(site_url: str, page_url: str) -> dict:
    """
    site_url: 'https://example.com' — як зареєстрований у GSC
    page_url: повний URL сторінки
    """
    service = build('searchconsole', 'v1', credentials=credentials)

    result = service.urlInspection().index().inspect(
        body={
            'inspectionUrl': page_url,
            'siteUrl': site_url
        }
    ).execute()

    inspection = result.get('inspectionResult', {})
    index_status = inspection.get('indexStatusResult', {})

    return {
        'verdict': index_status.get('verdict'),           # PASS | FAIL | NEUTRAL
        'coverage_state': index_status.get('coverageState'),
        'last_crawl_time': index_status.get('lastCrawlTime'),
    }

Можливі значення coverageState:

  • Submitted and indexed — сторінка в індексі
  • Crawled - currently not indexed — бот обходив, але не додав
  • Discovered - currently not indexed — знайдена, але не обробленА
  • Excluded by 'noindex' tag — проблема на стороні сайту

Автоматизація: повний цикл

Схема процесу:

Публікація сторінки
       ↓
Webhook/cron триггер
       ↓
Додавання URL в чергу (Redis / БД)
       ↓
Worker: Indexing API → publish URL_UPDATED
       ↓
Cron через 48h: GSC Inspection API → check status
       ↓
Якщо не проіндексирована → повторна відправка + алерт
       ↓
Лог результатів

Таблиця моніторингу (PostgreSQL):

CREATE TABLE indexing_queue (
    id SERIAL PRIMARY KEY,
    url TEXT NOT NULL UNIQUE,
    submitted_at TIMESTAMPTZ,
    last_checked_at TIMESTAMPTZ,
    status VARCHAR(64),
    coverage_state TEXT,
    attempts INT DEFAULT 0,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Сторінки що потребують повторної перевірки
SELECT url, status, attempts
FROM indexing_queue
WHERE status NOT IN ('indexed', 'excluded')
  AND attempts < 5
  AND (last_checked_at IS NULL OR last_checked_at < NOW() - INTERVAL '48 hours')
ORDER BY created_at DESC;

Уведомлення в Telegram при проблемах:

async def send_telegram_alert(message: str, bot_token: str, chat_id: str):
    url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
    await httpx.AsyncClient().post(url, json={
        'chat_id': chat_id,
        'text': message,
        'parse_mode': 'HTML'
    })

# Використання
pages_not_indexed = get_pages_not_indexed_after_7_days()
if pages_not_indexed:
    msg = f"⚠️ {len(pages_not_indexed)} сторінок не проіндексовано за 7 днів:\n"
    msg += "\n".join(p.url for p in pages_not_indexed[:10])
    await send_telegram_alert(msg, BOT_TOKEN, CHAT_ID)

Інтеграція з CMS

WordPress — custom plugin з хуком publish_post:

add_action('publish_post', function(int $post_id) {
    $url = get_permalink($post_id);
    wp_schedule_single_event(time() + 60, 'submit_url_to_indexing_api', [$url]);
});

Laravel — через Events/Listeners:

class PageCreated
{
    public function __construct(public readonly Page $page) {}
}

class SubmitPageToGoogleIndexing implements ShouldQueue
{
    public function handle(PageCreated $event): void
    {
        $url = route('page.show', $event->page->slug);
        GoogleIndexingService::submit($url);
    }
}

Тривалість

Базова конфігурація (sitemap ping + Indexing API при публікації) — 1–2 робочих дні. Повнофункціональна система з моніторингом статусу, чергою повторних перевірок та алертами — 3–5 днів.