皆さんはSearch Consoleで「検出 – インデックス未登録」で困ったことはありませんか?

私はこのサイトのインデックスで非常に困っていました。

今までですと、Search ConsoleからサイトマップやURLを送ればインデックスされていました。

ですが、Googleにはすでに膨大な量のサイトがクローラーによってインデックスされています。

クローラーも全てのページに行けるわけではないので、不用意にインデックスせず一旦クロールを保留にする傾向にあります。

サイトマップやURLを送ることで、いつかはインデックスされるのでしょうが、
それがいつかはおそらくGoogleの人でもわからないでしょう。

そういったこともあり、Indexing APIを使用してURLのインデックスを促したところ、半日ほどでインデックスされました。

このサイト自体はWordpressで作成していますが、プラグインは使用したくなかったので、
Node.jsを使用してIndexing APIでインデックスさせた話をしていきます。

ではいきましょう!

# この記事で解決すること

  • 「検出 – インデックス未登録」の記事のクロールを促せる

手順

  1. Indexing APIの用途理解
  2. 前提
  3. Google Cloud API
    • プロジェクトの作成
    • Indexing APIの有効化
    • サービスアカウントの作成
    • サービスアカウントの鍵を作成
  4. Search Console
    • ユーザーの追加
  5. Node.js
    • ファイル構成の確認
    • jsの作成
    • パッケージの追加
    • 送信
  6. エラーが起きたら

Indexing APIの用途理解

本来Indexing APIは、下記のページをクロールするためのものです。

  • JobPostingが追加されたページ
    Google検索上から直接求人検索を行える機能のこと
  • VideoObjectBroadcastEventが埋め込まれたページ
    動画の構造化データが埋め込まれたページ

つまり、求人や動画サイトに使用するためのものです。

ですが、2022年10月現在では通常のWEBページにIndexing APIを使用しても問題なくインデックスされます。

また、Indexing APIは200件/日のリクエスト制限がありますので、その点も覚えておいてください。

前提

今回はNode.jsを使用してIndexing APIにリクエストを送りますので、nodeコマンドが実行できる環境が必要です。

Google Cloud API

プロジェクトの作成

    1. まずはGoogle Cloud APIへアクセスしてください。
    2. メイン画像箇所に下記の表記がありますので、そちらから移動してください。
      • 使用したことのある方
        【コンソールへ移動】からコンソールへ移動
      • 使用したことのない方
        【無料で使ってみる】からGoogleアカウントで登録
    3. headerからプロジェクトの選択
    4. モダールから「新しいプロジェクト」を作成
    5. プロジェクト名」のみ入力して「作成

Indexing APIの有効化

  1. headerのプロジェクト選択から、先程作成したプロジェクトを選択
  2. headerの検索窓から【indexing api】を検索→選択
  3. indexing APIを有効化

サービスアカウントの作成

通常のAPIですと、ここで「認証情報を作成」しますが、今回は特に必要ありません。

  1. 左上のバーガーメニューから「IAMと管理」->「サービスアカウント」へ移動
  2. サービスアカウントを作成
  3. サービスアカウント名」を入力して「作成して続行
    「サービスアカウントID」は変更不要 / 「サービスアカウントの説明」は任意
  4. プロジェクトアクセス権のロールを「オーナー」に
  5. サービスアカウントへのアクセス許可は無視して「完了

サービスアカウントの鍵を作成

先程の続きの画面から説明します。

  1. 表示されているメールアドレスは後で使用しますのでメモしてください。
    操作」から「鍵を管理」を選択
  2. 鍵を追加」から「新しい鍵を作成
  3. モーダルから「JSON」を選択し「作成
  4. jsonが保存されたことを確認
    このjsonは後で使用します。

Search Console

ユーザーの追加

  1. インデックスさせたいページがあるサイトの「設定」から「ユーザーを追加
  2. メールアドレス」を「サービスアカウントの鍵を作成」でメモしておいたメールアドレスに、
    権限」を「オーナー」にして「追加

Node.js

さて、APIの使用設定が完了したのでここからが本番です。

今回はNode.jsを使用しますが、phpやpythonで取得する方法もあります。

詳しくはIndexing APIのガイドをご覧ください。

ファイル構成の確認

Node.jsを使用しますので、nodeコマンドが使用できる環境下ということが前提となります。

brandnew-indexing-xxx.jsonは「サービスアカウントの鍵を作成」の4項目でダウンロードしたjsonとなります。

  • folder_name
    • google-indexing.js
    • brandnew-indexing-xxx.json

jsの作成

google-indexing.js

var request = require("request");
var { google } = require("googleapis");
var key = require("./brandnew-indexing-xxx.json");

const jwtClient = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ["https://www.googleapis.com/auth/indexing"],
  null
);

jwtClient.authorize(function(err, tokens) {
  if (err) {
    console.log(err);
    return;
  }
  let options = {
    url: "https://indexing.googleapis.com/v3/urlNotifications:publish",
    method: "POST",
    // Your options, which must include the Content-Type and auth headers
    headers: {
      "Content-Type": "application/json"
    },
    auth: { "bearer": tokens.access_token },
    // Define contents here. The structure of the content is described in the next step.
    json: {
      "url": "(index_url)",
      "type": "URL_UPDATED"
    }
  };
  request(options, function (error, response, body) {
    // Handle the response
    console.log(body);
  });
});

3行目

ダウンロードしたjsonファイル名に変更

28行目

indexさせたいページのURLを挿入

29行目

今回はインデックスさせたいので、URL_UPDATEDにしています。

インデックスを削除させたい場合はURL_DELETEDに変更してください。

パッケージの追加

jsにてパッケージを使用していますので、googleapisrequestをインストールしてください。

npm i googleapis request

送信

node google-indexing.js

問題がなければ下記のレスポンスがあります。

{
  urlNotificationMetadata: {
    url: '(index_url)',
    latestUpdate: {
      url: '(index_url)',
      type: 'URL_UPDATED',
      notifyTime: '2022-10-22T05:30:26.336548562Z'
    }
  }
}

言わずもがなですが、console.logを消したら表示されません。

また、私の場合はDockerを使用していたお陰でエラーに見舞われました。

エラーが起きたら

Dockerを使用している私が現在確認できているのは下記のエラーのみです。

GaxiosError: invalid_grant: Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values in the JWT claim.
at Gaxios._request (/home/wbcre8/projects/portfolio/wordpress/wp-content/themes/portfolio/src/node_modules/gaxios/build/src/gaxios.js:130:23)

エラー内容としては、「PCの時間とサーバー時間が一致してないからダメよ」というものです。

私の場合、PCの時間は合っていたのですが、Dockerの時間がずれていました。

ですので、Dockerプロジェクトの時間をいじれば直るのですが、なんだか面倒。。。

ということで、簡易に対応しました。

sudo hwclock --hctosys

簡単に説明すると、hwclockでハードウェアの時計にアクセスして、
--hctosysでハードウェアの時間をシステムの時間に合わせています。

私の場合はこれで解決しました。

一括で複数URLを送信したい場合

上記の記述ですと1URLづつ送信していく必要があります。

そのため、404が多いページなどではかなり面倒な作業になります。

ですので、複数のURLを一括で送信する方法も記載しておきます。

google-indexing.js

var request = require("request");
var { google } = require("googleapis");
var key = require("./brandnew-indexing-a788ed4f7b1f.json");

const jwtClient = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ["https://www.googleapis.com/auth/indexing"],
  null
);

jwtClient.authorize(function(err, tokens) {
  if (err) {
    console.log(err);
    return;
  }
  let options = (url) => ({
    url: "https://indexing.googleapis.com/v3/urlNotifications:publish",
      method: "POST",
    // Your options, which must include the Content-Type and auth headers
    headers: {
      "Content-Type": "application/json"
    },
    auth: { "bearer": tokens.access_token },
    // Define contents here. The structure of the content is described in the next step.
    json: {
      "url": url,
      "type": "URL_DELETED"
    }
  });
  const urls = [
    "(index_url-1)",
    "(index_url-2)",
    "(index_url-3)",
  ];
  urls.map((url) => {
    request(options(url), function (error, response, body) {
      // Handle the response
      console.log(body);
    });
  });
});

33~35行目

(index_url-1), (index_url-2)などを任意のURLに置き換えれば一括で送信することが可能です。

大事なことなので再度お伝えしますが、1日に送信できるURLの上限は200件ですので、その点を気をつけてください。

最後に

上記の方法を使用すると、おおよそ半日ほどでGoogleクローラーに保留にされ続けたページが見事インデックスされました!

また、Indexing APIを調べていると、Wordpressのプラグインが出てきます。

ですが、私自身SiteKitでスピード落とされてイライラした覚えがあります。

私以外にもプラグイン非使用で対応したい方が多いのではないでしょうか?

そんな時はNode.jsやPython、PHPなどでIndexing APIにリクエストを送信できますので、皆さんもぜひやってみてください!

すごくスッキリします!

では、よいJsライフを!