Snippets

markdiary mt-plugin / AccessRankingGA のGoogle API OAuth 2.0 認証への改修版

Created by markdiary last modified
#
#  mt-plugin-AccessRankingGA  @coolniikou
#
#  ORIGINAL repository :
#  https://github.com/coolniikou/mt-plugin-AccessRankingGA
#

package AccessRankingGA::Tag;

use strict;
use base qw(MT::Plugin);
use MT;
use MT::Util qw( start_end_day epoch2ts format_ts trim );
use LWP::UserAgent;
use Net::Google::Analytics;
use Net::Google::Analytics::OAuth2;
use Encode;

sub _hdlr_analytic_tags {
    my ( $ctx, $args ) = @_;
    my $blog     = $ctx->stash('blog');
    my $blog_id  = $ctx->stash('blog_id');
    my $site_url = $blog->site_url;
    my $plugin   = MT->component('AccessRankingGA');
    my $span     = $args->{span};

    my $now = time;
    my $today = start_end_day( epoch2ts( $blog, $now ) );
    my $ago;
    if ($span) {
        $ago =
          start_end_day( epoch2ts( $blog, $now - ( 60 * 60 * 24 * $span ) ) );
    }
    else {
        $ago = start_end_day( epoch2ts( $blog, $now - ( 60 * 60 * 24 * 7 ) ) );
    }

    my $config = {
        clientid =>
          $plugin->get_config_value( 'GA_client_id', 'blog:' . $blog_id ),
        clientsecret =>
          $plugin->get_config_value( 'GA_client_secret', 'blog:' . $blog_id ),
        refreshaccesstoken =>
          $plugin->get_config_value( 'GA_refresh_access_token', 'blog:' . $blog_id ),
        profileid =>
          $plugin->get_config_value( 'GA_profile_id', 'blog:' . $blog_id ),
        maxresult =>
          $plugin->get_config_value( 'GA_maxresult', 'blog:' . $blog_id ),
        exclude_top =>
          $plugin->get_config_value( 'GA_exclude_top', 'blog:' . $blog_id ),
        exclude_optional_path => trim(
            $plugin->get_config_value(
                'GA_exclude_optional_path', 'blog:' . $blog_id
            )
        ),
        start => format_ts( '%Y-%m-%d', $ago,   $blog ),
        end   => format_ts( '%Y-%m-%d', $today, $blog ),
    };

    my $requrl = &get_req_url($config);
    my $data = &get_data( $config , $requrl);

    return $data if ( MT->VERSION < 5 );

    $data = decode_utf8($data);
}

sub get_data {
    my ( $config , $requrl) = @_;
    my $plugin = MT->component('AccessRankingGA');
    my $ua =
      MT->new_ua( { agent => join( "/", $plugin->name, $plugin->version ) } );
    my $res = $ua->get($requrl);
    if ( $res->is_success ) {
        return $res->content;
    }
    else {
        MT->log(
            {
                 message => $plugin->translate('as_contents_error')
                 . $res->status_line,
                 class => 'system',
                 level => MT::Log::ERROR(),
            }
        );
        die $plugin->translate('as_contents_error') . $res->status_line;
    }
}

sub get_req_url {

# GA OAouth
    my $config = shift;
    my $plugin = MT->component('AccessRankingGA');

    my $analytics = Net::Google::Analytics->new;
    my $oauth = Net::Google::Analytics::OAuth2->new(
        client_id     => $config->{clientid},
        client_secret => $config->{clientsecret},
    );

    my $token = $oauth->refresh_access_token($config->{refreshaccesstoken});
    $analytics->token($token);


# Set GA profile ID
    my $profile_id = $config->{profileid};

# request parms
    my $req = $analytics->new_request(
        ids         => "ga:$profile_id",
        dimensions  => "ga:pagePath,ga:pageTitle",
        metrics     => "ga:uniquePageviews",
        sort        => "-ga:uniquePageviews",
# filters     => "ga:pagePath==/index.html",
        start_date  => $config->{start},
        end_date    => $config->{end},
        max_results => $config->{maxresult},
    );
# Make Request URL
    (my $this_token = $analytics->token($token)->[1]) =~ s/bearer //i;
    my $url =  $analytics->uri($req) . "&access_token=" . $this_token;
    my $res = $analytics->retrieve($req);

    if ( $res->is_success ) {
        return  $url;
    }
    else {
        MT->log(
            {
                message => $plugin->translate('as_contents_error')
                  . $res->status_line,
                class => 'system',
                level => MT::Log::ERROR(),
            }
        );
        die $plugin->translate('as_contents_error') . $res->status_line;
    }
}

1;
<p><__trans phrase="as_SET_DES"></p>
<h4><__trans phrase="as_SET_TITLE"></h4>
<p><__trans phrase="as_ASTERISK"></p>
<ul>
	<li><mtapp:setting
	    id="GA_username"
	    label="<__trans phrase="as_GA_Username">">
	    <input type="text" name="GA_username" id="GA_username" value="<mt:var name="GA_username" escape="html">" />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_password"
	    label="<__trans phrase="as_GA_Password">">
	    <input type="password" name="GA_password" id="GA_password" value="<mt:var name="GA_password" escape="html">" />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_profile_id"
	    label="<__trans phrase="as_GA_ProfileID">">
	    <input type="text" name="GA_profile_id" id="GA_profile_id" value="<mt:var name="GA_profile_id" escape="html">" />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_client_id"
	    label="<__trans phrase="as_GA_client_id">">
	    <input type="text" name="GA_client_id" id="GA_client_id" value="<mt:var name="GA_client_id" escape="html">" />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_client_secret"
	    label="<__trans phrase="as_GA_client_secret">">
	    <input type="text" name="GA_client_secret" id="GA_client_secret" value="<mt:var name="GA_client_secret" escape="html">" />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_refresh_access_token"
	    label="<__trans phrase="as_GA_refresh_access_token">">
	    <input type="text" name="GA_refresh_access_token" id="GA_refresh_access_token" value="<mt:var name="GA_refresh_access_token" escape="html">" />
	</mtapp:setting></li>

</ul>
<h4><__trans phrase="as_DATA_SET_DETAIL"></h4>
<ul>
	<li><mtapp:setting
	    id="GA_maxresult"
	    label="<__trans phrase="as_GA_Maxresult">">
	    <input type="text" name="GA_maxresult" id="GA_maxresult" value="<mt:var name="GA_maxresult" escape="html">" />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_exclude_top"
	    label="<__trans phrase="as_GA_Exclude_Top">"
			show_hint="1"
			hint="<__trans phrase="as_GA_Exclude_Top_Hint">">
	    <input type="checkbox" name="GA_exclude_top" id="GA_exclude_top" value="1"<mt:If name="GA_exclude_top"> checked="checked"</mt:If> />
	</mtapp:setting></li>
	<li><mtapp:setting
	    id="GA_exclude_optional_path"
	    label="<__trans phrase="as_GA_Exclude_Optional_Path">"
			show_hint="1"
			hint="<__trans phrase="as_GA_Exclude_Optional_Path_Hint">">
	    <textarea name="GA_exclude_optional_path" id="GA_exclude_optional_path" rows="4" style="width: 100%;"><mt:var name="GA_exclude_optional_path" escape="html"></textarea>
	</mtapp:setting></li>
</ul>
id: 'AccessRankingGA'
key: 'accessrankingga'
name: 'AccessRankingGA'
version: 0.5.1
description: '<MT_TRANS phrase="as_DESCRIPTION">'
doc_link: 'https://github.com/coolniikou/mt-plugin-AccessRankingGA'
author_name: '<MT_TRANS phrase="as_AUTHOR_NAME">'
author_link: 'http://twitter.com/cool_ni_ikou/'
l10n_class: 'AccessRankingGA::L10N'
blog_config_template: 'config.tmpl'
settings:
    GA_username:
        default: ""
        scope: blog
    GA_password:
        default: ""
        scope: blog
    GA_api_key:
        default: ""
        scope: blog
    GA_profile_id:
        default: ""
        scope: blog
    GA_maxresult:
        default: 5
        scope: blog
    GA_exclude_top:
        default: ""
        scope: blog
    GA_exclude_optional_path:
        default: ""
        scope: blog
    GA_client_id:
        default: ""
        scope: blog
    GA_client_secret:
        default: ""
        scope: blog
    GA_refresh_access_token:
        default: ""
        scope: blog

tags:
#    function:
#        AccessRankingGA: $AccessRankingGA::AccessRankingGA::Plugin::_hdlr_analytic_tags
    function:
        AccessRankingGA: $AccessRankingGA::AccessRankingGA::Tag::_hdlr_analytic_tags
package AccessRankingGA::L10N::ja;

use strict;
use base 'AccessRankingGA::L10N::en_us';
use vars qw( %Lexicon );

%Lexicon = (
	'as_NAME' => 'AccessRankingGA',
	'as_AUTHOR_NAME' => 'cool_ni_ikou',
	'as_DESCRIPTION' => 'Google Analyticsよりユニークビジター数のデータを抽出し、JSONデータを生成します。',
	'as_SET_DES' => 'Google Analytics ログイン情報(プロファイルID)が必要です。',
	'as_SET_TITLE' => 'Google Analytics 詳細設定',
	'as_ASTERISK' => '* 印 必須項目',
	'as_GA_Username' => '* Google Analytics<br />ユーザ名',
	'as_GA_Password' => '* Google Analytics<br />パスワード',
	'as_GA_ProfileID' => '* Google Analytics<br />プロファイル ID',
	'as_GA_Maxresult' => 'エントリー最大表示数<br />(訪問数昇順)',
	'as_GA_Exclude_Top' => 'トップページ除外',
	'as_GA_Exclude_Top_Hint' => 'もしトップページデータを除外したい場合はチェックしてください。',
	'as_GA_Exclude_Optional_Path' => '除外パスリスト',
	'as_GA_Exclude_Optional_Path_Hint' => '除外したいページパスを入力してください。例)もしphotoshopカテゴリ(パス名)の場合、"photoshop"入力。 ',
	'as_token_error' => 'Google Analytics DATA API認証が取得できませんでした。プラグイン設定画面にて詳細設定項目の内容を確認ください。', 
	'as_contents_error' => 'Google Analytics DATA APIからデータ取得できませんでした。詳細設定項目の内容を確認してください。',
	'as_GA_client_id' => '* Google Analytics API<br />クライアント ID',
	'as_GA_client_secret' => '* Google Analytics API<br />クライアントシークレット',
	'as_GA_refresh_access_token' => '* Google Analytics API<br />リフレッシュアクセストークン',
);

1;

Comments (1)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.