タグ別アーカイブ: google

モバイル用Analyticsを埋め込むPlack::Middlewareらしきもの

[ Neurolab Inc. ] MainStore @ Phoen-X City, FRANCE3D Cyber City (124, 133,  1500) - General
Creative Commons License photo credit: Torley

モバイル用のGoogle Analyticsを埋め込むPlack::Middlewareらしきものをつくった。たぶん下記のようなインターフェースで動くはずだけど、ニセPSGI実装上でしかチェックしてないので、Plackで動くかどうかわからない。

なお、ga.plはGoogle Analytics公式サイトからGETしてドキュメントルートなどに設置する必要があります。

builder {
    enable 'GoogleMobileAnalytics',
    GA_ACCOUNT => 'UA-XXXXXX-1',
    GA_PIXEL => '/ga.pl';
    $app;
};
package Plack::Middleware::GoogleMobileAnalytics;
use strict;
use warnings;
our $VERSION = '0.01';
use base qw( Plack::Middleware );
use Plack::Util;
use Plack::Util::Accessor qw( GA_ACCOUNT );
use Plack::Util::Accessor qw( GA_PIXEL );
use URI::Escape;

sub call {

    my $self = shift;
    my $res = $self->app->(@_);
    $self->response_cb($res, sub {
        my $res = shift;
        my $h = Plack::Util::headers($res->[1]);
        if ($h->get('Content-Type') =~ 'text/html') {
            return sub {
                my $chunk = shift;
                if (! defined $chunk) {
                    return;
                }
                $chunk =~ s{</body>}{'<img src="' . $self->google_analytics_get_image_url() . '" /></body>'}e;
                return $chunk;
            };
        }
        $res;
    });
}

sub google_analytics_get_image_url {

    my $self = shift;
    my $url = '';
    $url .= $self->GA_PIXEL . '?';
    $url .= 'utmac=' . $self->GA_ACCOUNT;
    $url .= '&utmn=' . int(rand(0x7fffffff));
    $url .= '&utmr=' . uri_escape($ENV{'HTTP_REFERER'} || '-');
    $url .= '&utmp=' . uri_escape($ENV{'REQUEST_URI'});
    $url .= '&guid=ON';
    $url =~ s/&/&amp;/g;
    $url;
}

1;