Skip to content

Instantly share code, notes, and snippets.

@oneillo
Last active August 31, 2015 01:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oneillo/dbf6276a8c84da07a116 to your computer and use it in GitHub Desktop.
Save oneillo/dbf6276a8c84da07a116 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use strict;
use warnings;
use Net::Google::Analytics;
use Net::Google::Analytics::OAuth2;
use DateTime::Format::Strptime;
use POSIX qw(ceil strftime);
# GLOBAL VARIABLES
# I KNOW THIS IS BAD...SO SHOOT ME
my $startDate; # Format should be '2015-07-01';
my $endDate; # Format should be '2015-08-01';
my $timestamp = `date +"%Y%m%d%H%M"`;
chomp($timestamp);
#
# VARIABLES TO LOG INTO YOUR GOOGLE ANALYTICS ACCOUNT
# NEED TO INSTALL THIS LIBRARY FROM CPAN: https://metacpan.org/pod/Net::Google::Analytics
# AND FOLLOW THE INSTRUCTIONS ON THAT PAGE TO GET YOUR REFRESH TOKEN
my $profileId = "INSERT_PROFILE_ID";
my $clientId = "INSERT_CLIENT_ID";
my $clientSecret = "INSERT_CLIENT_SECRET";
my $refreshToken = "INSERT_REFRESH_TOKEN";
#
# THIS FUNCTION GETS THE ARGUMENTS PASSED TO THE SCRIPT WHEN IT IS RUN
sub parse_args()
{
my $arg;
my @argv = @ARGV;
if($#argv == "-1")
{
help();
}
while(@argv)
{
$arg = shift(@argv);
if($arg eq "-s" || $arg eq "-S")
{
if($#argv == "-1")
{
die "Error: Missing start date after -s option\n";
}
$startDate = shift(@argv);
}
elsif($arg eq "-e" || $arg eq "-E")
{
if($#argv == "-1")
{
die "Error: Missing end date after -e option\n";
}
$endDate = shift(@argv);
}
elsif($arg eq "-h" || $arg eq "-H")
{
help();
}
else
{
die "Illegal option: $arg.\n";
}
}
}
sub help
{
print "Usage:\n",
" get_shopify_data.pl <OPTIONS>\n",
" Required:\n",
" -s START_DATE : The first day in the period you want to pull data for. In YYYY-MM-DD format, e.g. 2015-07-01 \n",
" -e END_DATE : The last day in the period you want to pull data for. In YYYY-MM-DD format, e.g. 2015-07-31 \n",
" -h : See the help info \n";
die "\n";
}
sub get_data
{
#
# CREATE THE LOG FILE NAMES AND ADD THE RANGE OF DAYS WE ARE GETTING DATA FOR TO IT
my $parser = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d');
my $origStartDate = $parser->parse_datetime($startDate);
my $origEndDate = $parser->parse_datetime($endDate);
my $dateRange = $origStartDate->strftime('%m%d%Y') . "-" . $origEndDate->strftime('%m%d%Y');
my $logfile = "GoogleAnalytics_raw_data_$dateRange\_$timestamp.csv"; #where the raw data is stored
#
# VARIABLES TO HOLD METRICS
my $totalUsers = 0;
my $newUsers = 0;
my $returnUsers = 0;
#
# CREATE A TIMESTAMPED FILENAME FOR WRITING THE RAW DATA
# AND THEN OPEN THE FILE TO WRITE TO
my $timestamp = strftime("%Y%m%d%H%M", localtime);
#
#
# NOW THE CODE TO ACTUALLY DO THE PULL
my $analytics = Net::Google::Analytics->new;
#
#Authenticate
my $oauth = Net::Google::Analytics::OAuth2->new
(
client_id => $clientId,
client_secret => $clientSecret,
);
# UNCOMMENT THIS THE FIRST TIME YOU RUN IT TO GO THROUGH THE PROCESS
# OF GETTING YOUR REFRESH TOKEN
#$oauth->interactive;
my $token = $oauth->refresh_access_token($refreshToken);
$analytics->token($token);
#
# BUILD GOOGLE ANALYTICS REQUEST TO GET TOTAL UNIQUE VISITORS TO THE WEBSITE
my $req = $analytics->new_request
(
ids => "ga:$profileId",
metrics => "ga:users",
start_date => $startDate,
end_date => $endDate,
);
#
# SEND REQUEST
my $res = $analytics->retrieve($req);
die("GA error: " . $res->error_message) if !$res->is_success;
#
# SET THE VARIABLE TO TOTAL USERS FOR THE SELECTED PERIOD
$totalUsers = $res->totals("users");
#
# BUILD GOOGLE ANALYTICS REQUEST TO GET NEW VISITORS AND RETURN VISITORS
$req = $analytics->new_request
(
ids => "ga:$profileId",
dimensions => "ga:userType",
metrics => "ga:users",
start_date => $startDate,
end_date => $endDate,
);
#
# SEND REQUEST
$res = $analytics->retrieve($req);
die("GA error: " . $res->error_message) if !$res->is_success;
#
# ASSIGN THE NEW VISITORS AND RETURN VISITORS COUNT TO THE VARIABLES
$newUsers = @{ $res->rows }[0]->get_users;
$returnUsers = @{ $res->rows }[1]->get_users;
#
# PRINT THE DATA TO THE LOG FILE
open(my $log, '>', $logfile) or die "Could not open file '$logfile' $!";
print $log "Period_Start,Period_End,Total_users,New_users,Return_users\n";
print $log "$startDate,$endDate,$totalUsers,$newUsers,$returnUsers\n";
close $log;
}
#################################################
#
# HERE IS WHERE THE EXECUTION HAPPENS
#
parse_args();
get_data();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment