woopra_tracker 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/woopra_tracker.rb +171 -0
- 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: []
|