admob(adsense)のレポート取得APIの再取得メモ


あけましておめでとうございます!!

うちで使っている既存ツールのadsenseのレポートデータを取得するAPIが、
年末休みに入ったタイミングから使えなくなったので(泣)、、再度APIを利用可能にした際のメモ

https://www.googleapis.com/adsense/v1.4/reports?startDate=##SEARCH_DATE##&endDate=##SEARCH_DATE##&accountId=pub-xxxxxxxxx&dimension=AD_UNIT_ID&dimension=AD_UNIT_NAME&dimension=DATE&metric=AD_REQUESTS&metric=CLICKS&metric=EARNINGS&useTimezoneReporting=true

なんかこんなエラーレスポンスが

{
"error": {
 "errors": [
  {
   "domain": "global",
   "reason": "authError",
   "message": "Invalid Credentials",
   "locationType": "header",
   "location": "Authorization"
  }
 ],
 "code": 401,
 "message": "Invalid Credentials"
}
}

認証系で問題があるようなので、もうちょっと調べると

{
 "error": "invalid_grant",
 "error_description": "Account has been deleted"
}

アカウントが削除されましたって。。。汗

年末の休みに入ったタイミングで、、、泣

Googleさんの「APIs Explorer」で対象のAPIを試し打ちできる画面で確認

adsenseのレポートを確認するため、

「AdSense Management API」 を選択

「adsense.reports.generate」を選択

Authorize requests using OAuth 2.0を「ON」にすると、このような画面になるので、
スコープをチェックして、「Authorize」でGoogleのアカウントの認証が入ります。

その後、APIの検索クエリを入力して試してみました。

適宜項目を入力し「Authorize and excute」で実行してみると、

こんな感じで結果が見れます。

また、左メニューの「Request History」から実行履歴も見れるので便利

あとは、この画面と同じ処理をするための認証情報を用意する必要ある。

ちなみに調査対象のツールでは、下記3つ情報が必要だったので、下記3つの取得方法にしぼります。

  • client_id
  • client_secret
  • refresh_token

↓APIが利用できなくなったデータ取得コード

adsense.php
 public $client_id = "xxxxxxxxxx.apps.googleusercontent.com";
 public $client_secret = "xxxxxxxxxxxxxxx";
 public $refresh_token = "x/xxxxxxxxxxx";

 public $token_type = "";
 public $access_token = "";

 public function getAccessToken()
 {
     $post_data = array(
         'client_secret' => $this->client_secret,
         'grant_type' => 'refresh_token',
         'refresh_token' => $this->refresh_token,
         'client_id' => $this->client_id
     );
     $ch = curl_init("https://www.googleapis.com/oauth2/v4/token");
     curl_setopt($ch,CURLOPT_POST, TRUE);
     curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
     curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, FALSE);
     curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, FALSE);
     curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE);
     $out = curl_exec($ch);

     $obj = json_decode($out);
     $this->token_type = $obj->token_type;
     $this->access_token = $obj->access_token;
 }

このURLにアクセスし、

認証情報を作成する、

「OAuth クライアント ID」で作成

これで作成。

が、ちなみに僕の環境では、API認証の作成上限100をこえており、不要なものを消してから試しました。

無事作成されると、

  • クライントID
  • クライアントシークレット

が取得できるようになります。

残すは、refresh_tokenが必要なので、

↑URLにブラウザでアクセスします。

  • client_id = 先程発行したclient_idを指定
  • scope = 参照するサービスを絞る?(僕の場合は、https://www.googleapis.com/auth/adsenseを指定しました。)
  • redirect_uri = その他のクライアントIDを作成した場合は、 redirect_uriは「urn:ietf:wg:oauth:2.0:oob」にする必要があるようです。

すると、Googleアカウントの認証が再度入ったあとに、

「Authorization Code」が表示されます。
これをコピーし。

curlコマンドで下記を叩く

$ curl -k -d client_id=xxxxxxxxxxx.apps.googleusercontent.com -d client_secret=xxxxx -d redirect_uri=urn:ietf:wg:oauth:2.0:oob -d grant_type=authorization_code -d code=xxxxx https://accounts.google.com/o/oauth2/token

code = 先程のAuthorization Code

するとレスポンスで、

{
  "access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "expires_in": 3600,
  "refresh_token": "xxxxxxxx",
  "scope": "https://www.googleapis.com/auth/adsense",
  "token_type": "Bearer"
}

リフレッシュトークンが返ってくるので、
これで無事全情報が揃い、無事adsenseのレポート取得APIが使えるようになりました。

expires_inがまた使えなくなりそうで気になりますが、
追って調査したいと思います(泣)

長文最後まで見ていただきありがとうございます!
今年もよろしくおねがいします!

参考にさせて頂いた記事

https://qiita.com/kossacks/items/8d279bcc1acc2c2153ab
http://takaya030.hatenablog.com/entry/2016/09/04/164354
大変助けられました。