gaffel 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/gaffel.rb +118 -0
- metadata +47 -0
data/lib/gaffel.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#noinspection RubyStringKeysInHashInspection
|
2
|
+
class Gaffel
|
3
|
+
# --- login:
|
4
|
+
CLIENT_LOGIN_URL = 'https://www.google.com/accounts/ClientLogin'
|
5
|
+
ACCOUNT_TYPE = 'GOOGLE'
|
6
|
+
SERVICE = 'analytics'
|
7
|
+
CONTENT_TYPE = 'application/x-www-form-urlencoded'
|
8
|
+
LOGIN_HEADERS = {'Content-Type' => CONTENT_TYPE}
|
9
|
+
# --- get request:
|
10
|
+
GA_CORE_REPORTING_API_URL_V2_3 = 'https://www.google.com/analytics/feeds/data'
|
11
|
+
GA_CORE_REPORTING_API_URL_V2_4 = 'https://www.googleapis.com/analytics/v2.4/data'
|
12
|
+
GA_CORE_REPORTING_API_URL_V3_0 = 'https://www.googleapis.com/analytics/v3/data/ga'
|
13
|
+
GA_CORE_REPORTING_API_URL = GA_CORE_REPORTING_API_URL_V3_0
|
14
|
+
|
15
|
+
def initialize(account, data_spec)
|
16
|
+
@debug = false
|
17
|
+
@account = account
|
18
|
+
@data_spec = {:metric => (data_spec[:metric] || 'ga:newVisits'),
|
19
|
+
:dimensions => (data_spec[:dimensions] || []).join(','),
|
20
|
+
:filters => (data_spec[:filters] || ''),
|
21
|
+
:start_date => iso_date(data_spec[:start_date]),
|
22
|
+
:end_date => iso_date(data_spec[:end_date]),
|
23
|
+
:max_results => (data_spec[:max_results] || 1000),
|
24
|
+
:sort => (data_spec[:sort] || 'ga:date')}
|
25
|
+
@data_spec[:filters] += ";#{@data_spec[:metric]}>0"
|
26
|
+
@login_query = {:Email => @account[:login],
|
27
|
+
:Passwd => @account[:password],
|
28
|
+
:source => @account[:source],
|
29
|
+
:accountType => ACCOUNT_TYPE,
|
30
|
+
:service => SERVICE}.to_query
|
31
|
+
@headers_for_get_request = {"GData-Version" => '2',
|
32
|
+
"Content-Type" => CONTENT_TYPE}
|
33
|
+
@rows_processed = 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def each
|
37
|
+
get_auth_token
|
38
|
+
start_index = 1
|
39
|
+
while true
|
40
|
+
url = make_url(start_index)
|
41
|
+
debug("url", url)
|
42
|
+
response = http_get_request(url)
|
43
|
+
debug("response", response)
|
44
|
+
ga_data = JSON.parse(response.read_body)
|
45
|
+
debug("ga_data", ga_data)
|
46
|
+
break if done_reading ga_data
|
47
|
+
headers = ga_data['columnHeaders']
|
48
|
+
ga_data['rows'].each { |values| yield make_hash(headers, values) }
|
49
|
+
start_index += @data_spec[:max_results]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# ---
|
54
|
+
protected
|
55
|
+
|
56
|
+
def make_hash(headers, values)
|
57
|
+
hash = {}
|
58
|
+
headers.each_with_index do |header, i|
|
59
|
+
hash = hash.merge({header['name'].to_sym => values[i]})
|
60
|
+
end
|
61
|
+
hash
|
62
|
+
end
|
63
|
+
|
64
|
+
def done_reading(ga_data)
|
65
|
+
ga_data["query"]["start-index"] > ga_data["totalResults"]
|
66
|
+
end
|
67
|
+
|
68
|
+
def http_get_request(url)
|
69
|
+
http = Net::HTTP.new url.host, 443
|
70
|
+
http.use_ssl = url.scheme == 'https'
|
71
|
+
http.request_get(url.request_uri, @headers_for_get_request)
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_auth_token
|
75
|
+
url = URI CLIENT_LOGIN_URL
|
76
|
+
http = Net::HTTP.new url.host, 443
|
77
|
+
http.use_ssl = url.scheme == 'https'
|
78
|
+
response = http.request_post(url.request_uri, @login_query, LOGIN_HEADERS)
|
79
|
+
auth = response.read_body.scan(/Auth=.*/).first
|
80
|
+
@headers_for_get_request = @headers_for_get_request.merge("Authorization" => "GoogleLogin #{auth}")
|
81
|
+
end
|
82
|
+
|
83
|
+
def make_url(start_index)
|
84
|
+
#see: http://ga-dev-tools.appspot.com/explorer/
|
85
|
+
query = {"start-index" => start_index.to_s,
|
86
|
+
"metrics" => @data_spec[:metric],
|
87
|
+
"dimensions" => @data_spec[:dimensions],
|
88
|
+
"filters" => @data_spec[:filters],
|
89
|
+
"max-results" => @data_spec[:max_results],
|
90
|
+
"start-date" => @data_spec[:start_date],
|
91
|
+
"end-date" => @data_spec[:end_date],
|
92
|
+
"sort" => @data_spec[:sort],
|
93
|
+
"key" => @account[:google_api_key],
|
94
|
+
"ids" => @account[:ga_profile_id]}.to_query
|
95
|
+
#debug("query", query)
|
96
|
+
URI GA_CORE_REPORTING_API_URL + '?' + query
|
97
|
+
end
|
98
|
+
|
99
|
+
def iso_date(date_id)
|
100
|
+
year = date_id / 10000
|
101
|
+
month = "%02d" % ((date_id / 100) % 100)
|
102
|
+
day = "%02d" % (date_id % 100)
|
103
|
+
"#{year}-#{month}-#{day}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def debug(msg, data)
|
107
|
+
if @debug
|
108
|
+
print "\nDEBUG: #{msg}: "
|
109
|
+
if data.respond_to?(:size)
|
110
|
+
ap data
|
111
|
+
puts "(size: #{data.size}): "
|
112
|
+
else
|
113
|
+
print "#{data}\n"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gaffel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tilmann Bruckhaus
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-10 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Supports extracting 1 metric for 0 or more dimensions, with start and
|
15
|
+
end dates, sorting, and max results requested per Google API call. Provides results
|
16
|
+
record-by-record via an iterator.
|
17
|
+
email: tilmann@bruckha.us
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- lib/gaffel.rb
|
23
|
+
homepage: http://rubygems.org/gems/gaffel
|
24
|
+
licenses: []
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 1.8.15
|
44
|
+
signing_key:
|
45
|
+
specification_version: 3
|
46
|
+
summary: Extract data from Google Analytics (GA) v3.0 API!
|
47
|
+
test_files: []
|