Налаштування автоматичної перевірки індексації нових сторінок
Нова сторінка опублікована — це не значить що 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 та значно прискорює індексацію.
Налаштування сервісного аккаунту:
- Google Cloud Console → IAM → Service Accounts → Create
- Створити ключ JSON
- У 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 днів.







