Google Ad Managerに対してrubyプログラムから何かしたい時、google-dfp-apiというgemを利用します(参考)。
google-dfp-apiを利用するためには認証情報のセットアップが必要です。セットアップはサービスアカウントキーをどこかに置いて、~/ad_manager_api.ymlに以下のような設定を記述する方法が紹介されています。
:authentication:
:oauth2_keyfile: サービスアカウントキーのファイルパス
:application_name: 'application_name' # 識別用なのでどんな名前でも良い
:network_code: 123456 #(自身のGoogle Ad ManagerのIDを入れる)
しかし、ドキュメントなどをみると~/ad_manager_api.ymlを作らずとも設定できそうなので、今回はそちらを試してみます。
作成するプログラム
今回は簡単な例として、認証を行った後、オーダーを10件取得するプログラムを作成してみます。
サービスアカウントキーの用意
Google Cloudのプロジェクトを作成し、サービスアカウントとキーを発行します。
その後、サービスアカウントをGoogle Ad Managerと紐つけてください。
詳細は API アクセス用のサービス アカウント ユーザーを追加する - Google アド マネージャー ヘルプ を確認してください。
管理者権限が必要なので、管理者じゃない人は依頼をして設定をしてもらってください。
Gemの準備
google-dfp-apiと環境変数を扱いたいのでdotenvを入れます。
以下をGemfileに記述し、bundle installしましょう。
source 'https://rubygems.org'
gem 'google-dfp-api'
gem 'dotenv'
環境変数の準備
.envを作成し、以下を入力します。
- GOOGLE_AD_MANAGER_NETWORK_CODE
- GAMのネットワークコード
- GAMにアクセスした時のURLを確認し、
https://admanager.google.com/の直後の数字を入力する- ex)
https://admanager.google.com/123456/(以下略)->123456
- ex)
- GOOGLE_AD_MANAGER_PRIVATE_KEY
- サービスアカウントキーのprivate_keyを入力してください
- GOOGLE_AD_MANAGER_CLIENT_EMAIL
- サービスアカウントキーのclient_emailを入力してください
GOOGLE_AD_MANAGER_NETWORK_CODE=
GOOGLE_AD_MANAGER_PRIVATE_KEY=
GOOGLE_AD_MANAGER_CLIENT_EMAIL=
実装
早速実装に入ります。
環境変数
まずライブラリと環境変数のロードをします。
require 'dotenv'
require 'ad_manager_api'
Dotenv.load
認証
次に認証を行います。
~/ad_manager_api.ymlを作成し、設定をしている場合はAdManagerApi::Api.newだけで呼び出せますが、今回はinitializeのタイミングで認証情報を設定する必要があります。
サービスアカウントキーがある場合は以下のようにして設定します。
ad_manager = AdManagerApi::Api.new({
:authentication => {
method: 'OAUTH2_SERVICE_ACCOUNT',
application_name: 'Ruby Ad Manager Sample',
oauth2_keyfile: 'sample', # サービスアカウントのパスを記入
network_code: ENV['GOOGLE_AD_MANAGER_NETWORK_CODE']
}
})
それぞれの要素を見ます。
methodは認証方法で、OAUTH2とOAUTH2_SERVICE_ACCOUNTの二種類があります。今回はサービスアカウントを使った認証であるため、OAUTH2_SERVICE_ACCOUNTを使うことになります。
application_nameは用途や呼び出しているアプリの名前などを入れてください。これはAPIの呼び出し元を調査するときなどに使われるものです。
oauth2_keyfileはサービスアカウントキーのパスを入力します。
network_codeはGAMのネットワークコードを記入します。今回はENVで設定しているのでそれを呼び出します。
サービスアカウントキーを使う場合の認証を見ましたが、サービスアカウントキーを使わない場合oauth2_keyfileを何かしらに変えてあげると良さそうです。
どのように変えてあげると良いかですが、認証の実装のload_oauth2_service_account_credentialsメソッドを見るとわかりやすいです。
サービスアカウントキーを開き、private_keyをOpenSSL::PKey::RSA.newで読み込んだものをoauth2_keyとして設定し、またclient_emailをoauth2_issuerとして設定しています。
それを前提に認証を以下のように作成します。
ad_manager = AdManagerApi::Api.new(
{
authentication: {
method: 'OAUTH2_SERVICE_ACCOUNT',
application_name: 'Ruby Ad Manager Sample',
oauth2_issuer: ENV['GOOGLE_AD_MANAGER_CLIENT_EMAIL'],
network_code: ENV['GOOGLE_AD_MANAGER_NETWORK_CODE'],
oauth2_key: OpenSSL::PKey::RSA.new(
ENV['GOOGLE_AD_MANAGER_PRIVATE_KEY'].gsub('\\n', "\n") # envから取得した文字が改行文字が改行文字として認識されていないのでgsubで変換する
)
}
}
)
orderの取得
実装例を参考にオーダー10件を取得し、コードを作成します。
order_service = ad_manager.service(:OrderService, :v202508)
statement = ad_manager.new_statement_builder do |sb|
sb.limit = 10
end.to_statement
response = order_service.get_orders_by_statement(statement)
p response[:results]
statement_builderはorderなどgoogle ad managerに関する何かを取得する時に、絞り込みなどの条件を付与することができます。実装例を見る方が早いので詳細はそちらを確認してください。
今回は10件取得するだけなので、limitを指定するのみになっています。
すべて取得したい場合はoffsetを利用し以下のようにすると良いでしょう。
offset = 0
orders = []
response = nil
LIMIT = 10
order_service = ad_manager.service(:OrderService, :v202508)
loop do
statement = ad_manager.new_statement_builder do |sb|
sb.limit = LIMIT
sb.offset = offset
end.to_statement
response = order_service.get_orders_by_statement(statement)
offset += LIMIT
orders += response[:results] || []
break if response[:results].nil? || response[:results].size < LIMIT
sleep 1
end
p orders
コードブロックで記述した部分を合体して、ファイルを実行すればオーダーが取得できるようになっていると思います。
まとめ
正直~/ad_manager_api.ymlとサービスアカウントキーを使って認証をした方が、ローカルでちょっと試す場合は圧倒的に楽だと思います。
ただ、~/ad_manager_api.ymlを使いたくない場合やサービスアカウントキーのファイルを直接使わず、最低限の認証情報だけでやりたい場合もあると思うのでその場合の参考になれば幸いです。