黒谷です。このブログは、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のプログラムを作ってみることにしました。
GoogleのAPIを利用するためには、APIを有効にする必要があります。Google Cloud Platform(GCP)にログインし、新しいプロジェクトを作り、Search ConsoleのAPIを見つけて有効にします。
とりあえず、検索クエリを取得するプログラムを作ってみようと思って検索してみるのですが、ドキュメントや解説記事が見つかりません。そこで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に聞いてみました。
すると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の情報は古いことがあるので気をつけないといけないですね。
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を使う場合の手順を見ながら、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フレームワークなどを使用したアプリケーション開発を行うスタッフを募集しています。採用情報の詳細
弊社での勤務に関心をお持ちの方は、知り合いの弊社社員・関係者を通じてご連絡ください。
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年9月14日 オライリー本の全冊公開日のお知らせ(もくもく勉強会も同時開催) ファーエンドテクノロジーが所蔵するオライリー本(全冊)公開日のご案内です。公開日には「もくもく勉強会」も同時開催します。 |
|
RubyWorld Conference 2024 (12/5・6開催) にPlatinumスポンサーとして協賛 ファーエンドテクノロジー株式会社は、2024年12月5日(木)〜6日(金)に島根県松江市で開催される「RubyWorld Conference 2024」にPlatinumスポンサーとして協賛しています。 |
|
プロジェクト管理ツールRedmineのクラウドサービス「My Redmine」の海外向けサービス「My Redmine Global Edition」の提供を開始 「My Redmine」の海外向けサービスとして、新たに「My Redmine Global Edition」の提供を開始しました。 |
|
Redmineの最新情報をメールでお知らせする「Redmine News」配信中 新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け |