Hello Analytics API チュートリアルをやってみる

Google Analytics のデータをプログラムで扱う方法を学ぶために Tutorial: Hello Analytics API をやってみました

公開されているサンプルコードは、最新のAPIでない部分が含まれているようで、一部関数名等が合わないのでそのままでは動作しません。また、チュートリアルをより簡単に試せるようにサンプルコードをWordPress のプラグイン形式へ変更してみました (^^)

Analytics のデータを取得するには、いろいろ手順を踏んでいく必要があります

プログラミング環境構築

まずは、環境を作成していく必要があります
今回は、XAMPPを使ったローカル環境の WordPress 上にプラグインとして作成していきます

環境の構築方法は、プログラム開発雑記 に関連記事を紹介してありますので、そちらを参照して下さい
ここでは、使用するライブラリについて説明します

Google APIs Client Library for PHP リンク先ページに移動してライブラリファイルを取得します

  1. 最新版をダウンロード (google-api-php-client-0.6.2.tar.gz)
  2. アーカイブからライブラリを抽出し、plugins フォルダ下に HlloAnalytics フォルダを作成して、ライブラリをコピーします
  3. HelloAnalytics.PHP ファイルを作成してライブラリをインクルードします

GoogleAPIClientLib

ここまでで、プログラムを作成する準備の第一段階が終了です
次に、アナリティクスへアクセスするためのキーを作成します

Create an Analytics Service Object

既にアナリティクスは、利用しているものとして話を進めます
利用されていない場合は、先に登録をしてから読み進めて下さい

  1. Google APIコンソールでプロジェクトを登録
  2. デモプログラム
  3. プログラム説明:Analyticsデータアクセスの認証と許可
  4. プログラム説明:Analyticsサービスオブジェクト作成

何をするかというと、アプリケーションからアナリティクスへアクセスするためのキーを発行する作業です

Google APIのコンソールでプロジェクトを登録

1.Google APIs Console リンク先ページヘ移動します

clip_image001

2.サインインしてプロジェクトを作成、又は既存のプロジェクトを使用します

3.Services pane を開き、Analytics API を有効化します(利用規約への同意が必要)

clip_image002

Analytics API の Status を ON にします

clip_image003

4.API Access pane: を開きます

API_Access1N

5.Create an OAuth 2.0 client ID…. をクリックします

ちょっとキャプチャーを失敗しましたが、ここで「Product name」と 「Home Page URL」を登録します
Product name は、プログラム名の HelloAnalytics としておきます
Home Page URL は、アナリティクスを行なっているサイトのURLです

この情報は、認証処理をする画面に表示されます

次に進みます
Web application を選択します
サイト名は、認証後にリダイレクトして表示されるページのサイト名なので、localhost にしておきます
(クライアントIDを作成した後、Redirect URI は、編集して変更します)
Create client ID をクリックします

clip_image005

6.アクセスキーが作成されました

API_Access3N

  • Client ID
  • Client secret
  • Redirect URIs
  • API Key

リダイレクト先の修正は、Client ID の Edit settings をクリックしてリダイレクト先を変更します
実行環境により変わりますが、これから作成するプラグインプログラムを指定します

ridirectURI

デモプログラム

<?php
/*
  Plugin Name: Hello Analytics 
  Plugin URI: 
  Description: Hello Analytics 
  Author: enomoto@celtislab
  Version: 0.1.0
  Author URI: http://celtislab.net/
------------------------------------------------------------ 
Tutorial: Hello Analytics API


Google Analyticsアカウントにアクセスするためのサンプルプログラムを WordPress の plugin 形式に修正しました

Google APIs Client Library for PHP
https://code.google.com/p/google-api-php-client/
最新のライブラリをダウンロードして、解凍して google-api-php-client フォルダー以下を Hello Analytics プラグインと同じフォルダへ置いて下さい

Analytics アクセスに必要な client id, client secret, redirect uri, DeveloperKey を取得して、このファイルの const 定義部分を書き換えます
    const CLIENTID     = 'insert_your_oauth2_client_id';
    const CLIENTSECRET = 'insert_your_oauth2_client_secret';
    const REDIRECTURI  = 'http://localhost/wordpress/wp-admin/options-general.php?page=HelloAnalytics/HelloAnalytics.php';
    const DEVELOPERKEY = 'insert_your_simple_api_key';

リダイレクト先は、認証後に表示するぺーじなので、WordPress の管理画面の HelloAnalytics プラグインファイルを指定です
この例では、ローカル環境の wordpressパスにワードプレスをインストールしている場合です
Google APIs Console から作成した Client ID の Redirect URIs と一致している必要があります

WordPress の plugins フォルダに HelloAnalytics フォルダを作成して、このファイル HelloAnalytics.php をコピーします
管理画面のプラグイン一覧から有効化して下さい
管理画面の Hello Analytics 設定画面で認証を行います
外観→ウィジェットに Hello Analytics ウィジェットが追加されているので、表示したいサイドバーへ配置して下さい

ウィジェットが表示されるページをアクセスするとアナリティクスから取得したデータが表示されます
ちなみに、表示しているデータは、getResults 関数内でベタ書きしていますので適当に修正して下さい

 */

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_AnalyticsService.php';

$hello_analytics = new Hello_analytics();

class Hello_analytics {
    
    // Visit //code.google.com/apis/console?api=analytics to generate your
    // client id, client secret, and to register your redirect uri.
    const CLIENTID     = 'insert_your_oauth2_client_id';
    const CLIENTSECRET = 'insert_your_oauth2_client_secret';
    const REDIRECTURI  = 'http://localhost/wordpress/wp-admin/options-general.php?page=HelloAnalytics/HelloAnalytics.php';
    const DEVELOPERKEY = 'insert_your_simple_api_key';

    public $gclient;

    //コンストラクタ
    public function __construct() {

        session_start();

        $client = new Google_Client();
        $client->setApplicationName('Hello Analytics API Sample');
        $client->setClientId(self::CLIENTID);
        $client->setClientSecret(self::CLIENTSECRET);
        $client->setRedirectUri(self::REDIRECTURI);
        $client->setDeveloperKey(self::DEVELOPERKEY);
        $client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));

        // Magic. Returns objects from the Analytics Service instead of associative arrays.
        $client->setUseObjects(true);

        if (isset($_SESSION['token'])) {
            if (isset($_REQUEST['logout'])) {
              unset($_SESSION['token']);
              $client->revokeToken();
            }
        }
        else {
            if (isset($_GET['code'])) {
              $client->authenticate();
              $_SESSION['token'] = $client->getAccessToken();
            }
        }

        if (isset($_SESSION['token'])) {
            $client->setAccessToken($_SESSION['token']);
        }

        $this->gclient = $client;
        
        add_action('widgets_init', array(&$this, 'my_register_wedgets'));
        if(is_admin()) {
            add_action('admin_menu', array(&$this, 'my_option_menu'));
            add_action('admin_init', array(&$this, 'my_option_register'));
        }
        else {
       }
    }

    public function my_option_menu()
    {
        $page = add_options_page( 'Hello analytics Settings', __('Hello analytics'), 'manage_options', __FILE__, array(&$this,'hello_analytics_options'));
    }

    public function my_option_register()
    {
        register_setting('hello_analytics_optiongroup', 'hello_analytics_option');
    }

    public function hello_analytics_options() {
       ?>
          <p>Hello Analytics Test</P>
      <?php

        $client = $this->gclient;
        if (!$client->getAccessToken()) {
          $authUrl = $client->createAuthUrl();
          print "<a class='login' href='$authUrl'>Connect Me!</a>";
        } 
        else {
            $url = self::REDIRECTURI . '&logout=0';
            print "<a class='logout' href='$url'>Logout</a>";
        }
   }

   public function my_register_wedgets()
   {
        register_widget("Hello_analytics_widget");
   }
}    

//-------------------------------------------------------------------------
class Hello_analytics_widget extends WP_Widget {
    
    function __construct() {
        $name = 'Hello analytics';
        $widget_ops = array('classname' => 'Hello_analytics_widget', 'description' => __('Hello Analytics sample program'));
        parent::__construct( false, $name, $widget_ops );
    }

    function widget( $args, $instance ) {

        global $hello_analytics;
        $client = $hello_analytics->gclient;

        $before_widget  = "";
        $before_title   = "";
        $after_title    = "";
        $after_widget   = "";
        extract($args);
        $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']);
        echo $before_widget;
        if ( !empty( $title ) ) {
            echo $before_title . $title . $after_title;
        }
        ?>
    <div class="textwidget">
    <?php 

        if ($client->getAccessToken()) {
            $analytics = new Google_AnalyticsService($client);
            $this->runMainDemo($analytics);    
        }
        else {
            echo 'アクセス権がありません。管理画面から Hello Analytics の認証をして下さい。';
        }
    ?>
    </div>
    <?php
        echo $after_widget;
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags($new_instance['title']);
        return $instance;
    }

    function form( $instance ) {
        $default  = array( 'title' => '');
        $instance = wp_parse_args( (array) $instance,  $default);
        $ttl      = array('id'  => $this->get_field_id('title'),
                          'name'=> $this->get_field_name('title'),
                          'val' => strip_tags($instance['title']) );
    ?>
        <p>
            <label for="<?php echo $ttl['id']; ?>"><?php _e('Title:'); ?></label>&nbsp;
            <input class="widefat" id="<?php echo $ttl['id']; ?>" name="<?php echo $ttl['name']; ?>" type="text" value="<?php echo esc_attr($ttl['val']); ?>" />
        </p>
    <?php
    }
    
    function runMainDemo(&$analytics) {
      try {
        // Step 2. Get the user's first profile ID.
        $profileId = $this->getFirstProfileId($analytics);

        if (isset($profileId)) {

          // Step 3. Query the Core Reporting API.
          $results = $this->getResults($analytics, $profileId);

          // Step 4. Output the results.
          $this->printResults($results);
        }

      } catch (apiServiceException $e) {
        // Error from the API.
        print 'There was an API error : ' . $e->getCode() . ' : ' . $e->getMessage();

      } catch (Exception $e) {
        print 'There wan a general error : ' . $e->getMessage();
      }
    }

    function getFirstprofileId(&$analytics) {
      $accounts = $analytics->management_accounts->listManagementAccounts();

      if (count($accounts->getItems()) > 0) {
        $items = $accounts->getItems();
        $firstAccountId = $items[0]->getId();

        $webproperties = $analytics->management_webproperties->listManagementWebproperties($firstAccountId);

        if (count($webproperties->getItems()) > 0) {
          $items = $webproperties->getItems();
          $firstWebpropertyId = $items[0]->getId();

          $profiles = $analytics->management_profiles->listManagementProfiles($firstAccountId, $firstWebpropertyId);

          if (count($profiles->getItems()) > 0) {
            $items = $profiles->getItems();
            return $items[0]->getId();

          } else {
            throw new Exception('No profiles found for this user.');
          }
        } else {
          throw new Exception('No webproperties found for this user.');
        }
      } else {
        throw new Exception('No accounts found for this user.');
      }
    }

    function getResults(&$analytics, $profileId) {
       return $analytics->data_ga->get(
           'ga:' . $profileId,
           '2013-07-08',
           '2013-07-08',
           'ga:visits');
    }
    
    function printResults(&$results) {
      if (count($results->getRows()) > 0) {
        $profileName = $results->getProfileInfo()->getProfileName();
        $rows = $results->getRows();
        $visits = $rows[0][0];

        print "<p>First profile found: $profileName</p>";
        print "<p>Total visits: $visits</p>";

      } else {
        print '<p>No results found.</p>';
      }
    }
}
?>

 
Analyticsデータアクセスの認証と許可

ユーザーが、Google Analytics APIで構築されたアプリケーションを起動した時にデータアクセスを許可する必要があります。OAuth2.0 を用いてユーザーを認証し、権限を与えます

HelloAnalytics.php プログラムの認証と許可の処理部分です

プログラムの  Hello_analytics クラス部分が相当します

  1. ライブラリをロード
  2. アクセス許可情報を保持する為にセッションを開始
  3. クライアントオブジェクトの作成と構成
  4. サーバーからの認証フロー処理
  5. 保持されているアクセス許可情報を使用
  6. デモプログラム(管理画面での認証許可)

プログラムの 39,40 行で使用ライブラリをロードしています

accessTokenオブジェクトにアクセス許可情報を格納します

accessTokenオブジェクトは、実行毎に再認証しなくて済むようにPHPセッションストレージ($_SESSION)を使用して保存します

session_start(); でセッションを初期します(保存と読み出し)

プログラムの 60-69 行でクライアントオブジェクト作成と構成を行なっています

承認プロセスを簡素化するために、Clientオブジェクトを使用します

48-51 行に定義している Client ID, Client secret, Redirect URI, Developer Key 情報を各々の情報に書き換えて下さい

認証フロー処理

認証の開始とログアウト処理は、管理モードの HelloAnalytics 設定画面(109-123行)で行います

connectme

ユーザーが Connect Me! リンクをクリックすることで、承認を開始し、Googleに送信され、許可されると、指定されているリダイレクトURIフィールドの値に基づいて、HelloAnalytics.phpページへ認証コードとともにリダイレクトが行われます

login

ちなみにリダイレクト先のデータが一致しない場合はこんなエラー表示となります

redirecterror

Google APIs Console から登録したリダイレクト先とプログラムで指定しているリダイレクト先が一致しているか確認して、間違っていたら修正して再トライです

リダイレクトされると 78-81行でURLに含まれていた code を取得して $client->authenticate(); で承認作業を行い、accessToken をセッションストレージに保持します

また、セッションストレージに accessToken が保持されていれば、次回からは認証処理せずに保存されていた資格情報を使用することが出来ます

また、オリジナルのチュートリアルにはありませんでしたが、ログアウト処理を付け加えています

保持している accerssToken データを HelloAnalytics 設定画面から logout リンクをクリックすることで行い 71-75行で accessToken 情報をクリアしています

logout

 

Analyticsサービスオブジェクト作成

HelloAnalytics.php プログラムのアナリティクスデータ取得と結果表示の処理部分です

プログラムの  Hello_analytics_widget クラス部分が相当します

ウィジェットになっていますので、管理モードの外観→ウィジェットから表示させたいサイドバーへ Hello Analytics ウィジェットを置きます

ページを表示した時にサイドバーにアナリティクスから取得した情報が表示されます

  1. Analytics サービスオブジェクトを作成
  2. ユーザーの最初のプロファイルIDを取得
  3. コアレポーティングAPIを問い合せ
  4. 結果出力

プログラムの 159-165行でデータの取得と結果表示を行なっています

アクセストークンがあれば Analytics サービスオブジェクトを作成して、データを要求します

アクセストークンがなければ ‘アクセス権がありません。管理画面から Hello Analytics の認証をして下さい。’ と表示しています

runMainDemo 関数

最初のプロファイルID取得、問い合わせ、結果出力の各ステップ関数を呼び出します

getFirstprofileId 関数

Analyticsアカウントの最初のプロファイルIDを取得するためにAnalyticsサービスオブジェクトを使用します

getResults 関数

プロファイルIDを使用して、コアレポーティングAPIクエリを用いて問い合わせを行います

この例では、2013年7月8日の訪問数の合計を問い合わせています

この部分をいろいろ書き換えることで様々なデータを取得することが出来るはずです

printResults 関数

問い合わせ結果を取得して表示します

正常に実行できたら、ウィジェットに下記のような感じで結果が表示されます

result

 

出来るだけオリジナルのチュートリアルに沿って説明しましたが、Core Reporting API v3.0, Management API v3.0, OAuth 2.0 の知識がたりなくて理解しきれていません

知らないことが多くいっぱいいっぱいですが、とりあえず、動くところまできました

説明不足の感はありますが、WordPressで基本的な部分の動作確認ができるようになったので興味ある方は動かして見ることが、はじめの一歩です

次のサイトで人気記事を表示する記事を見つけましたので、次は人気記事の表示に挑戦してみます (^^)

Analytics のデータは多岐に渡っていますのでアイデアしだいで面白いプラグインが出来そうな気がします

いろいろ動かしてみるのが一番良いのはわかっていますが、日本語でのわかりやすい情報がほしーい (^_^;)

関連コンテンツ


まとめ記事紹介

search star user home refresh tag chevron-left chevron-right exclamation-triangle calendar comment folder thumb-tack navicon angle-double-up angle-double-down angle-up angle-down quote-left googleplus facebook instagram twitter rss