ニュース

Nodo.js から Piwik トラッキング API の利用について

2014年06月30日 トピックス ニュース

Frederic Hemberger 2014/06/25

Piwik を使用してアクセス解析を行っている場合、時としてウェブサイトのビジター以外をトラッキングしたいこともあります。
例えば、最新の Web サービスの多くは RESTful な API を提供しています。それらのリクエストを追跡するために Piwik を使用してみてはいかがでしょうか。

これはあなたが提供している Web サービスがどのようにユーザーに利用されているかを、より正確に分析することができます。
例えば、あなたの API は通常の Web サイトと比較してどの程度使用されている?もっとも利用されているサービスは?そして、どのツールが一番 API を利用しているのでしょうか。

Node.js をアプリケーションプラットフォームに使用している場合、Piwik-tracker が使用できます。 これは Piwikのトラッキング用 HTTP APIの軽量なラッパープログラムです。あなたが求めるトラッキングに役立つでしょう。

まずプロジェクトの依存関係として Piwik-tracker のインストールを開始します。

npm install piwik-tracker --save

次に、Piwik の URL と、追跡するプロジェクトのサイト ID で新しいトラッキングインスタンスを作成します。Piwik で解析するには、完全修飾 URL を必要とします。実際のリクエスト URL の前に追加してください。

var PiwikTracker = require('piwik-tracker');

// Initialize with your site ID and Piwik URL
var piwik = new PiwikTracker(1, 'http://mywebsite.com/piwik.php');

// Piwik works with absolute URLs, so you have to provide protocol and hostname
var baseUrl = 'http://example.com';

// Track a request URL: 
piwik.track(baseUrl + req.url);

もちろん、単なるURLの追跡以上のことが可能です。: Piwik トラッキング HTTP API リファレンス で提供されているすべてのパラメータがサポートされており、カスタム変数も含まれます。なお Piwik の API が呼び出すのは、JSON 文字列として参照されています。読みやすくするには手動でエンコーディングする代わりに JSON.stringify({}) を使用してください。

piwik.track({
    // The full request URL
    url: baseUrl + req.url,

    // This will be shown as title in your Piwik backend
    action_name: 'API call',

    // User agent and language settings of the client
    ua: req.header('User-Agent'),
    lang: req.header('Accept-Language'),

    // Custom request variables
    cvar: JSON.stringify({
      '1': ['API version', 'v1'],
      '2': ['HTTP method', req.method]
    })
});

既に分かっているかもしれませんが、HTTP ヘッダフィールドやステータスコード、リクエストメソッド(GET, POST, PUT, etc.)のように、Node.js のリクエストオブジェクトを任意のフィールドに沿って引き渡すができます。これでニーズのほとんどをカバーしている筈です。

今のところ、全てのリクエストは、Node.js アプリケーションの IP アドレス/ホスト名で追跡されます。もし API を使用しているユーザーの IP アドレスを解析データに表示したい場合、 シークレットな Piwik のトークンが必要になります。そして Piwik のデフォルト設定を上書きしてください:

function getRemoteAddr(req) {
    if (req.ip) return req.ip;
    if (req._remoteAddress) return req._remoteAddress;
    var sock = req.socket;
    if (sock.socket) return sock.socket.remoteAddress;
    return sock.remoteAddress;
}

piwik.track({
    // …
    token_auth: '<YOUR SECRET API TOKEN>',
    cip: getRemoteAddr(req)
});

これで追跡に必要なすべての値を収集できます。基本的な作業はこれで完了です。もし Express やバックエンドのために restify を使用している場合、さらに踏み込んだトラッキングリクエストも容易となり、カスタムミドルウェアにすべてをまとめることもできるでしょう。

まず新しいミドルウェアの Basic コードからスタートして lib/express-piwik-tracker.js という名前で保存します:

// ./lib/express-piwik-tracker.js
var PiwikTracker = require('piwik-tracker');

function getRemoteAddr(req) {
    if (req.ip) return req.ip;
    if (req._remoteAddress) return req._remoteAddress;
    var sock = req.socket;
    if (sock.socket) return sock.socket.remoteAddress;
    return sock.remoteAddress;
}

exports = module.exports = function analytics(options) {
    var piwik = new PiwikTracker(options.siteId, options.piwikUrl);

    return function track(req, res, next) {
        piwik.track({
            url: options.baseUrl + req.url,
            action_name: 'API call',
            ua: req.header('User-Agent'),
            lang: req.header('Accept-Language'),
            cvar: JSON.stringify({
              '1': ['API version', 'v1'],
              '2': ['HTTP method', req.method]
            }),
            token_auth: options.piwikToken,
            cip: getRemoteAddr(req)

        });
        next();
    }
}

アプリケーションで使用するために、app.js ファイルで初期化します:

// app.js
var express      = require('express'),
    piwikTracker = require('./lib/express-piwik-tracker.js'),
    app          = express();

// This tracks ALL requests to your Express application
app.use(piwikTracker({
    siteId    : 1,
    piwikUrl  : 'http://mywebsite.com/piwik.php',
    baseUrl   : 'http://example.com',
    piwikToken: '<YOUR SECRET API TOKEN>'
}));

これで、すべてのAPI の URL に対する各リクエストを追跡できます。もし、特定 PATH にトラッキングを制限したい場合は、そのPATHをルートの代わりに設定することもできます。

var tracker = piwikTracker({
    siteId    : 1,
    piwikUrl  : 'http://mywebsite.com/piwik.php',
    baseUrl   : 'http://example.com',
    piwikToken: '<YOUR SECRET API TOKEN>'
});

router.get('/only/track/me', tracker, function(req, res) {
    // Your code that handles the route and responds to the request
});

通常ウェブサイトのユーザー解析と共に、API ユーザーをトラッキングするための設定ガイドは以上です。


profil_fredericFrederic Hemberger

Frederic は、ドイツのケルンで、Web フロントエンドと JavaScript 開発を中心としたフリーランサーとして働いています。Twitter のユーザー名は @fhemberger 。フレデリックは Piwik のヘビーユーザーで、私たちのブログ上にゲスト寄稿しています。