Node.jsでSearch Console URL Inspection APIをローカルで実行してインデックスステータス分析の結果をCSV化する

はじめに

Search Console URL Inspection API はGoogle のインデックスに登録されたページのインデックスステータス、AMP、モバイルユーザビリティ、リッチリザルトについての分析の結果を取得することができますが、今回はSearch Console URL Inspection APIを使用して複数のサイトのURLをチェックを行い、インデックスステータス分析の結果をCSVファイルに保存する処理を行うプログラムをNode.jsで作成しました。
GoogleのURL Inspection Tool(URL検査ツール) https://support.google.com/webmasters/answer/9012289 でも同様の情報を取得することができます。

作成するプログラムについて

  • Google Search Consoleからページの情報を取得
  • 今回はindexStatusResult(インデックスステータス分析の結果)を書き出し
  • URLリストは改行区切りのテキストファイルにて指定
  • 出力先のCSVファイル上書き

出力するCSVの項目

url 対象URL
message API呼び出しが成功した場合は’success’、失敗した場合はエラーメッセージ
verdict URL がインデックスに登録されているかどうか
coverageState Google がページを検出してインデックスに登録できるか
robotsTxtState ページが robots.txt ルールによって Google に対してブロックされているか
indexingState ページが noindex ルールによってインデックス登録をブロックするか
lastCrawlTime この URL が最後にメインクローラを使用して Google によってクロールされた日時
pageFetchState Google がサーバーからページを取得できたかどうか
googleCanonical Google が正規版として選択したページの URL
userCanonical ページまたはサイトが正規版として宣言している URL
sitemap サイトマップ(カンマ区切り)
referringUrls 検査対象 URL に直接的または間接的にリンクしている URL(カンマ区切り)
crawledAs Google がサイトをクロールするために使用したメインクローラー

Google Search Console API、Node.js の準備

こちらの記事に従って、「Google Search Console API の準備」〜「Node.js の準備」までを行います。

プログラム

app-inspect.js として作成しました。

require('dotenv').config(); // .envファイルを環境変数として読み込み
const fs = require('fs');
// Google APIs Node.js Client 読み込み
const { google } = require('googleapis');

// URL一覧ファイル名
const urlsFile = './site-urls.txt';
// 保存ファイル名
const fileName = 'inspections.csv';

// CSVヘッダー
const headers = [
  'url',
  'message',
  'verdict',
  'coverageState',
  'robotsTxtState',
  'indexingState',
  'lastCrawlTime',
  'pageFetchState',
  'googleCanonical',
  'userCanonical',
  'sitemap',
  'referringUrls',
  'crawledAs',
];

// Search Console URL Inspection APIの呼び出し関数
async function inspectURL(siteUrl, searchConsole) {
  const response = await searchConsole.urlInspection.index.inspect({
    requestBody: {
      inspectionUrl: siteUrl,
      siteUrl: siteUrl,
      languageCode: 'ja_JP',
    },
  });
  return response.data;
}

// 実行関数
async function runIsnspectUrls() {
  // Google認証の初期化
  const auth = new google.auth.GoogleAuth({
    keyFile: process.env.GOOGLE_APPLICATION_CREDENTIALS,
    scopes: ['https://www.googleapis.com/auth/webmasters.readonly'],
  });
  const authClient = await auth.getClient();
  google.options({ auth: authClient });
  // Search Consoleライブラリの読み込み
  const searchConsole = google.searchconsole('v1');
  const results = [];
  // url一覧ファイルの読み込み
  const text = fs.readFileSync(urlsFile);
  for (const line of text.toString().split('\n')) {
    const url = line.trim();
    if (url) {
      try {
        // Search Console URL Inspection APIの呼び出し
        const data = await inspectURL(url, searchConsole);
        // 結果からindexStatusResultを取り出し
        results.push(Object.assign({url, message: 'success'}, data.inspectionResult.indexStatusResult));
      } catch (error) {
        results.push({url, message: '"' + error.errors[0].message + '"'});
      }
    }
  }
  // CSVファイルへ書き出し
  // ヘッダー書き出し
  fs.writeFileSync(fileName, headers.join(',') + '\r\n');
  for (const result of results) {
    const columns = [];
    for (const head of headers) {
      let columnData = result[head] || '';
      if (Array.isArray(columnData)) {
        // 配列の場合は結合し、ダブルクォートでくくる
        columnData = '"' + columnData.join(',') + '"';
      }
      columns.push(columnData);
    }
    fs.appendFileSync(fileName, columns.join(',') + '\r\n');
  }
}

// 実行
runIsnspectUrls();

ファイル構成

.env
Quickstart-xxxxxxxxxx.json
app-inspect.js
site-urls.txt

site-urls.txtの例

https://www.implementdigital.com/
https://www.digitalaccels.com/

プログラム実行

node app-inspect.js

生成されたcsvファイルの例

url,message,verdict,coverageState,robotsTxtState,indexingState,lastCrawlTime,pageFetchState,googleCanonical,userCanonical,sitemap,referringUrls,crawledAs
https://www.implementdigital.com/,success,PASS,送信して登録されました,ALLOWED,INDEXING_ALLOWED,2024-11-11T06:37:01Z,SUCCESSFUL,https://www.implementdigital.com/,https://www.implementdigital.com/,"https://www.implementdigital.com/sitemap.xml","https://www.implementdigital.com/column/smartsheet/a-custom-branding-guide-for-smartsheet/,https://www.digitalstacks.net/products-satori,https://satori.marketing/partners/,https://www.implementdigital.com/ja/marketing-technology-enablement-center/",MOBILE
https://www.digitalaccels.com/,"You do not own this site, or the inspected URL is not part of this property.",,,,,,,,,,,
1行目:ヘッダ行
2行目:正常に取得できた場合の例
3行目:エラーだった場合の例
※Googleスプレッドシートで開いた場合
生成されたcsvファイルをGoogleスプレッドシートで開いた場合

まとめ

今回はインデックスステータス分析の結果のみ保存するプログラムを作成しましたが、他の分析結果もAPIの取得結果に含まれているので、必要に応じて保存することも可能です。
紹介したプログラムが何かの参考になれば幸いです。
この記事をシェアする :