概要

RubyからGoogle AdsenseのAPIを叩いて収益を取得する方法を調べたのでメモ

Googleではここ数年の間にサービスの大きな統廃合がありました。収益が見込めそうにないと判断されたサービスが次々と廃止されていく一方で、デベロッパーセンターが開設され、ドキュメントの追加が行われたり、APIを一元管理するためのコンソールが用意されるなど、生き残ったサービスについては開発環境の整備が進みました。

開発環境の整備が進むのは誠にありがたいことなのですが、整備が急速に行われたために、チュートリアル的な利用情報がなかなかみつからず、取っ付きにくい膨大な数のリファレンスと使い慣れない開発ツールに翻弄されて、思うように開発が進まないのが悲しいところです。

とりあえず今回はGoogle AdsenseのAPIを叩いて収益を取得するところまで頑張って調べたので記録に残しておきます。

想定読者としては、OAuthなどの外部サービス連携機能を使ったことがある人を対象にしています。OAuthを使ったことがない人は、まずはTwitterの連携サービスを作ることをお勧めします。提供されているAPIが遥かにシンプルで、利用情報も豊富です。

アウトライン

  • Google APIs ConsoleでAdsense APIの利用登録を行う
  • google-api-ruby-clientを使ってAPI利用のための準備を行う
  • 公式リファレンスとGoogle APIs Explorerを使ってAPI操作の確認を行う
  • google-api-ruby-clientを使って実際にAPIを叩いてみる

Google APIs ConsoleでAdsense APIの利用登録を行う

Googleのサービスの多くはGoogle共通仕様のAPIを提供しています。Google APIs Consoleは提供されている各種APIの利用関係を一元管理するためのコンソールです。Google APIs Consoleを使って、APIの利用申請や認証トークンの管理、利用状況の確認などを行うことができます。

Adsense APIの利用申請を行うために、まずはGoogle APIs Consoleにログインします。初めてのログインの場合はプロジェクトの作成を促されるので適当に作ります。プロジェクトを作ったら、「Services」ページを開き、その中から「AdSense Management API」を探して利用申請を行います。申請自体は一瞬で終わります。

申請が終わったら「API Access」ページを開き、APIの利用設定を行います。青い大きなボタンが目印です。今回は自分の収益を確認するだけなので種別は「installed applications」にしておきます。「installed applications」にすると利用までの手間が一つ省けます。

設定が終わるとOAuth認証に必要な「Client ID」「Client secret」「Redirect URIs」が生成されます。キーは後で使うのでメモしておきます。

Simple API Accessというキーも生成されていますが、こちらは使用しません。現在では一部のサービスでし使われていないようです。

google-api-ruby-clientを使ってAPI利用のための準備を行う

google-api-ruby-clientはRubyで実装されたGoogle APIのラッパーライブラリです。Rubyのライブラリとして利用することはもちろん、CLIプログラムとしても実行することができます。google-api-ruby-clientを利用することでGoogleのOAuth認証に必要な作業を簡単に行うことができます。

まずはgoogle-api-clientをインストールし、CLIプログラムとして動かしてみましょう。

$ gem install google-api-client
$ google-api
Usage: google-api (execute <rpcname> | [command]) [options] [-- <parameters>]

Available options:
        --scope <scope>              Set the OAuth scope
        --client-id <key>            Set the OAuth client id or key
        --client-secret <secret>     Set the OAuth client secret
        --api <name>                 Perform discovery on API
        --api-version <id>           Select api version
        --content-type <format>      Content-Type for request
    -u, --uri <uri>                  Sets the URI to perform a request against
        --discovery-uri <uri>        Sets the URI to perform discovery
    -m, --method <method>            Sets the HTTP method to use for the request
        --requestor-id <email>       Sets the email address of the requestor
    -v, --verbose                    Run verbosely
    -h, --help                       Show this message
        --version                    Show version

Available commands:
    oauth-1-login   Log a user into an API with OAuth 1.0a
    oauth-2-login   Log a user into an API with OAuth 2.0 d10
    list            List the methods available for an API
    execute         Execute a method on the API
    irb             Start an interactive client session

コマンドオプションを見てみると、oauth-2-loginというのが見つかりました。このコマンドでOAuth認証を行うことができそうです。

次のようにコマンドを実行してください。ブラウザが開いて認証フローがはじまります。
ID/PASSはAPIs Consoleでメモしたものを入力します。

$ google-api oauth-2-login --client-id="<your client id>" --client-secret="<your client secret>" --scope="https://www.googleapis.com/auth/adsense.readonly"

認証が終わったら「~/.google-api.yaml」というファイルが作成されます。
ここにAPIアクセスに必要なトークンが保存されています。

公式リファレンスとGoogle APIs Explorerを使ってAPI操作の確認を行う

Adsense APIの利用準備が終わったところで、次はAPIの使い方を見ていきます。

まずはどのようなAPIが用意されているのか確認してみましょう。
次のコマンドを実行してください。

$ google-api list --api adsense
adsense.accounts.adclients.list
adsense.accounts.adunits.customchannels.list
adsense.accounts.adunits.get
adsense.accounts.adunits.list
adsense.accounts.customchannels.adunits.list
......

つらつらとリスト出力されました。これらがAdsenseAPIに用意されているメソッドの一覧です。
メソッドの使い方を一つ一つ手で調べるのは大変ですが、充実したリファレンスとブラウザからAPIを試用できるツールが用意されているため、これらを活用することでAPIの動作を簡単に確認することができます。

Google APIs Explorerを使ってデータを取得してみます。収益レポートを取得するのが最終目標なので、収益に関するメソッド「adsense.reports.generate」を叩きます。Google APIs Explorerのメソッドリストから「adsense.reports.generate」を探してページを開きます。

「adsense.reports.generate」は認証が必要なAPIです。API利用の前にOAuth認証を済ませておく必要があります。画面の右上にスイッチらしきものがあるので、それをクリックします。ポップアップダイアログが開くので認証を行います。認証が終わったらAPIを使うことができます。

「adsense.reports.generate」メソッドですが、いくつかパラメータを渡す必要がありそうです。
「startDate」と「endDate」が必須項目となっているので、両方に今日の日付を入力して実行してみます。

"This is an empty report: no dimensions or metrics were provided."

「dimensions」か「metrics」がないと怒られました。入力欄を確認したところ、確かにそんな項目が存在しています。
指定はありませんが、準必須の入力項目のようです。なにか値を入力したいところですが、自由入力なのでどんな値を入力したらいいのか検討がつきません。

こういうときはリファレンスを参照して入力値を確認してみましょう。リファレンスを開いて「adsense.reports.generate」で検索します。リファレンスを確認したところ、どうやらディメンションと表示する統計情報を指定する項目のようです。とりあえずdimensionsには「DATE」、metricsには「PAGE_VIEWS」を指定して再度実行します。

....
 "rows": [
  [
   "2012-12-27",
   "5241"
  ]
 ],
....

今度はちゃんと値を取得できたようです。この調子で「PAGE_VIEWS」「CLICKS」「PAGE_VIEWS_CTR」「COST_PER_CLICK」「PAGE_VIEWS_RPM」「EARNINGS」と指定していけば、収益レポートとして使えそうです。

google-api-ruby-clientを使って実際にAPIを叩いてみる

最後にRubyのライブラリとしてgoogle-api-ruby-clientを使ってみます。
使い方がよくわかりませんが、十分なサンプルコードがありません。ソースコードを読むしかないようです。
とりあえずこんな感じでうまくいきました。

require 'google/api_client'

client = Google::APIClient.new(:authorization => :oauth_2)
client.authorization.scope         = 'https://www.googleapis.com/auth/adsense.readonly'
client.authorization.client_id     = '4039742*****.apps.googleusercontent.com'
client.authorization.client_secret = '3xgXvnsD**********ASuV'
client.authorization.access_token  = 'ya29.AHES6ZQOWskgp*******************FAH_lhw'
client.authorization.refresh_token = '1/qDHU9XxrUe***************inpXan03ozncnE'

adsense = client.discovered_api('adsense', 'v1.2')
response = client.execute(
  :api_method => adsense.accounts.reports.generate,
  :parameters => {
    :accountId=>'pub-44353*****02377',
    :startDate=>'today', :endDate=>'today', :dimension=>'DATE',
    :metric => ['PAGE_VIEWS'],
  }
)

page_views = ActiveSupport::JSON.decode(response.body)['rows'].flatten[1]

p page_views
=> '5241'

単一項目の取得はうまくいきました。
あとはmetricオプションに配列で[‘PAGE_VIEWS’, ‘CLICKS’,…]とかやっていけばいいのですが。
・・・なぜかうまくいきません。

複数のmetricを指定して実行すると、正常に値が返ってきません。
「google-api-ruby-client multiple metric」とかでググってみたところ、
Ruby版の既知のバグらしく大分昔に指摘されつつも未だに直ってないようです。ダメだろこれ。

というわけで、Adsense管理画面と同じ情報を出すには6回リクエストする必要があるようです。
APIの回数制限には十分な余裕があり、それほど頻繁にアクセスするようなデータではないのでパフォーマンスも問題にならず、一応は許容範囲内です。ということにしておきましょう。

おまけ

コマンドラインから取得する場合は次のような感じになります。
足りないパラメータがあればエラーメッセージで通知してくれるので、リファレンスとあわせれば迷いません。

$ google-api adsense.reports.generate --api=adsense accountId=pub-443538********** startDate=today endDate=today dimension=DATE metric=PAGE_VIEWS

終わりに

終わってみればなかなかによく整備された環境だなーとは思うのですが、如何せん利用情報がなさ過ぎで手順を確立するのに手間取りました。
この記事が少しでもお役に立てば幸いです。