ニュース

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 のインストールを開始します。

1npm install piwik-tracker --save

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

01var PiwikTracker = require('piwik-tracker');
02 
03// Initialize with your site ID and Piwik URL
04var piwik = new PiwikTracker(1, 'http://mywebsite.com/piwik.php');
05 
06// Piwik works with absolute URLs, so you have to provide protocol and hostname
07var baseUrl = 'http://example.com';
08 
09// Track a request URL:
10piwik.track(baseUrl + req.url);

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

01piwik.track({
02    // The full request URL
03    url: baseUrl + req.url,
04 
05    // This will be shown as title in your Piwik backend
06    action_name: 'API call',
07 
08    // User agent and language settings of the client
09    ua: req.header('User-Agent'),
10    lang: req.header('Accept-Language'),
11 
12    // Custom request variables
13    cvar: JSON.stringify({
14      '1': ['API version', 'v1'],
15      '2': ['HTTP method', req.method]
16    })
17});

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

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

01function getRemoteAddr(req) {
02    if (req.ip) return req.ip;
03    if (req._remoteAddress) return req._remoteAddress;
04    var sock = req.socket;
05    if (sock.socket) return sock.socket.remoteAddress;
06    return sock.remoteAddress;
07}
08 
09piwik.track({
10    // …
11    token_auth: '<YOUR SECRET API TOKEN>',
12    cip: getRemoteAddr(req)
13});

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

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

01// ./lib/express-piwik-tracker.js
02var PiwikTracker = require('piwik-tracker');
03 
04function getRemoteAddr(req) {
05    if (req.ip) return req.ip;
06    if (req._remoteAddress) return req._remoteAddress;
07    var sock = req.socket;
08    if (sock.socket) return sock.socket.remoteAddress;
09    return sock.remoteAddress;
10}
11 
12exports = module.exports = function analytics(options) {
13    var piwik = new PiwikTracker(options.siteId, options.piwikUrl);
14 
15    return function track(req, res, next) {
16        piwik.track({
17            url: options.baseUrl + req.url,
18            action_name: 'API call',
19            ua: req.header('User-Agent'),
20            lang: req.header('Accept-Language'),
21            cvar: JSON.stringify({
22              '1': ['API version', 'v1'],
23              '2': ['HTTP method', req.method]
24            }),
25            token_auth: options.piwikToken,
26            cip: getRemoteAddr(req)
27 
28        });
29        next();
30    }
31}

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

01// app.js
02var express      = require('express'),
03    piwikTracker = require('./lib/express-piwik-tracker.js'),
04    app          = express();
05 
06// This tracks ALL requests to your Express application
07app.use(piwikTracker({
08    siteId    : 1,
09    piwikUrl  : 'http://mywebsite.com/piwik.php',
10    baseUrl   : 'http://example.com',
11    piwikToken: '<YOUR SECRET API TOKEN>'
12}));

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

01var tracker = piwikTracker({
02    siteId    : 1,
03    piwikUrl  : 'http://mywebsite.com/piwik.php',
04    baseUrl   : 'http://example.com',
05    piwikToken: '<YOUR SECRET API TOKEN>'
06});
07 
08router.get('/only/track/me', tracker, function(req, res) {
09    // Your code that handles the route and responds to the request
10});

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


profil_fredericFrederic Hemberger

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