AdMobからOAuth2認証してWeb認証なしでデータ取得する

#概要
AdMobからデータ取得するまでの一連の流れを説明します。バッチ等定期的にデータを取得するという用途で利用したいため、Web認証を必要としないやり方で設定及び実装しています。

#手順の大まかな流れ
1. googleのデベロッパーコンソールから必要な情報を設定し、クライアントIDとクライアントシークレットを取得する。
1. googleのデベロッパーコンソールからAdSense Management APIを有効にする。
1. 取得したクライアントIDから認証コードを取得する。
1. 認証コード、クライアントIDとクライアントシークレットを使い、リフレッシュトークンを取得する。
1. クライアントIDとクライアントシークレット、リフレッシュトークンがあればアクセストークンが取得でき、APIを実行できる。

#ポイント
- AdMobからデータを取得するためのAPIはAdSense Management APIとなっている。
- 通常のWebからのOAuthと一部設定が異なる。コンソールで登録時、アプリケーションの種類をその他にしたり等。
- 一回APIを取得するだけならアクセストークンを取るだけでよいが、アクセストークンは有効期限があるので、バッチで継続的に取得するような用途の場合はリフレッシュトークンを取得する必要がある。

#詳細な手順

##クライアントIDとクライアントシークレットを取得する。

デベロッパーコンソールを開き、認証情報を開く。「作成」を押下。

https://console.developers.google.com/

![01-make-auth.png](https://qiita-image-store.s3.amazonaws.com/0/145904/97e7e286-091b-643a-9d95-b912362f8f0e.png)

初回はプロジェクトを作る必要があるので作成する。
![02-make-project.png](https://qiita-image-store.s3.amazonaws.com/0/145904/e3ec696d-14d5-3092-1601-ac66b19336e1.png)

認証情報に戻り、認証情報を作成。種類は「OAuthクライアントID」を選択。
![03-select-oauth-client-id.png](https://qiita-image-store.s3.amazonaws.com/0/145904/ed67e5ae-f36f-adb0-f953-1964eee2177e.png)

サービスを設定する必要があるので「同意画面を設定」を押下。
![04-make-client_id.png](https://qiita-image-store.s3.amazonaws.com/0/145904/1b1790e6-75b7-adc4-89e8-90c63bf6748a.png)

メールアドレスは入力済み。サービス名に適切なものを設定。他は入力不要。
![05-edit-client-info.png](https://qiita-image-store.s3.amazonaws.com/0/145904/46439127-1de3-7649-98cb-e219b3467ed9.png)

アプリケーション種類が選べるようになっているので「その他」を設定。
![06-select-other.png](https://qiita-image-store.s3.amazonaws.com/0/145904/bc30e980-7d80-30bd-e91e-addee3c9695f.png)

OAuthクライアントのクライアントIDとシークレットを取得。記録しておく。
![07-get-oauth-client_id_secret.png](https://qiita-image-store.s3.amazonaws.com/0/145904/2d5cf4b2-78d2-95ca-605c-f9f0f07ca8ef.png)

##AdSense Management APIを有効にする

ライブラリでAdSenseで検索、AdSense Management APIを選択。
![08-search-adsense-api.png](https://qiita-image-store.s3.amazonaws.com/0/145904/b3977968-adf5-92ea-1532-c33521312aec.png)

AdSense Management APIを有効にする。
![09-set-available-adsense-api.png](https://qiita-image-store.s3.amazonaws.com/0/145904/57ac340c-016d-a6c4-d107-8dace593cbe8.png)

##認証コードを取得する

以下のURLをブラウザから開く。client_idの所には取得したクライアントIDを設定する。

```
https://accounts.google.com/o/oauth2/auth?client_id=<<ここにクライアントIDを入れる>>&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadsense&response_type=code&access_type=offline
```

認証画面が出る。許可を選択。

![10-get-access-key.png](https://qiita-image-store.s3.amazonaws.com/0/145904/1ef37ab1-907a-1138-6dbb-2b7f0beca67a.png)

認証コードが取得できる。

![11-get-access-key.png](https://qiita-image-store.s3.amazonaws.com/0/145904/6bf4b694-0853-8d26-4790-9b5dcc955793.png)

##リフレッシュトークンを取得する

curlが使えるコンソール上から以下のコマンド実施。

```
curl --data "code=<<ここに認証コードを入れる>>" --data "client_id=<<ここにクライアントIDを入れる>>" --data "client_secret=<<ここにクライアントシークレットを入れる>>" --data "redirect_uri=urn:ietf:wg:oauth:2.0:oob" --data "grant_type=authorization_code" --data "access_type=offline" https://www.googleapis.com/oauth2/v4/token
```

アクセストークンとリフレッシュトークンが取得できる。リフレッシュトークンを記録しておく。

```
{
 "access_token": "<<アクセストークン>>",
 "token_type": "Bearer",
 "expires_in": 3600,
 "refresh_token": "<<リフレッシュトークン>>"
}
```

##バッチからAPIを呼び出す

リフレッシュトークンから毎回アクセストークンを取得して、APIドキュメントに基づいてAPIを呼び出す。以下はPHPで期間のデータを取得する例。API自体の仕様は以下参照。
https://developers.google.com/adsense/management/v1.4/reference/?hl=ja

```
define('CLIENT_ID','<<クライアントID>>');
define('CLIENT_SECRET','<<クライアントシークレット>>');
define('RERESH_TOKEN','<<リフレッシュトークン>>');

$cmd='curl --data "refresh_token='.RERESH_TOKEN.'" --data "client_id='.CLIENT_ID.'" --data "client_secret='.CLIENT_SECRET.'" --data "grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token';
exec($cmd,$output,$return_var);
$output_str="";
foreach($output as $val){
	$output_str.=$val;
}
$data=json_decode($output_str,true);

$params = array(
    'access_token' => $data['access_token'],
    'startDate' => '<<取得開始日>>',
    'endDate' => '<<取得終了日>>',
    'dimension' => 'AD_UNIT_NAME',
    'metric' => 'EARNINGS',
    'useTimezoneReporting' => 'true',
);

$res = file_get_contents('https://www.googleapis.com/adsense/v1.4/reports?' . http_build_query($params));
$data=json_decode($res,true);
var_dump($data);
```

#参考
AdWords APIでのOAuth認証の流れ
https://developers.google.com/adwords/api/docs/guides/authentication?hl=ja