agent_user 1.0.3 → 1.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/agent_user.gemspec +1 -1
- data/lib/agent_user.rb +123 -73
- metadata +2 -2
data/agent_user.gemspec
CHANGED
data/lib/agent_user.rb
CHANGED
@@ -1,115 +1,165 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
class AgentUser
|
4
|
+
attr_reader :browser_name, :browser_version
|
5
|
+
attr_reader :operating_system_name, :operating_system_version
|
6
|
+
attr_reader :mobile_device_name, :mobile_device_version
|
7
|
+
attr_reader :bot_name, :bot_version
|
4
8
|
|
5
|
-
def
|
6
|
-
self.new(str)
|
7
|
-
end
|
8
|
-
|
9
|
-
def initialize (str)
|
10
|
-
# Every device/browser/os name with version
|
11
|
-
@name_version_pairs = str.scan %r`((?:[a-zA-Z]+\s?)+)[/ ]([xi0-9._]+)`
|
9
|
+
def initialize (str = "")
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
# Device/Browser/OS name version pairs
|
12
|
+
name_version_pairs = str.scan %r`((?:[-.a-zA-Z]+\s?)+)[/. ]((?:(?:DBN)|[xi0-9._-])+)`
|
13
|
+
|
14
|
+
# Strip blacklisted names from name_version_pairs
|
15
|
+
blacklist =
|
16
|
+
%w:.NET Mozilla Trident RTC InfoPath AppleWebKit chromeframe FlipboardProxy
|
17
|
+
Gecko Media\ Center\ PC AskTbORJ Windows-Media-Player MSOffice:
|
18
|
+
name_version_pairs = name_version_pairs.reject do |name, version|
|
19
|
+
blacklist.any? {|n| name =~ /#{n}/i}
|
20
|
+
end
|
21
|
+
|
22
|
+
@operating_system_name, @operating_system_version = self.get_operating_system_data(name_version_pairs)
|
23
|
+
@browser_name, @browser_version = self.get_browser_data(name_version_pairs)
|
24
|
+
@mobile_device_name, @mobile_device_version = self.get_mobile_data(name_version_pairs)
|
25
|
+
@bot_name, @bot_version = self.get_bot_data(name_version_pairs)
|
16
26
|
|
17
27
|
return true
|
18
28
|
end
|
19
29
|
|
20
30
|
|
31
|
+
def to_s
|
32
|
+
user_agent_data = []
|
33
|
+
user_agent_data << "OS: #{self.operating_system_name} #{self.operating_system_version}" if self.operating_system_name
|
34
|
+
user_agent_data << "Browser: #{self.browser_name} #{self.browser_version}" if self.browser_name
|
35
|
+
user_agent_data << "Mobile: #{self.mobile_device_name} #{self.mobile_device_version}" if self.mobile_device_name
|
36
|
+
user_agent_data << "Bot: #{self.bot_name} #{self.bot_version}" if self.bot_name
|
37
|
+
puts user_agent_data.join(", ")
|
38
|
+
end
|
39
|
+
|
40
|
+
|
21
41
|
|
22
42
|
# Parse out operating system name and version
|
23
|
-
def get_browser_data(
|
43
|
+
def get_browser_data(name_version_pairs)
|
44
|
+
|
24
45
|
# Filter our browser name and version based on user agent browser names
|
25
|
-
|
26
|
-
|
27
|
-
|
46
|
+
b_names = %w:Safari Firefox MSIE IEMobile Opera Internet\ Explorer Chrome:
|
47
|
+
b_name, b_version = name_version_pairs.find do |name, version|
|
48
|
+
b_names.any? {|b_name| name =~ /#{b_name}/}
|
28
49
|
end
|
29
50
|
|
30
|
-
|
51
|
+
# Change MSIE to Internet Explorer
|
52
|
+
b_name = 'Internet Explorer' if b_name == 'MSIE'
|
31
53
|
|
54
|
+
# Change underscores to periods in b_version
|
55
|
+
b_version = b_version.gsub(?_,?.) if b_version
|
32
56
|
|
33
|
-
# The version number for Safari is located in another
|
34
|
-
#
|
35
|
-
version_arr =
|
36
|
-
if
|
37
|
-
|
57
|
+
# The version number for Safari or Mobile Safari is located in another
|
58
|
+
# place in the user agent. This will solve that by finding that version number
|
59
|
+
version_arr = name_version_pairs.find {|name,version| name == "Version"}
|
60
|
+
if b_name =~ /Safari/ && version_arr
|
61
|
+
b_version = version_arr[1]
|
38
62
|
end
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
return b_name, b_version
|
39
67
|
end
|
40
68
|
|
41
69
|
# Parse out operating system name and version
|
42
|
-
def get_operating_system_data (
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
70
|
+
def get_operating_system_data (name_version_pairs)
|
71
|
+
|
72
|
+
# NOTE: Reverse order of name_version_pairs to that Android and Ubuntu are
|
73
|
+
# found before Linux is if they exist in the name_version_pairs array.
|
74
|
+
os_names = %w:Windows Android Ubuntu Linux CPU\ iPhone\ OS CPU\ OS Mac\ OS:
|
75
|
+
os_name, os_version = name_version_pairs.reverse.find do |name, version|
|
76
|
+
os_names.any? {|os_name| name =~ /#{os_name}/}
|
47
77
|
end
|
48
78
|
|
49
|
-
|
79
|
+
# Change underscores to periods in os_version
|
80
|
+
os_version = os_version.gsub(?_,?.) if os_version
|
81
|
+
|
82
|
+
# Change name from user agent to iOS if from an iPad or iPhone
|
83
|
+
os_name = 'iOS' if ['CPU OS','CPU iPhone OS'].include?(os_name)
|
84
|
+
os_name = 'Windows' if os_name == 'Windows NT'
|
85
|
+
|
86
|
+
# Handle Windows version numbers/names
|
87
|
+
if os_name == 'Windows'
|
88
|
+
os_version = case os_version
|
89
|
+
when '6.2'
|
90
|
+
'8'
|
91
|
+
when '6.1'
|
92
|
+
'7'
|
93
|
+
when '6.0'
|
94
|
+
'Vista'
|
95
|
+
when '5.2'
|
96
|
+
'XP x64'
|
97
|
+
when '5.1'
|
98
|
+
'XP'
|
99
|
+
when '5.0'
|
100
|
+
'2000'
|
101
|
+
when '4.1'
|
102
|
+
'98'
|
103
|
+
when '4.9'
|
104
|
+
'ME'
|
105
|
+
when '4.0'
|
106
|
+
'95'
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
return os_name, os_version
|
50
113
|
end
|
51
114
|
|
52
115
|
# Parse out mobile device name and version
|
53
|
-
def get_mobile_data(
|
116
|
+
def get_mobile_data(name_version_pairs)
|
117
|
+
|
54
118
|
# Mobile device name and version
|
55
|
-
|
56
|
-
|
57
|
-
|
119
|
+
m_names = %w:Android Tablet Blackberry iPhone\ OS Zune CPU\ OS Windows\ Phone\ OS:
|
120
|
+
m_name, m_version = name_version_pairs.find do |name, version|
|
121
|
+
m_names.any? {|m_name| name =~ /#{m_name}/}
|
58
122
|
end
|
59
123
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
def bot?
|
72
|
-
!!(self.operating_system_name =~ /bot/i)
|
124
|
+
# Change underscores to periods in m_version
|
125
|
+
m_version = m_version.gsub(?_,?.) if m_version
|
126
|
+
|
127
|
+
m_name = 'iPad' if m_name == 'CPU OS'
|
128
|
+
m_name = 'iPhone' if m_name == 'CPU iPhone OS'
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
return m_name, m_version
|
73
133
|
end
|
74
134
|
|
75
135
|
|
76
136
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
137
|
+
# Parse out bot name and version
|
138
|
+
def get_bot_data(name_version_pairs)
|
139
|
+
|
140
|
+
# Bot name and version
|
141
|
+
bot_names = %w:bot google bing yahoo:
|
142
|
+
bot_name, bot_version = name_version_pairs.find do |name, version|
|
143
|
+
bot_names.any? {|bot_name| name =~ /#{bot_name}/i}
|
144
|
+
end
|
145
|
+
|
146
|
+
# Change underscores to periods in m_version
|
147
|
+
bot_version = bot_version.gsub(?_,?.) if bot_version
|
148
|
+
|
81
149
|
|
82
|
-
@mobile_device_name
|
83
|
-
end
|
84
|
-
|
85
|
-
def mobile_device_version
|
86
|
-
# Replace underscores in some version numbers to periods
|
87
|
-
@mobile_device_version = @mobile_device_version.gsub(?_,?.) if @mobile_device_version
|
88
|
-
end
|
89
|
-
|
90
|
-
def operating_system_name
|
91
|
-
# Change name from user agent to iOS if from an iPad or iPhone
|
92
|
-
return 'iOS' if ['CPU OS','CPU iPhone OS'].include? @operating_system_name
|
93
|
-
return 'Bot' if !!(@operating_system_name =~ /bot/i)
|
94
|
-
return 'Spider' if !!(@operating_system_name =~ /spider/i)
|
95
150
|
|
96
|
-
|
151
|
+
return bot_name, bot_version
|
97
152
|
end
|
98
153
|
|
99
|
-
def operating_system_version
|
100
|
-
# Replace underscores in some version numbers to periods
|
101
|
-
@operating_system_version = @operating_system_version.gsub(?_,?.) if @operating_system_version
|
102
|
-
end
|
103
154
|
|
104
|
-
def browser_name
|
105
|
-
return 'Internet Explorer' if @browser_name == 'MSIE'
|
106
|
-
|
107
|
-
@browser_name || 'Other'
|
108
|
-
end
|
109
155
|
|
110
|
-
|
111
|
-
|
112
|
-
|
156
|
+
# Check if AgentUser detects a mobile device
|
157
|
+
def mobile?
|
158
|
+
!!self.mobile_device_name
|
113
159
|
end
|
114
160
|
|
161
|
+
# Check if AgentUser detects a bot
|
162
|
+
def bot?
|
163
|
+
!!self.bot_name
|
164
|
+
end
|
115
165
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: agent_user
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-05 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: .
|
15
15
|
email:
|