piwik-tracker 0.1.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/CHANGELOG.md ADDED
File without changes
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Jens Krämer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,15 @@
1
+ Piwik-Tracker
2
+ =============
3
+
4
+ http://github.com/jkraemer/piwik-tracker
5
+
6
+ Ruby client library for the [Piwik](http://piwik.org) opensource web
7
+ analytics application.
8
+
9
+ With Piwik-Tracker you can record visits, page views and goal conversions
10
+ in a Piwik server from within any ruby application.
11
+
12
+ Think of it as a Ruby version of the piwik.js standard Tracking API.
13
+ For more information, see http://piwik.org/docs/tracking-api/
14
+
15
+ Inspired by the PiwikTracker.php script that comes with Piwik.
@@ -0,0 +1,205 @@
1
+ require 'uri'
2
+ require 'json'
3
+ require 'patron'
4
+
5
+ module PiwikTracker
6
+
7
+ # Piwik HTTP client
8
+ # piwik = Piwik.new('http://yoursite.com/piwik', 6)
9
+ # piwik.request(auth_token).
10
+ # url('http://yoursite.com/some-page.html').
11
+ # custom_variable(:foobar, 'value').
12
+ # track_page_view('Page Title')
13
+ class Piwik
14
+
15
+ MAX_INT = 2 ** ((['foo'].pack('p').size * 8) - 1) - 1
16
+
17
+ HTTP_TIMEOUT = 20
18
+ USER_AGENT = "piwik-tracker/#{PiwikTracker::VERSION}"
19
+
20
+ attr_accessor :debug
21
+
22
+ # base_uri - the location of your Piwik installation, i.e. 'http://yoursite.com/piwik'.
23
+ # site_id - Id of the site to be tracked
24
+ def initialize(base_uri, site_id)
25
+ @base_uri = base_uri
26
+ @site_id = site_id
27
+ end
28
+
29
+ # sends a tracking request
30
+ def track(params)
31
+ send_request params.merge( 'idsite' => @site_id,
32
+ 'rec' => 1,
33
+ 'rand' => rand(MAX_INT) )
34
+ end
35
+
36
+ protected
37
+
38
+ def send_request(params)
39
+ headers = { 'Accept-Language' => params.delete(:browser_language) }
40
+ headers['User-Agent'] = params.delete(:user_agent) if params.key?(:user_agent)
41
+ url = "piwik.php?#{hash_to_querystring(params)}"
42
+ puts "#{url} / #{headers.inspect}" if @debug
43
+ http.get url, headers
44
+ end
45
+
46
+ def http
47
+ @http ||= connect
48
+ end
49
+
50
+ def hash_to_querystring(hash)
51
+ (keys = hash.keys).inject('') do |query_string, key|
52
+ query_string << '&' unless key == keys.first
53
+ query_string << "#{URI.encode(key.to_s)}=#{URI.encode(hash[key].to_s)}"
54
+ end
55
+ end
56
+
57
+ def connect
58
+ Patron::Session.new.tap do |session|
59
+ session.timeout = HTTP_TIMEOUT
60
+ session.base_url = @base_uri
61
+ session.headers['User-Agent'] = USER_AGENT
62
+ end
63
+ end
64
+
65
+
66
+ public
67
+
68
+ class Request
69
+
70
+ # Piwik API version
71
+ VERSION = 1
72
+
73
+ # length of Piwik visitor ids
74
+ VISITOR_ID_LENGTH = 16
75
+
76
+ def initialize(piwik, auth_token = nil)
77
+ @piwik = piwik
78
+ @custom_variables = []
79
+ @data = {}
80
+ @data[:token_auth] = auth_token if auth_token
81
+ end
82
+
83
+ # Chainable attribute setters
84
+ ###########################
85
+
86
+ # Sets the current URL being tracked
87
+ def url(url)
88
+ @data[:url] = url
89
+ self
90
+ end
91
+
92
+ # Sets the URL referrer used to track Referrers details for new visits.
93
+ def referrer(url)
94
+ @data[:urlref] = url
95
+ self
96
+ end
97
+
98
+ # Sets the attribution information to the visit, so that subsequent Goal conversions are
99
+ # properly attributed to the right Referrer URL, timestamp, Campaign Name & Keyword.
100
+ # info - 4 element array of [campaign name, campaign keyword, Timestamp at which the referrer was set, Referrer URL]
101
+ def attribution_info(info)
102
+ info = JSON.parse(info) if String === info
103
+ @data[:_rcn], @data[:_rck], @data[:_refts], @data[:_ref] = info
104
+ self
105
+ end
106
+
107
+ # Sets Visit Custom Variable.
108
+ # See http://piwik.org/docs/custom-variables/
109
+ # slot_id - Custom variable slot ID from 1-5
110
+ # name - Custom variable name
111
+ # value - Custom variable value
112
+ def custom_variable(slot_id, name, value)
113
+ raise "invalid slot id, has to be between 1 and 5" unless (1..5).include?(slot_id)
114
+ @custom_variables[slot_id - 1] = [name, value]
115
+ self
116
+ end
117
+
118
+ def browser_language(lang)
119
+ @data[:browser_language] = lang
120
+ self
121
+ end
122
+
123
+ def user_agent(name)
124
+ @data[:user_agent] = name
125
+ self
126
+ end
127
+
128
+ # Overrides server date and time for the tracking requests.
129
+ # By default Piwik will track requests for the "current datetime" but this function allows you
130
+ # to track visits in the past.
131
+ # time - ruby Time instance
132
+ def forced_date_time(time)
133
+ @data[:cdt] = time.utc.to_i
134
+ self
135
+ end
136
+
137
+ # Overrides IP address
138
+ # client_ip - IP address string
139
+ def ip(client_ip)
140
+ @data[:cip] = client_ip
141
+ self
142
+ end
143
+
144
+ # Forces the requests to be recorded for the specified Visitor ID
145
+ # rather than using the heuristics based on IP and other attributes.
146
+ # id - 16 hexadecimal characters visitor ID, eg. "33c31e01394bdc63"
147
+ def visitor_id(id)
148
+ raise "visitor_id must be exactly #{VISITOR_ID_LENGTH} characters long" unless id.to_s.length == VISITOR_ID_LENGTH
149
+ @data[:cid] = id
150
+ self
151
+ end
152
+
153
+
154
+
155
+ # Tracking functions
156
+ ###########################
157
+
158
+ # Tracks a page view
159
+ # document_title is the page title as it will appear in the Actions > Page titles report
160
+ def track_pageview(document_title)
161
+ @piwik.track request_params.merge(:action_name => document_title)
162
+ end
163
+
164
+ # Records a Goal conversion
165
+ # goal_id - Id of the goal to record
166
+ # revenue - revenue for this conversion
167
+ def track_goal(goal_id, revenue = nil)
168
+ params = request_params.merge :idgoal => goal_id
169
+ params[:revenue] = revenue if revenue
170
+ @piwik.track params
171
+ end
172
+
173
+ # Tracks a download or outlink
174
+ # action_url - URL of the download or outlink
175
+ # action_type Type of the action: :download or :link
176
+ def track_action(action_url, action_type)
177
+ @piwik.track request_params.merge(action_type => action_url, :redirect => '0')
178
+ end
179
+
180
+ protected
181
+
182
+ def request_params
183
+ @data.dup.tap do |params|
184
+ params[:_cvar] = @custom_variables.to_json if @custom_variables.any?
185
+ end
186
+ end
187
+
188
+ end
189
+
190
+
191
+ # generates a new request object.
192
+ #
193
+ # Some Tracking API functionnality requires express authentication, using either the
194
+ # Super User token_auth, or a user with 'admin' access to the website.
195
+ #
196
+ # The following features require access:
197
+ # - force the visitor IP
198
+ # - force the date & time of the tracking requests rather than track for the current datetime
199
+ # - force Piwik to track the requests to a specific VisitorId rather than use the standard visitor matching heuristic
200
+ def request(auth_token = nil)
201
+ Request.new self, auth_token
202
+ end
203
+ end
204
+
205
+ end
@@ -0,0 +1,3 @@
1
+ module PiwikTracker
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,2 @@
1
+ require "piwik_tracker/version"
2
+ require "piwik_tracker/piwik"
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: piwik-tracker
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - "Jens Kr\xC3\xA4mer"
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-13 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: ""
18
+ email:
19
+ - jk@jkraemer.net
20
+ executables: []
21
+
22
+ extensions: []
23
+
24
+ extra_rdoc_files: []
25
+
26
+ files:
27
+ - lib/piwik_tracker/piwik.rb
28
+ - lib/piwik_tracker/version.rb
29
+ - lib/piwik_tracker.rb
30
+ - LICENSE
31
+ - CHANGELOG.md
32
+ - README.md
33
+ has_rdoc: true
34
+ homepage: http://github.com/jkraemer/piwik-tracker
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.3.6
54
+ requirements: []
55
+
56
+ rubyforge_project: piwik-tracker
57
+ rubygems_version: 1.6.2
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: Record visits, page views, Goals, in a Piwik server
61
+ test_files: []
62
+