mainvisual

前から、ブログの人気記事ランキングをを作る必要があるな。と思っていました。 「Hatena Bookmark ranking」は一応存在するんですが、サムネイルを表示したりリダイレクトをまとめたりといったカスタマイズをするため、Google Analytics APIで実装したので、共有したいと思いおます。

作成したサンプル

作ったサンプルはこちらです。

Step1 - Google Analytics APIを使う

Googleのサービスに関するAPIは、すべて「Google Cloud Platform」から提供されています。「Google Cloud Platform」では、インフラ、機械学習、ビックデータ解析などのリソースを従量課金制で提供するサービスの総称です。

その全てはapiとして提供されており、「Google Analytics」もそこから利用できます。ただし、利用料金は無料です。

全てのリソースはプロジェクトという単位ごとに管理するため、まずは「プロジェクト」を作成した後、「Google Analytics API」を使う流れになります。

Step2 - プロジェクトの作成とAPIの有効化

まずは、ここにアクセスしてプロジェクトを作成しましょう。

今回は、プロジェクト名を「analyticsapi」とします。

プロジェクトが作成されるまでに、少し時間がかかるので待ちましょう。だいたい1〜2分で終わります。

プロジェクトが「analyticsapi」になっていることを確認し、左側のメニューダブをクリックします。

その中から、「API Manager」を選択します。

作成したてのプロジェクトでは、「Google Analytics API」を利用することはできません。利用するには、APIを有効にしなければなりません。

検索欄から、「ana」と検索すると、1番目に出てくるので、選択して有効化します。

ここをクリックすれば有効化出来ます。

Step3 - 認証情報の作成と接続

APIを有効化した後に、「Google Analytics API」に接続するための認証情報を設定する必要があります。以下の設定を進めると、jsonで記述された認証情報が書かれたファイル(秘密鍵)がダウンロードされます。この認証情報のファイルは一般的に「証明書」と言われる事が多いです。

APIを有効化する手続きが終わると、「認証情報を作成」というボタンが出てきます。

プロジェクトの認証には、「APIキー」「クライアントID」「サービスアカウント」がありますが、今回は「Google Analytics」のユーザーと連携するので「サービスアカウント」を使います。

今回は、このように設定しました。

「作成」をクリックすると、「秘密鍵」がダウンロードされます。

Step4 - Google Analyticsにユーザーの追加

「Step3」で作成した「サービスアカウント」を「Google Analytics」でユーザーとして認証させます。こうすることで、Google Analyticsのデータを「Google Cloud Platform」からAPIとして利用することが出来ます。

まずは、「管理」->「ユーザー管理」からユーザーを追加します。

「権限を与えるユーザー」には、「Step3」で作成した「サービスアカウントID」を入力して下さい。権限は「表示と分析」でOKです。

Step5 - 「VIEW ID」の確認

ライブラリを使用する時に、View IDが必要になります。以下の方法で確認ができるので、メモしておいて下さい。

Step6 - ライブラリを使う準備

APIを利用するには、Google API Client Libraryを使います。Java、Python、Ruby、JavaScriptなどほとんどの主要言語に対応しています。

今回は、PHPを使って進めていこうと思います。ライブラリを利用する前に、作業ディレクトリの作成や、composerの設定などを行っていきましょう。

準備「Composer」

phpのパッケージ管理にはcomposerを使います。macの場合、brewでインストール出来るので、サクッと準備してしまいましょう。

$ brew install composer

作業ディレクトリを作成します。

$ mkdir google-analytics-ranking && cd $_

パッケージを管理するため、composer.jsonを作成します。composer initの後、ライブラリをインストールします。

$ composer init
$ composer require google/apiclient:^2.0

ディレクトリ階層

.
├── composer.json
├── public
│   └── index.php
└── service-account.json
ファイル名 説明
composer.json composerで自動的に生成されます
public/index.php プログラムの本体です
service-account.json 「Google Cloud Platform」に接続する時に使う秘密鍵です

service-account.jsonは、「Step3」でダウンロードした秘密鍵です。

Step7 - ライブラリを使ってAPIを利用する

それでは、いよいよプログラムを作成していきます。 プログラムは、「#ディレクトリ階層」で説明しているように、public/index.phpに作成します。

ライブラリを利用するには、次のような手順で行います。

  1. ライブラリ読み込み
  2. 認証情報のセット
  3. clientオブジェクトの作成
  4. スコープなどの各種設定
  5. サービスオブジェクトの作成
  6. API接続、取得
  7. 情報表示

今回使うライブラリについての情報です。

このスクリプトを作成する上で、下記サイトを参考にしました。

ライブラリ読み込み

ライブラリの読み込みは、composerを使って行います。

include_once __DIR__ . '/../vendor/autoload.php';

認証情報のセット

1行目で「サービスアカウントの秘密鍵ファイル」、2行目で、「View ID」の設定をしています。

putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __DIR__ . '/../service-account.json');
define('GOOGLE_ANALYTICS_VIEW_ID', '123456789');

clientオブジェクトの作成

new Google_Client()でclientオブジェクトを作成した後、$client->useApplicationDefaultCredentials();を実行することで、「サービスアカウントの秘密鍵ファイル」が読み込まれます。

「秘密鍵ファイル」がちゃんと設定されているかは、if (getenv('GOOGLE_APPLICATION_CREDENTIALS'))でチェックします。

$client = new Google_Client();
if (getenv('GOOGLE_APPLICATION_CREDENTIALS')) {
  // use the application default credentials
  $client->useApplicationDefaultCredentials();
} else {
  echo missingServiceAccountDetailsWarning();
  return;
}

スコープなどの各種設定

APIを利用する前に、アプリケーション名とスコープを設定します。アプリケーション名は「適当」で大丈夫です。スコープには、下記ののように2つ設定します。(Google_Service_Analytics::ANALYTICS_READONLYだけで動くはずなんだが)

$client->setApplicationName("hackerslognet-analytics-ranking");
$client->setScopes([
  Google_Service_Analytics::ANALYTICS,
  Google_Service_Analytics::ANALYTICS_READONLY
]);

API接続、取得

$service->data_gaの正体は、new Google_Service_Analytics_Resource_DataGa()であり、Githubにて、どういうメソッドがあるのかを確認することが出来ます。

$service = new Google_Service_Analytics($client);
$results = $service->data_ga->get(
  'ga:'.GOOGLE_ANALYTICS_VIEW_ID,
  '2016-01-01',
  'today',
  'ga:sessions,ga:pageviews',        // ページビューを取得します。
  [
    'dimensions' =>  'ga:pagePath',  // ディメンションにページのパスを指定します。
    'sort' => '-ga:pageviews',       // ページビューの降順に並べます。
    'max-results' => 100,            // 取得結果を100件にします。
  ]
);

情報表示

getRows()の他にも、getItemsPerPage()getQuery()getTotalsForAllResults()など、様々な取得方法があるようです。

foreach ($results->getRows() as $row) {
  echo "<li>{$row[0]} : {$row[1]}</li>\n";
}

プログラム全体

プログラム全体は、このようになりました。

<?php
/*
 * Copyright 2017 Kosuke Akizuki.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
include_once __DIR__ . '/../vendor/autoload.php';
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __DIR__ . '/../service-account.json');
define('GOOGLE_ANALYTICS_VIEW_ID', '123456789');
/************************************************
  Make an API request authenticated with a service
  account.
 ************************************************/
function missingServiceAccountDetailsWarning() {
  $ret = "
    <h3 class='warn'>
      Warning: You need download your Service Account Credentials JSON from the
      <a href='http://developers.google.com/console'>Google API console</a>.
    </h3>
    <p>
      Once downloaded, move them into the root directory of this repository and
      rename them 'service-account-credentials.json'.
    </p>
    <p>
      In your application, you should set the GOOGLE_APPLICATION_CREDENTIALS environment variable
      as the path to this file, but in the context of this example we will do this for you.
    </p>";
  return $ret;
}
$client = new Google_Client();
if (getenv('GOOGLE_APPLICATION_CREDENTIALS')) {
  // use the application default credentials
  $client->useApplicationDefaultCredentials();
} else {
  echo missingServiceAccountDetailsWarning();
  return;
}
$client->setApplicationName("hackerslognet-analytics-ranking");
$client->setScopes([
  Google_Service_Analytics::ANALYTICS,
  Google_Service_Analytics::ANALYTICS_READONLY
]);
$service = new Google_Service_Analytics($client);
$results = $service->data_ga->get(
  'ga:'.GOOGLE_ANALYTICS_VIEW_ID,
  '2016-01-01',
  'today',
  'ga:sessions,ga:pageviews',        // ページビューを取得します。
  [
    'dimensions' =>  'ga:pagePath',  // ディメンションにページのパスを指定します。
    'sort' => '-ga:pageviews',       // ページビューの降順に並べます。
    'max-results' => 100,            // 取得結果を100件にします。
  ]
);
?>






<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Google Analytics Ranking</title>
</head>
<body>

<ul>
  <?php
    foreach ($results->getRows() as $row) {
      echo "<li>{$row[0]} : {$row[1]}</li>\n";
    }
  ?>
</ul>

</body>
</html>

まとめ

Google関連のAPIは便利なものがたくさんありますが、使うための情報を集めるには一苦労しました。プログラムを書くにも、ライブラリのソースコードを読む必要があり、作成の敷居を高く感じます。

この、まとめを元に自分も色々作ることができればいいなと思いました。

補足: その他参考サイト

comments powered by Disqus