データベースSEOでページごとの低品質を調査する際に、URLごとにクロール頻度を調査します。
サーチコンソールから手動で「URL検査」をする方法もありますが、URL数が多くなると手動では間に合わないので、システム化は必須です。

GASを使う方法のありますが、GASの場合は1回の稼働時間に限り(6分)があり、一気に取得したい場合は不便です。
一気に短期間で調査したい時に今回のツールが使えそうですが、定常的にモニターしたい場合はGASを使った方がいいと思います。

この記事では、Google Search Console APIをnode.jsで呼び出して、URLの一覧からクロール頻度を連続的に取得する方法についてまとめました。

スポンサーリンク

前提条件と事前準備

サーチコンソールAPIを使ってURLのクロール情報を取得するには、該当サイトのサーチコンソールプロパティの権限が必要です。
(必ずしもオーナー権限が必要ではなく、編集者権限でも取得できます)

また、PCにnode.jsをインストールしておく必要があるため、事前にインストールしておいてください。
https://nodejs.org/en/download/package-manager

Google Cloud Console でのプロジェクト設定

GCPのプロジェクトを作成

Google Cloud Consoleにログインし、新しいプロジェクトを作成します。

プロジェクト名(Search Console APIなど)を入力して、「作成」をクリックします。

サーチコンソールAPIの有効化

作成したプロジェクトを選択した状態で、サイドメニューの「APIとサービス」→「APIとサービスを有効にする」をクリックします。

「Google Search Console API」を検索し、「有効にする」をクリックして有効化します。

OAuth同意画面の設定

「APIとサービス」→「OAuth同意画面」に移動し、作成をクリックします。

アプリ名、ユーザーサポートメール、デベロッパーの連絡先情報を入力します。

こちらのメールアドレスは、今回データを取得したいサイトのサーチコンソールプロパティを持っているGoogleアカウントのメールアドレスを使用します。
※アプリのロゴ、アプリのドメイン、承認済みドメインは設定不要です。

スコープを設定します。
「スコープを追加または削除」をクリックします。


一覧の中から、Google Search Console APIの「...auth/webmasters.readonly」を探してチェックを入れます。

後半にあるので、2回ほどページ送りをクリックすると表示されます。

最後に「更新」をクリックして保存します。

認証情報の作成

サイドバーの「認証情報」から、「認証情報を作成」→「OAuth クライアント ID」をクリックします。

「アプリケーションの種類」にて「ウェブ アプリケーション」を選択し、名前を入力します。

承認済みのリダイレクトURIに
http://localhost:3000/oauth2callback
を入力し、「作成」をクリックします。

こちらの画面が表示されるので、

「Auth クライアント ID」と「クライアントシークレット」をコピーして、メモ帳などにペーストしておきます。
(後ほど使用します。)

OAuth 認証のセットアップ

OAuth URLの生成と認証コードの取得

取得したクライアントID、クライアントシークレットを使ってOAuth認証URLを生成します。
以下のコードにクライアントID、クライアントシークレットを入力します。

const oauth2Client = new google.auth.OAuth2(
    'YOUR_CLIENT_ID',
    'YOUR_CLIENT_SERCRET',
    'http://localhost:3000/oauth2callback'
);


// スコープを設定(Google Search Console APIにアクセスする権限)
const scopes = ['https://www.googleapis.com/auth/webmasters.readonly'];

const authUrl = oauth2Client.generateAuthUrl({
    access_type: 'offline', // リフレッシュトークンを取得するため
    scope: scopes,
});

console.log('Authorize this app by visiting this URL:', authUrl);

 

コンソールからnodeで実行すると、以下のようなレスポンスが返ってきます。

表示されたURL部分(https://〜〜〜callback)をコピーして、ブラウザのURL直接入力からアクセスします。

以下のような画面になるので、サーチコンソールのプロパティを持っているGoogleアカウントを選択します。

「許可」をクリックします。

こちらの画面が表示されますが、まだ画面を閉じないでください。


URL欄に、以下のような?code=パラメーターが記載されています。

http://localhost:3000/oauth2callback?code=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&scope=https://www.googleapis.com/auth/webmasters.readonly

赤文字の部分(認証コード)のみをコピーして保存しておきます。
コピーしたら、こちらの画面は閉じてしまってOKです。

アクセストークンとリフレッシュトークンの取得

以下のコードに、先ほどの認証コードを貼りつけます。

const { google } = require('googleapis');

// OAuth2クライアントの作成
const oauth2Client = new google.auth.OAuth2(
    'YOUR_CLIENT_ID',
    'YOUR_CLIENT_SERCRET',
    'http://localhost:3000/oauth2callback'
);

// ここに取得した認証コードを貼り付け
const code = 'YOUR AUTHENTICATION CODE';

oauth2Client.getToken(code, (err, tokens) => {
    if (err) {
        console.error('Error retrieving access token', err);
        return;
    }

    console.log('Access Token:', tokens.access_token);
    console.log('Refresh Token:', tokens.refresh_token);

    // トークンをOAuth2クライアントに設定する
    oauth2Client.setCredentials(tokens);
});

 

なお、

'YOUR_CLIENT_ID',
'YOUR_CLIENT_SERCRET',
の部分は先ほどの「OAuth URLの生成と認証コードの取得」で入力したものと同じものを再度入力してください。

node で実行すると、

コンソールに
Access Token:
Refresh Token:
が表示されるので、コピーしておきます。

Node.jsコードの準備

axiosを使ってリクエストを行うコードを準備し、アクセストークンを使ってURLインスペクションを行います。
以下のコードをベースに使用します。

const axios = require('axios');

const clientId = 'YOUR_CLIENT_ID';
const clientSecret = 'YOUR_CLIENT_SERCRET';
const refreshToken = 'REFRESH_TOKEN';

async function getNewAccessToken() {
    try {
        const response = await axios.post('https://oauth2.googleapis.com/token', null, {
            params: {
                client_id: clientId,
                client_secret: clientSecret,
                refresh_token: refreshToken,
                grant_type: 'refresh_token',
            },
        });
        return response.data.access_token;
    } catch (error) {
        console.error('Error refreshing access token:', error.response ? error.response.data : error.message);
    }
}

async function inspectUrls(urls) {
    const accessToken = await getNewAccessToken(); // 新しいアクセストークンを取得
    if (!accessToken) return;

    for (const inspectionUrl of urls) {
        try {
            const response = await axios.post(
                'https://searchconsole.googleapis.com/v1/urlInspection/index:inspect',
                {
                    inspectionUrl: inspectionUrl,
                    siteUrl: 'https://example.com/', // 固定のプロパティURL
                    languageCode: 'en',
                },
                {
                    headers: {
                        Authorization: `Bearer ${accessToken}`,
                        'Content-Type': 'application/json',
                    },
                }
            );
            console.log(`Inspection result for ${inspectionUrl}:`, response.data);
        } catch (error) {
            console.error(`Error inspecting ${inspectionUrl}:`, error.response ? error.response.data : error.message);
        }
    }
}

// 調査対象のURLを配列に定義
const urlsToInspect = [
    "https://example.com/page1/",
    "https://example.com/page2/",
    "https://example.com/page3/"
];

inspectUrls(urlsToInspect);

先ほどまでに取得した
・YOUR_CLIENT_ID
・YOUR_CLIENT_SERCRET
・REFRESH_TOKEN
をぞれぞれ入力します。

また、

siteUrl: 'https://example.com/', // 固定のプロパティURL

の箇所は、調査を行いたいプロパティのURLを入力します。

さらに、こちらの箇所は

const urlsToInspect = [
"https://example.com/page1/",
"https://example.com/page2/",
"https://example.com/page3/"
];

調査したいURLの配列を入力します。

node で実行すると、以下のようにURL検査のデータが返ってきます。

注意点

ドメインプロパティとURLプレフィックスでの指定の違い

サンプルコードの以下の記述は、URLプレフィックスで設定されたプロパティに対応しています。

siteUrl: 'https://example.com/', // 固定のプロパティURL

こちらのような記載は、「URLプレフィックスで設定したプロパティのみ」になります。

「ドメインプロパティ」で設定されたプロパティの場合は

 "siteUrl": "sc-domain:example.com",      // ドメインプロパティの指定

こちらのような記述になります。

アクセストークンの有効期限

「アクセストークンとリフレッシュトークン」の取得の手順で取得したトークンですが、有効期限が1時間程度と短いです。

なので、実行の際にエラーが出る場合は、アクセストークンの再発行を行ってから再度実行すると、うまくいくかもしれません。

おすすめの記事