Google Search Console APIをRubyで利用する


My Redmine

黒谷です。このブログは、Rubyで実装されたEmacsライクなテキストエディタTextbringerを使用して執筆しました。

ウェブサイトの分析にGoogle AnalyticsやGoogle Search Consoleを利用しています。データはGoogleが提供するGUI画面で閲覧したり、レポート出力機能を使ったりしています。いろいろな情報をいろいろな切り口で見ることができて便利なのですが、用意されている範囲での閲覧や出力に制限されます。

例えば、Google Search Consoleの画面で検索クエリの一覧を表示すると、1,000件までしか表示できません。(実際に役に立つかどうかはおいといて)1,001件以上のデータを見たくても見ることができません。

Google AnalyticsにはAPIが用意されていて、以前、表示回数を取得するプログラムを作ったことがありました。Google Search ConsoleにもAPIが提供されていて、データを取得できそうだということがわかりました。また、APIを利用するためのRubyのライブラリがあり、Search Consoleのデータにもアクセスできそうでしたので、Rubyのプログラムを作ってみることにしました。

APIを有効にする

GoogleのAPIを利用するためには、APIを有効にする必要があります。Google Cloud Platform(GCP)にログインし、新しいプロジェクトを作り、Search ConsoleのAPIを見つけて有効にします。


Google Search Console API を有効にする

プログラムの作り方をChatGPTに聞く

とりあえず、検索クエリを取得するプログラムを作ってみようと思って検索してみるのですが、ドキュメントや解説記事が見つかりません。そこでChatGPTに作り方を聞いてみることにしました。


ChatGPTにざっくりと聞いてみる

回答の中で、以下のようなサンプルプログラムを示してくれました。

require 'google/apis/webmasters_v3'

# APIキーの設定
api_key = 'YOUR_API_KEY'

# サイトのURL
site_url = 'https://www.example.com'

# APIクライアントの初期化
webmasters_service = Google::Apis::WebmastersV3::WebmastersService.new
webmasters_service.key = api_key

# サイトの検索トラフィックデータの取得
begin
  response = webmasters_service.query_search_analytics(site_url, start_date: '2022-01-01', end_date: '2022-01-31')
  puts response
rescue Google::Apis::Error => e
  puts e.message
end

APIキーを取得して、と書かれていますが、以前Google AnalyticsのAPIを調べたときOAuthを使うように書かれていたので、そうしないといけないかと思ってChatGPTに聞いてみました。


ChatGPTにOAuthを使う方法を聞いてみる

するとOAuthを使ったサンプルプログラムを示してくれました。

require 'google/apis/webmasters_v3'
require 'googleauth'
require 'googleauth/stores/file_token_store'

# クライアントIDとシークレット
client_id = Google::Auth::ClientId.from_file('client_secrets.json')
token_store = Google::Auth::Stores::FileTokenStore.new(file: 'tokens.yaml')
authorizer = Google::Auth::UserAuthorizer.new(client_id, [Google::Apis::WebmastersV3::AUTH_WEBMASTERS_READONLY], token_store)

# ユーザー認証
user_id = 'default'
credentials = authorizer.get_credentials(user_id)
if credentials.nil?
  url = authorizer.get_authorization_url(base_url: 'urn:ietf:wg:oauth:2.0:oob')
  puts "Open the following URL in the browser and enter the resulting code after authorization:\n" + url
  code = gets
  credentials = authorizer.get_and_store_credentials_from_code(user_id: user_id, code: code, base_url: 'urn:ietf:wg:oauth:2.0:oob')
end

# APIクライアントの初期化
webmasters_service = Google::Apis::WebmastersV3::WebmastersService.new
webmasters_service.authorization = credentials

# サイトのURL
site_url = 'https://www.example.com'

# サイトの検索トラフィックデータの取得
begin
  response = webmasters_service.query_search_analytics(site_url, start_date: '2022-01-01', end_date: '2022-01-31')
  puts response
rescue Google::Apis::Error => e
  puts e.message
end

require 'google/apis/webmasters_v3' で利用できるライブラリがあるんだなと思って調べてみると、どうやら古い情報のようでした。APIもバージョンアップされ、ライブラリもバージョンアップするようです。現時点では require 'google/apis/searchconsole_v1' で利用するようです。ChatGPTの情報は古いことがあるので気をつけないといけないですね。

Google APIのRubyクライアントライブラリのドキュメントを読む

ChatGPTの情報は古いようなので、自分でドキュメントを調べることにしました。Google APIのRubyクライアントライブラリが以下のリポジトリで公開されていることがわかりましたので、ここでドキュメントを探しました。

https://github.com/googleapis/google-api-ruby-client/tree/main

「Usage Guide for Simple REST Clients」というドキュメントにたどり着きました。

https://github.com/googleapis/google-api-ruby-client/blob/main/docs/usage-guide.md

ここに例としてGoogle DriveのAPIが挙げられていますが、gemの名前はgoogle-apis-<servicename>_<serviceversion>というルールのようで、Search Consoleはgoogle-apis-searchconsole_v1で良さそうです。そのように読み替えながらドキュメントを読み進めていきます。

OAuthで接続したい

このドキュメントに書かれていたOAuthを使う場合の手順を見ながら、GCPのプロジェクトで認証情報を生成します。GCPの「APIとサービス」の設定画面で、認証情報を新規作成するときにOAuthを選べば良さそうです。シークレット情報を生成できますので、適切な方法で保存します。詳しくはGoogleのドキュメントを参照してください。

ChatGPTのサンプルプログラムでは

# APIクライアントの初期化
webmasters_service = Google::Apis::WebmastersV3::WebmastersService.new
webmasters_service.authorization = credentials

で認証処理を行うように書かれていますが、「Google::Apis::WebmastersV3::WebmastersService.new」の部分をSearch Console用に書き換えないといけません。

Google DriveのAPIの例で、

drive = Google::Apis::DriveV2::DriveService.new

と書かれているので、Search Consoleも同じような感じで「Google::Apis::SearchconsoleV1::ほげほげ.new」みたいな感じなんだろうとあたりをつけて検索してみると、以下のページにたどり着きました。

Module: Google::Apis::SearchconsoleV1

そこに書かれているクラスをひとつひとつ見ていくと、SearchConsoleServiceというクラスがありました。それを読みながら以下のコードを書いてみたらうまくいきました。

service = Google::Apis::SearchconsoleV1::SearchConsoleService.new
service.authorization = credentials

検索クエリを取得したい

今回の目的は検索クエリの取得です。そのためのクラスがあるだろうと思って見ていくと、SearchAnalyticsQueryRequestというクラスがありました。以下のコードでSearchAnalyticsQueryRequestインスタンスを生成できます。

request = Google::Apis::SearchconsoleV1::SearchAnalyticsQueryRequest.new

このインスタンスは、start_dateメソッドとend_dateで取得範囲の始点と終点の日付を指定、dimensionsメソッドでディメンションを指定、row_limitメソッドで取得データの上限を設定できるようです。row_limit、これだ!

こうして何とか取得できるようになりました。指定した日付の検索クエリと対象ページをCSVで出力するプログラムに仕立てました。以下に置きましたので、興味のある方はご覧ください。

https://github.com/kurod1492/google-search-console-api-ruby-sample

まとめ

Google Search ConsoleのAPIをRubyのプログラムでアクセスして、検索クエリを取得するプログラムを作成したという話でした。 ChatGPTは大変便利だと思います。プログラムを作ってみようと思ってから取り掛かるまでのハードルがとても下がったと思います。 ただ情報が古くなってしまったら自力でなんとかしないといけません。そのために日々の情報収集や勉強は続けていきたいと思います。

【スタッフ募集中】
弊社ではAWSを活用したソリューションの企画・設計・構築・運用や、Ruby on Rails・JavaScriptフレームワークなどを使用したアプリケーション開発を行うスタッフを募集しています。採用情報の詳細
弊社での勤務に関心をお持ちの方は、知り合いの弊社社員・関係者を通じてご連絡ください。

My Redmine

こちらの記事もオススメです!
RedmineのREST APIを活用してプロジェクトメンバーやロール、公開設定などのレポートを作成しています
Redmineのユーザーや権限など自分たちが必要な情報を扱いやすい形式にまとめたい場合、REST APIを利用するのがお勧めです。
ChatGPTを活用してRedmineのデモ用データのCSVを編集してみた
Redmineのデモデータ用のCSVファイルを作成するのにGoogle Colaboratoryを利用しました。
私が過去にRedmineに投稿したパッチを振り返ってみる
Redmineの他の開発者やユーザーからのフィードバックや反応を貰えるのがOSS活動の楽しさの一つであると感じた。
Redmineのクラウドサービス My Redmine のアーキテクチャ紹介 2023
My Redmine のサービスの構成図を公開。運用コストを削減するためにサーバーレスのサービスを中心に選択し実装。
AWSを使用したメール通知処理を改善しています
AWSを使用したメール通知処理を行っています。
ファーエンドテクノロジーからのお知らせ(2024/05/09更新)
2024年5月11日 オライリー本の全冊公開日のお知らせ(もくもく勉強会も同時開催)
ファーエンドテクノロジーが所蔵するオライリー本(全冊)公開日のご案内です。公開日には「もくもく勉強会」も同時開催します。
入門Redmine 第6版 出版記念企画セミナー「Redmineのアクセス制御」【2024/5/30開催】
入門Redmine 第6版(2024年3月23日発売)の書籍から「Redmineのアクセス制御」について解説します。
My Redmine 初回ご契約で「入門Redmine 第6版」プレゼントのお知らせ
Redmineのクラウドサービス「My Redmine」を初めてご契約いただいたお客様にRedmine解説書「入門Redmine 第6版」を進呈いたします。
2024年度ブランドパートナーに島根県在住のモデル ユイさんを継続起用
ユイさん(モデルスタジオミューズ所属)をファーエンドテクノロジーの2024年度ブランドパートナーとして継続して起用します。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け