IT
🔍

Создание автоматизированного SEO-пайплайна с помощью API Google Search Console

USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。

Создание автоматизированного SEO-пайплайна с помощью API Google Search Console

Создание автоматизированного SEO-пайплайна с помощью API Google Search Console

API GSC входит в число самых ценных источников данных для SEO, предоставляемых бесплатно. Вместо ежедневной ручной проверки, мы рассмотрим, как автоматизировать сбор и анализ данных с помощью пайплайна.

Предварительная подготовка

monitor screengrab seo analytics seo analytics
  1. 1Проект в Google Cloud Console
  2. 2Создание сервисного аккаунта + загрузка JSON-ключа
  3. 3Активация API Google Search Console
  4. 4Добавление электронной почты сервисного аккаунта в качестве пользователя свойства в GSC

Шаг 1: Аутентификация сервисного аккаунта

ts
import { SignJWT } from "jose"

async function getAccessToken(saJson: string) {
  const key = JSON.parse(saJson)
  const now = Math.floor(Date.now() / 1000)
  const jwt = await new SignJWT({
    scope: "https://www.googleapis.com/auth/webmasters.readonly",
  })
    .setProtectedHeader({ alg: "RS256", typ: "JWT" })
    .setIssuer(key.client_email)
    .setAudience("https://oauth2.googleapis.com/token")
    .setIssuedAt(now)
    .setExpirationTime(now + 3600)
    .sign(await importPrivateKey(key.private_key))

  const res = await fetch("https://oauth2.googleapis.com/token", {
    method: "POST",
    body: new URLSearchParams({
      grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
      assertion: jwt,
    }),
  })
  const { access_token } = await res.json()
  return access_token
}

Шаг 2: Запрос данных о производительности

ts
async function queryGSC(token: string, siteUrl: string) {
  const url = `https://searchconsole.googleapis.com/webmasters/v3/sites/${encodeURIComponent(siteUrl)}/searchAnalytics/query`

  const body = {
    startDate: "2026-03-25",
    endDate: "2026-04-21",
    dimensions: ["query", "page"],
    rowLimit: 1000,
  }

  const res = await fetch(url, {
    method: "POST",
    headers: { Authorization: `Bearer ${token}` },
    body: JSON.stringify(body),
  })
  return res.json()
}

Шаг 3: Автоматизированный пайплайн (CF Workers + D1)

ts
// Запуск каждый день в 3 часа ночи
export default {
  async scheduled(event: ScheduledEvent, env: Env) {
    const token = await getAccessToken(env.GSC_SA_JSON)
    const data = await queryGSC(token, env.GSC_SITE_URL)

    // Сохранение в D1
    for (const row of data.rows) {
      await env.DB.prepare(
        "INSERT INTO gsc_daily (date, query, page, clicks, impressions, ctr, position) VALUES (?, ?, ?, ?, ?, ?, ?)"
      ).bind(new Date().toISOString().slice(0, 10), row.keys[0], row.keys[1], row.clicks, row.impressions, row.ctr, row.position).run()
    }
  },
}

wrangler.toml:

toml
[triggers]
crons = ["0 18 * * *"]  # Каждый день в 03:00 по KST

Шаг 4: Автоматизация уведомлений

ts
// Обнаружение резкого падения по ключевым словам
const sql = `
  SELECT query, SUM(clicks) as recent_clicks,
    (SELECT SUM(clicks) FROM gsc_daily WHERE query=g.query AND date BETWEEN DATE(?, '-14 days') AND DATE(?, '-8 days')) as prev_clicks
  FROM gsc_daily g
  WHERE date >= DATE(?, '-7 days')
  GROUP BY query
  HAVING prev_clicks > 10 AND recent_clicks < prev_clicks * 0.5
`
const dropped = await env.DB.prepare(sql).bind(today, today, today).all()

if (dropped.results.length > 0) {
  await fetch(telegramUrl, {
    method: "POST",
    body: JSON.stringify({
      chat_id: env.CHAT_ID,
      text: `Обнаружено ${dropped.results.length} ключевых слов с резким падением`,
    }),
  })
}

Сценарии использования

  1. 1Автоматический сбор ежедневной производительности: Сохранение в D1 позволяет анализировать тренды
  2. 2Раннее обнаружение проблем с индексацией: Уведомления при резком падении показов
  3. 3Поиск ключевых слов с потенциалом: Автоматический вывод ключевых слов с позицией 11-20 (вторая страница) → приоритет переписывания
  4. 4Рейтинг производительности страниц: Автоматическая отчетность по топ-страницам на основе кликов

Бесплатная квота

  • Базовые 50,000 запросов в день (на проект)
  • Практически неограниченное использование

💡 Практические инсайты

Другие блоги часто ограничиваются общими утверждениями о том, что "интеграция API GSC полезна", но с точки зрения управления корейскими сайтами действительно критически важно автоматическое срабатывание действий, а не только сбор данных. На основании моего шестимесячного опыта работы, наибольшая отдача от инвестиций (ROI) API GSC не в первом и втором пунктах (сбор и обнаружение), а в третьем (автоматический вывод ключевых слов с потенциалом). Согласно официальной документации Google, ключевые слова в диапазоне позиций 11-20 имеют средний CTR менее 1.5%, но если улучшить мета-теги, H1 и внутренние ссылки, подняв их на 5-10 позиции, CTR возрастает до 7-12% — это означает, что можно получить более чем в 5 раз больше трафика. Поскольку трафик с Naver составляет около 60% для корейских сайтов (по данным исследования использования Интернета 2024 года), эффективно запускать RSS и отправку карты сайта Naver Search Advisor в том же пайплайне, что и GSC. Еще один совет по эксплуатации — поле position является средним значением, поэтому оно может быть шумным, и для определения тренда следует накапливать данные не менее 14 дней, так как при анализе за 7 дней не получится отличить "резкое падение" от "неделевых колебаний".

Заключение

После интеграции API GSC вы сможете "обнаруживать все проблемы без открытия дашборда GSC". С бесплатным планом CF Workers вы можете управлять кроном, D1 и уведомлениями без затрат. Если вы серьезно занимаетесь SEO, это определенно стоит инвестировать одну неделю.

🔧 Related Free Tools

Похожее