Nodo.js から Piwik トラッキング API の利用について
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 ユーザーをトラッキングするための設定ガイドは以上です。
Frederic Hemberger