agent_user 1.0.3 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|