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