woopra_tracker 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/woopra_tracker.rb +171 -0
  3. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 499be4a96f28f6b8bfa636b65c052ced7e9cfeeb
4
+ data.tar.gz: c5eaafed993e102530dc3598c33cff92db6e53cb
5
+ SHA512:
6
+ metadata.gz: 42a2017e75c480a310deb296319cfa4b392fad24001a96b1b7f317edcfd5e9cdbcd68cae2a2ae3d18e59a9b62f01fa51825b4c041222cd0e8ea2c96c9e2978cb
7
+ data.tar.gz: 8f3cd3f8e48d9cdf0dd53e1262bc1ce90725f5f6293cb4d5fac35c88c0cafe5d3fe22af6aebcefdde3e7b18d23d5a127b0040dca99039b8bc7913e6cda6e1572
@@ -0,0 +1,171 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'json'
3
+ require 'net/http'
4
+ require 'open-uri'
5
+
6
+ module WoopraRailsSDK
7
+ class WoopraTracker
8
+ @@SDK_ID = "rails"
9
+ @@default_config = {
10
+ domain: "",
11
+ cookie_name: "wooTracker",
12
+ cookie_domain: "",
13
+ cookie_path: "/",
14
+ ping: true,
15
+ ping_interval: 12000,
16
+ idle_timeout: 300000,
17
+ download_tracking: true,
18
+ outgoing_tracking: true,
19
+ download_pause: 200,
20
+ outgoing_pause: 400,
21
+ ignore_query_url: true,
22
+ hide_campaign: false,
23
+ ip_address: "",
24
+ cookie_value: "",
25
+ }
26
+ def initialize(request)
27
+ @request = request
28
+ @current_config = @@default_config
29
+ @custom_config = {app: @@SDK_ID}
30
+ @user = {}
31
+ @events = []
32
+ @user_up_to_date = true
33
+ @has_pushed = false
34
+ @current_config[:domain] = @request.host
35
+ @current_config[:cookie_domain] = @request.host
36
+ @current_config[:ip_address] = get_client_ip
37
+ @current_config[:cookie_value] = @request.cookies["cookie_name"] || random_cookie
38
+ return self
39
+ end
40
+
41
+ def config(data)
42
+ data.each do |key, value|
43
+ if @@default_config.has_key?(key)
44
+ @current_config[key] = value
45
+ if key != :ip_address && key != :cookie_value
46
+ @custom_config[key] = value
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def identify(user)
53
+ @user = user
54
+ @user_up_to_date = false
55
+ return self
56
+ end
57
+
58
+ def track(event_name = nil, event_data = nil, back_end_tracking = false)
59
+ if back_end_tracking
60
+ woopra_http_request(true, [event_name, event_data])
61
+ else
62
+ @events << [event_name, event_data]
63
+ end
64
+ return self
65
+ end
66
+
67
+ def push(back_end_tracking = false)
68
+ if not @user_up_to_date
69
+ if back_end_tracking
70
+ woopra_http_request(false)
71
+ else
72
+ has_pushed = true
73
+ end
74
+ end
75
+ end
76
+
77
+ def js_code
78
+ code = "\n" + '<!-- Woopra code starts here -->'.html_safe + "\n"
79
+ code += '<script>'.html_safe + "\n"
80
+ code += ' (function(){'.html_safe + "\n"
81
+ code += ' var t,i,e,n=window,o=document,a=arguments,s="script",r=["config","track","identify","visit","push","call"],c=function(){var t,i=this;for(i._e=[],t=0;r.length>t;t++)(function(t){i[t]=function(){return i._e.push([t].concat(Array.prototype.slice.call(arguments,0))),i}})(r[t])};for(n._w=n._w||{},t=0;a.length>t;t++)n._w[a[t]]=n[a[t]]=n[a[t]]||new c;i=o.createElement(s),i.async=1,i.src="//static.woopra.com/js/w.js",e=o.getElementsByTagName(s)[0],e.parentNode.insertBefore(i,e)'.html_safe + "\n"
82
+ code += ' })("woopra");'.html_safe + "\n"
83
+ if @custom_config.length != 0
84
+ code += " woopra.config(".html_safe + @custom_config.to_json.html_safe + ");".html_safe + "\n"
85
+ end
86
+ if not @user_up_to_date
87
+ code += " woopra.identify(".html_safe + @user.to_json.html_safe + ");".html_safe + "\n"
88
+ end
89
+ for event in @events
90
+ if event[0] == nil
91
+ code += " woopra.track();".html_safe + "\n"
92
+ else
93
+ code += " woopra.track('".html_safe + event[0].html_safe + "', ".html_safe + event[1].to_json.html_safe + ");".html_safe + "\n"
94
+ end
95
+ end
96
+ if @has_pushed
97
+ code += " woopra.push();".html_safe + "\n"
98
+ end
99
+ code += "</script>".html_safe + "\n"
100
+ code += "<!-- Woopra code ends here -->".html_safe + "\n"
101
+ return code.html_safe
102
+ end
103
+
104
+ def set_woopra_cookie(cookies)
105
+ cookies[@current_config[:cookie_name]] = @current_config[:cookie_value]
106
+ end
107
+
108
+ private
109
+
110
+ def woopra_http_request(is_tracking, event = nil)
111
+ base_url = "www.woopra.com"
112
+ get_params = {}
113
+
114
+ # Configuration
115
+ get_params["host"] = @current_config[:domain].to_s
116
+ get_params["cookie"] = @current_config[:cookie_value].to_s
117
+ get_params["ip"] = @current_config[:ip_address].to_s
118
+ get_params["timeout"] = @current_config[:idle_timeout].to_s
119
+
120
+ # Identification
121
+ @user.each do |key, value|
122
+ get_params["cv_" + key.to_s] = value.to_s
123
+ end
124
+
125
+ if not is_tracking
126
+ url = "/track/identify/?"
127
+ get_params.each do |key, value|
128
+ url += URI::encode(key) + "=" + URI::encode(value) + "&"
129
+ end
130
+ url = url[0..-1] + "&app=" + @@SDK_ID
131
+ else
132
+ if event == nil
133
+ get_params["ce_name"] = "pv"
134
+ get_params["ce_url"] = @request.url.to_s
135
+ else
136
+ get_params["ce_name"] = event[0].to_s
137
+ event[1].each do |key, value|
138
+ get_params["ce_" + key.to_s] = value.to_s
139
+ end
140
+ end
141
+ url = "/track/ce/?"
142
+ get_params.each do |key, value|
143
+ url += URI::encode(key) + "=" + URI::encode(value) + "&"
144
+ end
145
+ url = url[0..-1] + "&app=" + @@SDK_ID
146
+ end
147
+ http = Net::HTTP.new(base_url)
148
+ user_agent = @request.env['HTTP_USER_AGENT']
149
+ if not user_agent.nil?
150
+ req = Net::HTTP::Get.new(url, {'User-Agent' => user_agent})
151
+ else
152
+ req = Net::HTTP::Get.new(url)
153
+ end
154
+ response = http.request(req)
155
+ end
156
+
157
+ def random_cookie
158
+ o = [('0'..'9'), ('A'..'Z')].map { |i| i.to_a }.flatten
159
+ return (0...12).map{ o[rand(o.length)] }.join
160
+ end
161
+
162
+ def get_client_ip
163
+ if not @request.env['HTTP_X_FORWARDED_FOR'].nil?
164
+ return @request.env['HTTP_X_FORWARDED_FOR'].split(",")[0].strip
165
+ else
166
+ return @request.remote_ip
167
+ end
168
+ end
169
+
170
+ end
171
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: woopra_tracker
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Antoine Chkaiban
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-20 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Realtime Customer Insight
14
+ email:
15
+ - support@woopra.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/woopra_tracker.rb
21
+ homepage: https://www.woopra.com
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.2.1
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Woopra Rails SDK
45
+ test_files: []