Movable Type CMSプラットフォーム Movable Type
ドキュメントサイト

Blogブログ

詳説 Data API 2.0 Vol.6: アクセスデータからアクセスランキングを作成する

ウェブサイトのアクセスデータを元に、人気のある記事をランキング形式で表示したり、日々のアクセス数を Movable Type の管理画面に表示したりする。そんなことも、Data API なら簡単におこなうことができます。

Google Analytics のデータを扱うだけなら、Google が提供する API を利用することもできますが、API が変更されたり、認証方式が変更されるといった Google 側の変更に追従する必要があります。Data API を利用すれば、Google Analytics とのやりとりを気にせずに Data API の記述だけでアクセスデータを取得できるため、Movable Type のアップデートだけ行っていれば、ウェブサイト側の変更はほとんどの場合、必要ありません。

さて、詳説 Data API 2.0、第六回目となる今回は、そんなアクセスデータに関する API について解説します。

Google Analytics 連携を設定する

Data API で、アクセスデータを取得するには、Movable Type 6.0 から提供されている、Google Analytics 連携機能を有効にする必要があります。 Google Analytics 連携の設定方法については、以下のドキュメントをご参照ください。

リソース情報

Data API から取得できるリソースデータは、通常であれば1種類だけですが、アクセスデータの場合は、2種類の形式が有ります。

ページ単位のアクセスデータ

ページ単位のページビューや、セッション数を Data API から取得する際には、こちらのリソース情報が返ってきます。リソースの中には、アクセス数の他にも当該パスが表す記事の ID や、archiveType などの情報も含まれています。

e.g. 返却される リソースの例
    {
      "totalResults": 2,
      "items": [
        {
          "entry": null,
          "pageviews": "56",
          "author": null,
          "path": "/",
          "title": "Your site",
          "archiveType": "index",
          "category": null,
          "startDate": null
        },
        {
          "entry": {
            "id": "1198"
          },
          "pageviews": "44",
          "author": null,
          "path": "/2015/03/exapmle.html",
          "title": "Entry title is here",
          "archiveType": "Individual",
          "category": null,
          "startDate": null
        },
      ],
      "totals": {
        "pageviews": "329"
      }
    }

日付単位のアクセスデータ

日付単位のページビューや、セッション数を Data API から取得する際には、こちらのリソース情報が返ってきます。ページ単位のリソースとは違い、単純に日付とアクセス数が含まれています。

e.g. 返却される リソースの例
    {
        "totalResults": 2,
        "items": [
          {
            "visits": "1",
            "date": "2015-05-20"
          },
          {
            "visits": "1",
            "date": "2015-05-21"
          },
    }
リソース情報
https://www.movabletype.jp/developers/data-api/v2-reference.html#stats

ページ単位のページビュー数を取得する

ページ単位のページビュー数を取得できます。記事やウェブページなどの個別ページにかぎらず、インデックスや月別・カテゴリ別などのアーカイブページも含まれます。ページタイトルを変更している場合などのとき、同じパス名のデータが Google Analytics から帰る場合があります。この時には、uniquePath パラメータに 1 を指定します。

エンドポイント
GET http(s)://path/to/mt-data-api.cgi/v2/sites/:site_id/stats/path/pageviews
サンプル

このサンプルでは、直近1ヶ月のアクセス数の多いページを10件取得して、ランキングを作成するための、アクセスデータの取得と加工について PHP で例示します。(PHPによるサーバーサイド実行にしているのは、アクセス統計データを取得するには、ユーザー認証を必要とするため、クライアントサイドで処理される JavaScript などにはユーザーIDやパスワード含まないほうが良いためです)

※ 実際には、各種エラー処理を考慮する必要があります。

<?php
// Constants
define("API_PATH", "http://path/to/your/mt-data-api.cgi"); // Should be changed.
$username = 'your-username';  // Should be changed.
$password = 'your-password';  // Should be changed.
$siteId   = 'your-site-id';   // Should be changed.

// Authentication
$tokens = authentication($username, $password);
$accessToken = $tokens->accessToken;

// Retrieve Pageview Data
$cnt    = 0;
$data = array();

// Get Stats Data
$resp  = get_pageview_data($accessToken, $siteId, 20);

// Processing
$size = count($resp->items);
for ($i = 0; $i < $size; $i++) {
    if ($cnt == 10) break;

    $item = $resp->items[$i];
    if ($item->archiveType != 'Individual') continue; // This item is not an entry data.

    $entry_id = $item->entry->id;
    $entry = get_entry($siteId, $entry_id);
    $data[$cnt] = [
      'entry' => [
        'id' => $entry_id,
        'permalink' => $entry->permalink,
        'title' => $entry->title,
      ],
      'pageviews' => $item->pageviews,
    ];
    $cnt++;
}

header('Content-Type: application/json; charset=utf-8');
echo json_encode( $data );
exit;

function authentication( $username, $password ) {
    // Authentication
    $api = API_PATH . '/v2/authentication';
    $auth_params = array(
      'username' => $username,
      'password' => $password,
      'clientId' => 'favrank',
      'remember' => 1,
    );

    $curl = curl_init($api);

    $options = array(
      CURLOPT_POST           => TRUE,
      CURLOPT_POSTFIELDS     => http_build_query($auth_params),
      CURLOPT_RETURNTRANSFER => TRUE,
    );
    curl_setopt_array($curl, $options);

    $response = json_decode(curl_exec($curl));
    return $response;
}

function get_pageview_data($token, $site_id, $limit) {
    $startDate = date('Y-m-d', strtotime("- 30 days"));
    $endDate = date('Y-m-d');
    $api = API_PATH . '/v2/sites/' . $site_id . '/stats/path/pageviews?startDate='
      . $startDate . '&endDate=' . $endDate . '&uniquePath=1&limit=' . $limit;
    if ( $offset > 0 ) {
        $api .= '&offset=' . $offset;
    }

    $curl = curl_init($api);

    $header = [
        'X-MT-Authorization: MTAuth accessToken=' . $token,
    ];

    $options = array(
      CURLOPT_CUSTOMREQUEST  => 'GET',
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER     => $header
    );
    curl_setopt_array($curl, $options);

    $response = json_decode(curl_exec($curl));
    return $response;
}

function get_entry($site_id, $entry_id) {
    $api = API_PATH . '/v2/sites/' . $site_id . '/entries/' . $entry_id
      . '?fields=title,permalink';
    $curl = curl_init($api);

    $options = array(
      CURLOPT_CUSTOMREQUEST  => 'GET',
      CURLOPT_RETURNTRANSFER => TRUE,
    );
    curl_setopt_array($curl, $options);

    $response = json_decode(curl_exec($curl));
    return $response;
}
?>

ウェブページから上記 php をAjax 呼び出しなどで実行すると、以下の構造の JSON を取得できます。あとは、テンプレートエンジンや DOM 操作で挿入すれば、「最近の人気記事」を表示できます。

[
    {
        "entry": {
            "id": "123",
            "permalink": "http://example.com/top-article.html",
            "title": "This is a Top article in this site."
        },
        "pageviews": "2717"
    },
    ......
]

上記スクリプトを利用して、ランキングを表示するサンプルも併記しておきます。ウィジェットとして登録すると、サイドバーに表示できます。
jQuery を利用しているので、jQuery の読み込みが必要です。

<div class="widget-access-ranking widget">
    <h3 class="widget-header">最近の人気記事</h3>
    <div class="widget-content">
        <ul class="widget-list" id="access-ranking-list">
        </ul>
    </div>
</div>
<script>
// アクセスランキング取得
jQuery.ajax({
    url: "http://path/to/php/script",
    type: "GET",
    dataType: "json"
}).done(function(data){
    var size = data.length;
    for (var i = 0; i < size; i++ ) {
        var e = data[i].entry;
        jQuery('#access-ranking-list').append('<li class="widget-list-item"><a href="' + e.permalink + '">' + e.title + '</a></li>');
    }
});
</script>
access-ranking.png

表示例:MovableType.jpのブログ記事ランキング

ドキュメント
https://www.movabletype.jp/developers/data-api/v2-reference.html#stats-pageviewsforpath

ページ単位のセッション数を取得する

ページ単位のセッション数を取得できます。記事やウェブページなどの個別ページにかぎらず、インデックスや月別・カテゴリ別などのアーカイブページも含まれます。ページビュー数の取得と同様に、同じパス名のデータが重複して取得される場合があります。その際には、uniquePath パラメータに 1 を指定します。

Google Analytics における セッション数については、以下のドキュメントをご参照ください。

エンドポイント
GET http(s)://path/to/mt-data-api.cgi/v2/sites/:site_id/stats/path/visits
サンプル
前述の「ページ単位のページビューを取得する」で利用したサンプルの中で、"/stats/path/pageviews" となっているエンドポイントを "/stats/path/visits" に変更すると、ページビューの代わりにセッション数が取得できます。
ドキュメント
https://www.movabletype.jp/developers/data-api/v2-reference.html#stats-pageviewsfordate

日付単位のページビューを取得する

ページ単位ではなく、日付ごとにページビューの合計を取得することができます。サイト全体のアクセス状況を確認するような場合に使えます。

エンドポイント
GET http(s)://path/to/mt-data-api.cgi/v2/sites/:site_id/stats/date/pageviews
サンプル

このサンプルでは、直近10日間のアクセス数を取得する。というコードを PHP で例示します。(PHPによるサーバーサイド実行にしているのは、アクセス統計データを取得するには、ユーザー認証を必要とするため、クライアントサイドで処理される JavaScript などにはユーザーIDやパスワード含まないほうが良いためです)

※ 実際には、各種エラー処理を考慮する必要があります。

<?php
// Constants
define("API_PATH", "http://path/to/your/mt-data-api.cgi"); // Should be changed.
$username = 'your-username';  // Should be changed.
$password = 'your-password';  // Should be changed.
$siteId   = 'your-site-id';   // Should be changed.

// Authentication
$tokens = authentication($username, $password);
$accessToken = $tokens->accessToken;

// Retlieve Pageviews Data
$cnt    = 0;
$data = array();

// Get Stats Data
$resp  = get_pageview_data($accessToken, $siteId, 10);
header('Content-Type: application/json; charset=utf-8');
echo json_encode( $resp );
exit;

function authentication( $username, $password ) {
    // Authentication
    $api = API_PATH . '/v2/authentication';
    $auth_params = array(
      'username' => $username,
      'password' => $password,
      'clientId' => 'favrank',
      'remember' => 1,
    );

    $curl = curl_init($api);

    $options = array(
      CURLOPT_POST           => TRUE,
      CURLOPT_POSTFIELDS     => http_build_query($auth_params),
      CURLOPT_RETURNTRANSFER => TRUE,
    );
    curl_setopt_array($curl, $options);

    $response = json_decode(curl_exec($curl));
    return $response;
}

function get_pageview_data($token, $site_id, $limit) {
    $startDate = date('Y-m-d', strtotime("- $limit days"));
    $endDate = date('Y-m-d');
    $api = API_PATH . '/v2/sites/' . $site_id . '/stats/date/pageviews?startDate='
      . $startDate . '&endDate=' . $endDate . '&uniquePath=1&limit=' . $limit;
    $curl = curl_init($api);

    $header = [
        'X-MT-Authorization: MTAuth accessToken=' . $token,
    ];

    $options = array(
      CURLOPT_CUSTOMREQUEST  => 'GET',
      CURLOPT_RETURNTRANSFER => TRUE,
      CURLOPT_HTTPHEADER     => $header
    );
    curl_setopt_array($curl, $options);

    $response = json_decode(curl_exec($curl));
    return $response;
}
?>

ウェブページから上記 php をAjax呼び出しなので実行すると、以下の構造の JSON を取得できます。取得したデータをもとに、テンプレートエンジンや DOM 操作で挿入すれば、「この10日間のサイト全体のページビュー」を表示できます。

[
  {
    "pageviews": "1338",
    "date": "2015-05-22"
  }
  ......
]
ドキュメント
https://www.movabletype.jp/developers/data-api/v2-reference.html#stats-visitsforpath

日付単位のセッション数を取得する

ページビューだけでなく、セッション数を日付別に取得することもできます。

エンドポイント
GET http(s)://path/to/mt-data-api.cgi/v2/sites/:site_id/stats/date/visits
サンプル
前述の「日付単位のセッション数を取得する」で利用したサンプルの中で、"/stats/date/pageviews" となっているエンドポイントを "/stats/date/visits" に変更することで、ページビューではなく、セッション数を取得するようになります。
ドキュメント
https://www.movabletype.jp/developers/data-api/v2-reference.html#stats-visitsfordate

Google Analytics と連動したアクセス統計データを Data API からも簡単に習得、利用することができます。ぜひ、試してみてください。

  • このエントリーをはてなブックマークに追加