useragent_parser 0.0.4 → 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/config/regexes.yaml +829 -0
- data/lib/useragent_parser/parsers/device_parser.rb +38 -0
- data/lib/useragent_parser/parsers/os_parser.rb +39 -0
- data/lib/useragent_parser/{parser.rb → parsers/user_agent_parser.rb} +3 -7
- data/lib/useragent_parser/user_agent.rb +31 -9
- data/lib/useragent_parser/version.rb +1 -1
- data/lib/useragent_parser.rb +70 -29
- data/spec/fixtures/additional_os_tests.yaml +134 -0
- data/spec/fixtures/firefox_user_agent_strings.yaml +804 -804
- data/spec/fixtures/pgts_browser_list.yaml +37489 -37489
- data/spec/fixtures/test_device.yaml +31 -0
- data/spec/fixtures/test_user_agent_parser.yaml +216 -687
- data/spec/fixtures/test_user_agent_parser_os.yaml +346 -0
- data/spec/parsers/device_parser_spec.rb +18 -0
- data/spec/parsers/os_parser_spec.rb +35 -0
- data/spec/{useragent_parser → parsers}/useragent_parser_spec.rb +16 -20
- data/spec/user_agent_spec.rb +190 -0
- data/spec/useragent_parser_spec.rb +34 -0
- metadata +44 -21
- data/config/user_agent_parser.yaml +0 -259
- data/spec/useragent_parser/user_agent_spec.rb +0 -169
data/config/regexes.yaml
ADDED
@@ -0,0 +1,829 @@
|
|
1
|
+
user_agent_parsers:
|
2
|
+
#### SPECIAL CASES TOP ####
|
3
|
+
|
4
|
+
# must go before Opera
|
5
|
+
- regex: '^(Opera)/(\d+)\.(\d+) \(Nintendo Wii'
|
6
|
+
family_replacement: 'Wii'
|
7
|
+
|
8
|
+
# must go before Firefox to catch SeaMonkey/Camino
|
9
|
+
- regex: '(SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
|
10
|
+
|
11
|
+
# Firefox
|
12
|
+
- regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?'
|
13
|
+
family_replacement: 'Pale Moon (Firefox Variant)'
|
14
|
+
- regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
|
15
|
+
family_replacement: 'Firefox Mobile'
|
16
|
+
- regex: '(Fennec)/(\d+)\.(\d+)(pre)'
|
17
|
+
family_replacement: 'Firefox Mobile'
|
18
|
+
- regex: '(Fennec)/(\d+)\.(\d+)'
|
19
|
+
family_replacement: 'Firefox Mobile'
|
20
|
+
- regex: 'Mobile.*(Firefox)/(\d+)\.(\d+)'
|
21
|
+
family_replacement: 'Firefox Mobile'
|
22
|
+
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
|
23
|
+
family_replacement: 'Firefox ($1)'
|
24
|
+
- regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
|
25
|
+
family_replacement: 'Firefox Alpha'
|
26
|
+
- regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
|
27
|
+
family_replacement: 'Firefox Beta'
|
28
|
+
- regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
|
29
|
+
family_replacement: 'Firefox Alpha'
|
30
|
+
- regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
|
31
|
+
family_replacement: 'Firefox Beta'
|
32
|
+
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
|
33
|
+
family_replacement: 'Firefox ($1)'
|
34
|
+
- regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
|
35
|
+
family_replacement: 'MicroB'
|
36
|
+
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
|
37
|
+
|
38
|
+
# e.g.: Flock/2.0b2
|
39
|
+
- regex: '(Flock)/(\d+)\.(\d+)(b\d+?)'
|
40
|
+
|
41
|
+
# RockMelt
|
42
|
+
- regex: '(RockMelt)/(\d+)\.(\d+)\.(\d+)'
|
43
|
+
|
44
|
+
# e.g.: Fennec/0.9pre
|
45
|
+
- regex: '(Navigator)/(\d+)\.(\d+)\.(\d+)'
|
46
|
+
family_replacement: 'Netscape'
|
47
|
+
|
48
|
+
- regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
|
49
|
+
family_replacement: 'Netscape'
|
50
|
+
|
51
|
+
- regex: '(Netscape6)/(\d+)\.(\d+)\.(\d+)'
|
52
|
+
family_replacement: 'Netscape'
|
53
|
+
|
54
|
+
- regex: '(MyIBrow)/(\d+)\.(\d+)'
|
55
|
+
family_replacement: 'My Internet Browser'
|
56
|
+
|
57
|
+
# Opera will stop at 9.80 and hide the real version in the Version string.
|
58
|
+
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
|
59
|
+
- regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
|
60
|
+
- regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
|
61
|
+
family_replacement: 'Opera Mobile'
|
62
|
+
- regex: 'Opera Mobi'
|
63
|
+
family_replacement: 'Opera Mobile'
|
64
|
+
- regex: '(Opera Mini)/(\d+)\.(\d+)'
|
65
|
+
- regex: '(Opera Mini)/att/(\d+)\.(\d+)'
|
66
|
+
- regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
|
67
|
+
|
68
|
+
# Palm WebOS looks a lot like Safari.
|
69
|
+
- regex: '(webOSBrowser)/(\d+)\.(\d+)'
|
70
|
+
- regex: '(webOS)/(\d+)\.(\d+)'
|
71
|
+
family_replacement: 'webOSBrowser'
|
72
|
+
- regex: '(wOSBrowser).+TouchPad/(\d+)\.(\d+)'
|
73
|
+
family_replacement: 'webOS TouchPad'
|
74
|
+
|
75
|
+
# LuaKit has no version info.
|
76
|
+
# http://luakit.org/projects/luakit/
|
77
|
+
- regex: '(luakit)'
|
78
|
+
family_replacement: 'LuaKit'
|
79
|
+
|
80
|
+
# Lightning (for Thunderbird)
|
81
|
+
# http://www.mozilla.org/projects/calendar/lightning/
|
82
|
+
- regex: '(Lightning)/(\d+)\.(\d+)([ab]?\d+[a-z]*)'
|
83
|
+
|
84
|
+
# Swiftfox
|
85
|
+
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
|
86
|
+
family_replacement: 'Swiftfox'
|
87
|
+
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
|
88
|
+
family_replacement: 'Swiftfox'
|
89
|
+
|
90
|
+
# Rekonq
|
91
|
+
- regex: 'rekonq'
|
92
|
+
family_replacement: 'Rekonq'
|
93
|
+
|
94
|
+
# Conkeror lowercase/uppercase
|
95
|
+
# http://conkeror.org/
|
96
|
+
- regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
|
97
|
+
family_replacement: 'Conkeror'
|
98
|
+
|
99
|
+
# catches lower case konqueror
|
100
|
+
- regex: '(konqueror)/(\d+)\.(\d+)\.(\d+)'
|
101
|
+
family_replacement: 'Konqueror'
|
102
|
+
|
103
|
+
- regex: '(WeTab)-Browser'
|
104
|
+
|
105
|
+
- regex: '(Comodo_Dragon)/(\d+)\.(\d+)\.(\d+)'
|
106
|
+
family_replacement: 'Comodo Dragon'
|
107
|
+
|
108
|
+
# Bots
|
109
|
+
- regex: '(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)'
|
110
|
+
|
111
|
+
# must go before NetFront below
|
112
|
+
- regex: '(Kindle)/(\d+)\.(\d+)'
|
113
|
+
|
114
|
+
- regex: '(Symphony) (\d+).(\d+)'
|
115
|
+
|
116
|
+
- regex: 'Minimo'
|
117
|
+
|
118
|
+
# Chrome Mobile
|
119
|
+
- regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
120
|
+
family_replacement: 'Chrome Mobile'
|
121
|
+
- regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
122
|
+
family_replacement: 'Chrome Mobile iOS'
|
123
|
+
- regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile'
|
124
|
+
family_replacement: 'Chrome Mobile'
|
125
|
+
|
126
|
+
# Chrome Frame must come before MSIE.
|
127
|
+
- regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
|
128
|
+
family_replacement: 'Chrome Frame'
|
129
|
+
|
130
|
+
# UC Browser
|
131
|
+
- regex: '(UC Browser)(\d+)\.(\d+)\.(\d+)'
|
132
|
+
|
133
|
+
# Tizen Browser (second case included in browser/major.minor regex)
|
134
|
+
- regex: '(SLP Browser)/(\d+)\.(\d+)'
|
135
|
+
family_replacement: 'Tizen Browser'
|
136
|
+
|
137
|
+
# Epiphany browser (identifies as Chromium)
|
138
|
+
- regex: '(Epiphany)/(\d+)\.(\d+).(\d+)'
|
139
|
+
|
140
|
+
# Sogou Explorer 2.X
|
141
|
+
- regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
|
142
|
+
family_replacement: 'Sogou Explorer'
|
143
|
+
|
144
|
+
# Pingdom
|
145
|
+
- regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
|
146
|
+
family_replacement: 'PingdomBot'
|
147
|
+
|
148
|
+
# Facebook
|
149
|
+
- regex: '(facebookexternalhit)/(\d+)\.(\d+)'
|
150
|
+
family_replacement: 'FacebookBot'
|
151
|
+
|
152
|
+
# Twitterbot
|
153
|
+
- regex: '(Twitterbot)/(\d+)\.(\d+)'
|
154
|
+
family_replacement: 'TwitterBot'
|
155
|
+
|
156
|
+
#### END SPECIAL CASES TOP ####
|
157
|
+
|
158
|
+
#### MAIN CASES - this catches > 50% of all browsers ####
|
159
|
+
|
160
|
+
# Browser/major_version.minor_version.beta_version
|
161
|
+
- regex: '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjaloo|Google Earth|Raven for Mac)/(\d+)\.(\d+)\.(\d+)'
|
162
|
+
|
163
|
+
# Browser/major_version.minor_version
|
164
|
+
- regex: '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser)/(\d+)\.(\d+)'
|
165
|
+
|
166
|
+
# Browser major_version.minor_version.beta_version (space instead of slash)
|
167
|
+
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
|
168
|
+
# Browser major_version.minor_version (space instead of slash)
|
169
|
+
- regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|BREW) (\d+)\.(\d+)\.?(\d+)?'
|
170
|
+
|
171
|
+
# weird android UAs
|
172
|
+
- regex: '(Android) Donut'
|
173
|
+
v1_replacement: '1'
|
174
|
+
v2_replacement: '2'
|
175
|
+
|
176
|
+
- regex: '(Android) Eclair'
|
177
|
+
v1_replacement: '2'
|
178
|
+
v2_replacement: '1'
|
179
|
+
|
180
|
+
- regex: '(Android) Froyo'
|
181
|
+
v1_replacement: '2'
|
182
|
+
v2_replacement: '2'
|
183
|
+
|
184
|
+
- regex: '(Android) Gingerbread'
|
185
|
+
v1_replacement: '2'
|
186
|
+
v2_replacement: '3'
|
187
|
+
|
188
|
+
- regex: '(Android) Honeycomb'
|
189
|
+
v1_replacement: '3'
|
190
|
+
|
191
|
+
# IE Mobile
|
192
|
+
- regex: '(IEMobile)[ /](\d+)\.(\d+)'
|
193
|
+
family_replacement: 'IE Mobile'
|
194
|
+
# desktop mode
|
195
|
+
# http://www.anandtech.com/show/3982/windows-phone-7-review
|
196
|
+
- regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
|
197
|
+
family_replacement: 'IE Large Screen'
|
198
|
+
|
199
|
+
# AFTER THE EDGE CASES ABOVE!
|
200
|
+
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
|
201
|
+
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
|
202
|
+
|
203
|
+
#### END MAIN CASES ####
|
204
|
+
|
205
|
+
#### SPECIAL CASES ####
|
206
|
+
- regex: '(Obigo)InternetBrowser'
|
207
|
+
- regex: '(Obigo)\-Browser'
|
208
|
+
- regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
|
209
|
+
|
210
|
+
- regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
|
211
|
+
family_replacement: 'Maxthon'
|
212
|
+
- regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
|
213
|
+
v1_replacement: '0'
|
214
|
+
|
215
|
+
- regex: '(PLAYSTATION) (\d+)'
|
216
|
+
family_replacement: 'PlayStation'
|
217
|
+
- regex: '(PlayStation Portable)[^\d]+(\d+).(\d+)'
|
218
|
+
|
219
|
+
- regex: '(BrowseX) \((\d+)\.(\d+)\.(\d+)'
|
220
|
+
|
221
|
+
# Polaris/d.d is above
|
222
|
+
- regex: '(POLARIS)/(\d+)\.(\d+)'
|
223
|
+
family_replacement: 'Polaris'
|
224
|
+
- regex: '(Embider)/(\d+)\.(\d+)'
|
225
|
+
family_replacement: 'Polaris'
|
226
|
+
|
227
|
+
- regex: '(BonEcho)/(\d+)\.(\d+)\.(\d+)'
|
228
|
+
family_replacement: 'Bon Echo'
|
229
|
+
|
230
|
+
- regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
|
231
|
+
family_replacement: 'Mobile Safari'
|
232
|
+
- regex: '(iPod).*Version/(\d+)\.(\d+)'
|
233
|
+
family_replacement: 'Mobile Safari'
|
234
|
+
- regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)'
|
235
|
+
family_replacement: 'Mobile Safari'
|
236
|
+
- regex: '(iPhone).*Version/(\d+)\.(\d+)'
|
237
|
+
family_replacement: 'Mobile Safari'
|
238
|
+
- regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)'
|
239
|
+
family_replacement: 'Mobile Safari'
|
240
|
+
- regex: '(iPad).*Version/(\d+)\.(\d+)'
|
241
|
+
family_replacement: 'Mobile Safari'
|
242
|
+
- regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)(?:_\d+)?_(\d+).*Mobile'
|
243
|
+
family_replacement: 'Mobile Safari'
|
244
|
+
- regex: '(iPod|iPhone|iPad)'
|
245
|
+
family_replacement: 'Mobile Safari'
|
246
|
+
|
247
|
+
- regex: '(AvantGo) (\d+).(\d+)'
|
248
|
+
|
249
|
+
- regex: '(Avant)'
|
250
|
+
v1_replacement: '1'
|
251
|
+
|
252
|
+
# nokia browsers
|
253
|
+
# based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
|
254
|
+
- regex: '^(Nokia)'
|
255
|
+
family_replacement: 'Nokia Services (WAP) Browser'
|
256
|
+
- regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)\.(\d+)'
|
257
|
+
- regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)'
|
258
|
+
- regex: '(NokiaBrowser)/(\d+)\.(\d+)'
|
259
|
+
- regex: '(BrowserNG)/(\d+)\.(\d+).(\d+)'
|
260
|
+
family_replacement: 'NokiaBrowser'
|
261
|
+
- regex: '(Series60)/5\.0'
|
262
|
+
family_replacement: 'NokiaBrowser'
|
263
|
+
v1_replacement: '7'
|
264
|
+
v2_replacement: '0'
|
265
|
+
- regex: '(Series60)/(\d+)\.(\d+)'
|
266
|
+
family_replacement: 'Nokia OSS Browser'
|
267
|
+
- regex: '(S40OviBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
268
|
+
family_replacement: 'Nokia Series 40 Ovi Browser'
|
269
|
+
- regex: '(Nokia)[EN]?(\d+)'
|
270
|
+
|
271
|
+
# BlackBerry devices
|
272
|
+
- regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
|
273
|
+
family_replacement: 'Blackberry WebKit'
|
274
|
+
- regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)'
|
275
|
+
family_replacement: 'Blackberry WebKit'
|
276
|
+
- regex: '(Black[bB]erry)\s?(\d+)'
|
277
|
+
family_replacement: 'Blackberry'
|
278
|
+
|
279
|
+
- regex: '(OmniWeb)/v(\d+)\.(\d+)'
|
280
|
+
|
281
|
+
- regex: '(Blazer)/(\d+)\.(\d+)'
|
282
|
+
family_replacement: 'Palm Blazer'
|
283
|
+
|
284
|
+
- regex: '(Pre)/(\d+)\.(\d+)'
|
285
|
+
family_replacement: 'Palm Pre'
|
286
|
+
|
287
|
+
- regex: '(Links) \((\d+)\.(\d+)'
|
288
|
+
|
289
|
+
- regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
|
290
|
+
|
291
|
+
#- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
|
292
|
+
# family_replacement: 'iPad'
|
293
|
+
|
294
|
+
# Amazon Silk, should go before Safari
|
295
|
+
- regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
|
296
|
+
|
297
|
+
# WebKit Nightly
|
298
|
+
- regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
|
299
|
+
family_replacement: 'WebKit Nightly'
|
300
|
+
|
301
|
+
# Safari
|
302
|
+
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
|
303
|
+
family_replacement: 'Safari'
|
304
|
+
# Safari didn't provide "Version/d.d.d" prior to 3.0
|
305
|
+
- regex: '(Safari)/\d+'
|
306
|
+
|
307
|
+
- regex: '(OLPC)/Update(\d+)\.(\d+)'
|
308
|
+
|
309
|
+
- regex: '(OLPC)/Update()\.(\d+)'
|
310
|
+
v1_replacement: '0'
|
311
|
+
|
312
|
+
- regex: '(SEMC\-Browser)/(\d+)\.(\d+)'
|
313
|
+
|
314
|
+
- regex: '(Teleca)'
|
315
|
+
family_replacement: 'Teleca Browser'
|
316
|
+
|
317
|
+
- regex: '(MSIE) (\d+)\.(\d+)'
|
318
|
+
family_replacement: 'IE'
|
319
|
+
|
320
|
+
- regex: '(Nintendo 3DS).* Version/(\d+)\.(\d+)(?:\.(\w+))'
|
321
|
+
|
322
|
+
os_parsers:
|
323
|
+
|
324
|
+
##########
|
325
|
+
# Android
|
326
|
+
# can actually detect rooted android os. do we care?
|
327
|
+
##########
|
328
|
+
- regex: '(Android) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
|
329
|
+
- regex: '(Android)\-(\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
|
330
|
+
|
331
|
+
- regex: '(Android) Donut'
|
332
|
+
os_v1_replacement: '1'
|
333
|
+
os_v2_replacement: '2'
|
334
|
+
|
335
|
+
- regex: '(Android) Eclair'
|
336
|
+
os_v1_replacement: '2'
|
337
|
+
os_v2_replacement: '1'
|
338
|
+
|
339
|
+
- regex: '(Android) Froyo'
|
340
|
+
os_v1_replacement: '2'
|
341
|
+
os_v2_replacement: '2'
|
342
|
+
|
343
|
+
- regex: '(Android) Gingerbread'
|
344
|
+
os_v1_replacement: '2'
|
345
|
+
os_v2_replacement: '3'
|
346
|
+
|
347
|
+
- regex: '(Android) Honeycomb'
|
348
|
+
os_v1_replacement: '3'
|
349
|
+
|
350
|
+
##########
|
351
|
+
# Windows
|
352
|
+
# http://en.wikipedia.org/wiki/Windows_NT#Releases
|
353
|
+
# possibility of false positive when different marketing names share same NT kernel
|
354
|
+
# e.g. windows server 2003 and windows xp
|
355
|
+
# lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
|
356
|
+
# (very) roughly ordered in terms of frequency of occurence of regex (win xp currently most frequent, etc)
|
357
|
+
##########
|
358
|
+
- regex: '(Windows Phone 6\.5)'
|
359
|
+
|
360
|
+
- regex: '(Windows (?:NT 5\.2|NT 5\.1))'
|
361
|
+
os_replacement: 'Windows XP'
|
362
|
+
|
363
|
+
# ie mobile des ktop mode
|
364
|
+
# spoofs nt 6.1. must come before windows 7
|
365
|
+
- regex: '(XBLWP7)'
|
366
|
+
os_replacement: 'Windows Phone OS'
|
367
|
+
|
368
|
+
- regex: '(Windows NT 6\.1)'
|
369
|
+
os_replacement: 'Windows 7'
|
370
|
+
|
371
|
+
- regex: '(Windows NT 6\.0)'
|
372
|
+
os_replacement: 'Windows Vista'
|
373
|
+
|
374
|
+
- regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000)'
|
375
|
+
|
376
|
+
# is this a spoof or is nt 6.2 out and about in some capacity?
|
377
|
+
- regex: '(Windows NT 6\.2)'
|
378
|
+
os_replacement: 'Windows 8'
|
379
|
+
|
380
|
+
- regex: '(Windows NT 5\.0)'
|
381
|
+
os_replacement: 'Windows 2000'
|
382
|
+
|
383
|
+
- regex: '(Windows Phone OS) (\d+)\.(\d+)'
|
384
|
+
|
385
|
+
- regex: '(Windows ?Mobile)'
|
386
|
+
os_replacement: 'Windows Mobile'
|
387
|
+
|
388
|
+
- regex: '(WinNT4.0)'
|
389
|
+
os_replacement: 'Windows NT 4.0'
|
390
|
+
|
391
|
+
- regex: '(Win98)'
|
392
|
+
os_replacement: 'Windows 98'
|
393
|
+
|
394
|
+
##########
|
395
|
+
# Tizen OS from Samsung
|
396
|
+
# spoofs Android so pushing it above
|
397
|
+
##########
|
398
|
+
- regex: '(Tizen)/(\d+)\.(\d+)'
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
##########
|
403
|
+
# Mac OS
|
404
|
+
# http://en.wikipedia.org/wiki/Mac_OS_X#Versions
|
405
|
+
##########
|
406
|
+
- regex: '(Mac OS X) (\d+)[_.](\d+)(?:[_.](\d+))?'
|
407
|
+
|
408
|
+
# builds before tiger don't seem to specify version?
|
409
|
+
|
410
|
+
# ios devices spoof (mac os x), so including intel/ppc prefixes
|
411
|
+
- regex: '(?:PPC|Intel) (Mac OS X)'
|
412
|
+
|
413
|
+
##########
|
414
|
+
# iOS
|
415
|
+
# http://en.wikipedia.org/wiki/IOS_version_history
|
416
|
+
##########
|
417
|
+
- regex: '(CPU OS|iPhone OS) (\d+)_(\d+)(?:_(\d+))?'
|
418
|
+
os_replacement: 'iOS'
|
419
|
+
|
420
|
+
# remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
|
421
|
+
- regex: '(iPhone|iPad|iPod); Opera'
|
422
|
+
os_replacement: 'iOS'
|
423
|
+
|
424
|
+
# few more stragglers
|
425
|
+
- regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
|
426
|
+
os_replacement: 'iOS'
|
427
|
+
|
428
|
+
##########
|
429
|
+
# Chrome OS
|
430
|
+
# if version 0.0.0, probably this stuff:
|
431
|
+
# http://code.google.com/p/chromium-os/issues/detail?id=11573
|
432
|
+
# http://code.google.com/p/chromium-os/issues/detail?id=13790
|
433
|
+
##########
|
434
|
+
- regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?'
|
435
|
+
os_replacement: 'Chrome OS'
|
436
|
+
|
437
|
+
##########
|
438
|
+
# Linux distros
|
439
|
+
##########
|
440
|
+
- regex: '(Debian)-(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
|
441
|
+
- regex: '(Linux Mint)(?:/(\d+))?'
|
442
|
+
- regex: '(Mandriva)(?: Linux)?/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
|
443
|
+
|
444
|
+
##########
|
445
|
+
# Symbian + Symbian OS
|
446
|
+
# http://en.wikipedia.org/wiki/History_of_Symbian
|
447
|
+
##########
|
448
|
+
- regex: '(Symbian[Oo][Ss])/(\d+)\.(\d+)'
|
449
|
+
os_replacement: 'Symbian OS'
|
450
|
+
- regex: '(Symbian/3).+NokiaBrowser/7\.3'
|
451
|
+
os_replacement: 'Symbian^3 Anna'
|
452
|
+
- regex: '(Symbian/3).+NokiaBrowser/7\.4'
|
453
|
+
os_replacement: 'Symbian^3 Belle'
|
454
|
+
- regex: '(Symbian/3)'
|
455
|
+
os_replacement: 'Symbian^3'
|
456
|
+
- regex: '(Series 60|SymbOS|S60)'
|
457
|
+
os_replacement: 'Symbian OS'
|
458
|
+
- regex: '(MeeGo)'
|
459
|
+
- regex: 'Symbian [Oo][Ss]'
|
460
|
+
os_replacement: 'Symbian OS'
|
461
|
+
|
462
|
+
##########
|
463
|
+
# BlackBerry devices
|
464
|
+
##########
|
465
|
+
- regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
|
466
|
+
os_replacement: 'BlackBerry OS'
|
467
|
+
- regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
|
468
|
+
os_replacement: 'BlackBerry OS'
|
469
|
+
- regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
|
470
|
+
os_replacement: 'BlackBerry Tablet OS'
|
471
|
+
- regex: '(Play[Bb]ook)'
|
472
|
+
os_replacement: 'BlackBerry Tablet OS'
|
473
|
+
- regex: '(Black[Bb]erry)'
|
474
|
+
os_replacement: 'Blackberry OS'
|
475
|
+
|
476
|
+
##########
|
477
|
+
# Misc mobile
|
478
|
+
##########
|
479
|
+
- regex: '(webOS|hpwOS)/(\d+)\.(\d+)(?:\.(\d+))?'
|
480
|
+
os_replacement: 'webOS'
|
481
|
+
|
482
|
+
##########
|
483
|
+
# Generic patterns
|
484
|
+
# since the majority of os cases are very specific, these go last
|
485
|
+
##########
|
486
|
+
# first.second.third.fourth bits
|
487
|
+
- regex: '(SUSE|Fedora|Red Hat|PCLinuxOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
|
488
|
+
|
489
|
+
# first.second.third bits
|
490
|
+
- regex: '(SUSE|Fedora|Red Hat|Puppy|PCLinuxOS|CentOS)/(\d+)\.(\d+)\.(\d+)'
|
491
|
+
|
492
|
+
# first.second bits
|
493
|
+
- regex: '(Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Red Hat|Slackware)/(\d+)\.(\d+)'
|
494
|
+
- regex: '(PlayStation Vita) (\d+)\.(\d+)'
|
495
|
+
|
496
|
+
# just os
|
497
|
+
- regex: '(Windows|OpenBSD|FreeBSD|NetBSD|Ubuntu|Kubuntu|Android|Arch Linux|CentOS|WeTab|Slackware)'
|
498
|
+
- regex: '(Linux|BSD)'
|
499
|
+
|
500
|
+
device_parsers:
|
501
|
+
##########
|
502
|
+
# incomplete!
|
503
|
+
# multiple replacement placeholds i.e. ($1) ($2) help solve problem of single device with multiple representations in ua
|
504
|
+
# e.g. HTC Dream S should parse to the same device as HTC_DreamS
|
505
|
+
##########
|
506
|
+
|
507
|
+
##########
|
508
|
+
# incomplete!
|
509
|
+
# HTC
|
510
|
+
# http://en.wikipedia.org/wiki/List_of_HTC_phones
|
511
|
+
# this is quickly getting unwieldy
|
512
|
+
##########
|
513
|
+
# example: Mozilla/5.0 (Linux; U; Android 2.3.2; fr-fr; HTC HD2 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
514
|
+
- regex: 'HTC ([A-Z][a-z0-9]+) Build'
|
515
|
+
device_replacement: 'HTC $1'
|
516
|
+
# example: Mozilla/5.0 (Linux; U; Android 2.1; es-es; HTC Legend 1.23.161.1 Build/ERD79) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17,gzip
|
517
|
+
- regex: 'HTC ([A-Z][a-z0-9 ]+) \d+\.\d+\.\d+\.\d+'
|
518
|
+
device_replacement: 'HTC $1'
|
519
|
+
# example: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch_Diamond2_T5353; Windows Phone 6.5.3.5)
|
520
|
+
- regex: 'HTC_Touch_([A-Za-z0-9]+)'
|
521
|
+
device_replacement: 'HTC Touch ($1)'
|
522
|
+
# should come after HTC_Touch
|
523
|
+
- regex: 'USCCHTC(\d+)'
|
524
|
+
device_replacement: 'HTC $1 (US Cellular)'
|
525
|
+
- regex: 'Sprint APA(9292)'
|
526
|
+
device_replacement: 'HTC $1 (Sprint)'
|
527
|
+
- regex: 'HTC ([A-Za-z0-9]+ [A-Z])'
|
528
|
+
device_replacement: 'HTC $1'
|
529
|
+
- regex: 'HTC-([A-Za-z0-9]+)'
|
530
|
+
device_replacement: 'HTC $1'
|
531
|
+
- regex: 'HTC_([A-Za-z0-9]+)'
|
532
|
+
device_replacement: 'HTC $1'
|
533
|
+
- regex: 'HTC ([A-Za-z0-9]+)'
|
534
|
+
device_replacement: 'HTC $1'
|
535
|
+
- regex: '(ADR[A-Za-z0-9]+)'
|
536
|
+
device_replacement: 'HTC $1'
|
537
|
+
- regex: '(HTC)'
|
538
|
+
|
539
|
+
# Samsung
|
540
|
+
- regex: '(SamsungSGHi560)'
|
541
|
+
device_replacement: 'Samsung SGHi560'
|
542
|
+
|
543
|
+
#########
|
544
|
+
# Ericsson - must come before nokia since they also use symbian
|
545
|
+
#########
|
546
|
+
- regex: 'SonyEricsson([A-Za-z0-9]+)/'
|
547
|
+
device_replacement: 'Ericsson $1'
|
548
|
+
|
549
|
+
#########
|
550
|
+
# Android General Device Matching (far from perfect)
|
551
|
+
#########
|
552
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\; [A-Za-z]{2}\-[A-Za-z]{2}\; WOWMobile (.+) Build'
|
553
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{2}\; (.+) Build'
|
554
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\-update1\; [A-Za-z]{2}\-[A-Za-z]{2}\; (.+) Build'
|
555
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\; [A-Za-z]{2}\-[A-Za-z]{2}\; (.+) Build'
|
556
|
+
- regex: 'Android[\- ][\d]+\.[\d]+\.[\d]+; (.+) Build'
|
557
|
+
|
558
|
+
##########
|
559
|
+
# NOKIA
|
560
|
+
# nokia NokiaN8-00 comes before iphone. sometimes spoofs iphone
|
561
|
+
##########
|
562
|
+
- regex: 'NokiaN([0-9]+)'
|
563
|
+
device_replacement: 'Nokia N$1'
|
564
|
+
- regex: 'Nokia([A-Za-z0-9\v-]+)'
|
565
|
+
device_replacement: 'Nokia $1'
|
566
|
+
- regex: 'NOKIA ([A-Za-z0-9\-]+)'
|
567
|
+
device_replacement: 'Nokia $1'
|
568
|
+
- regex: 'Nokia ([A-Za-z0-9\-]+)'
|
569
|
+
device_replacement: 'Nokia $1'
|
570
|
+
- regex: 'Lumia ([A-Za-z0-9\-]+)'
|
571
|
+
device_replacement: 'Lumia $1'
|
572
|
+
- regex: 'Symbian'
|
573
|
+
device_replacement: 'Nokia'
|
574
|
+
|
575
|
+
##########
|
576
|
+
# Blackberry
|
577
|
+
# http://www.useragentstring.com/pages/BlackBerry/
|
578
|
+
##########
|
579
|
+
- regex: '(PlayBook).+RIM Tablet OS'
|
580
|
+
device_replacement: 'Blackberry Playbook'
|
581
|
+
- regex: '(Black[Bb]erry [0-9]+);'
|
582
|
+
- regex: 'Black[Bb]erry([0-9]+)'
|
583
|
+
device_replacement: 'BlackBerry $1'
|
584
|
+
|
585
|
+
##########
|
586
|
+
# PALM / HP
|
587
|
+
##########
|
588
|
+
# some palm devices must come before iphone. sometimes spoofs iphone in ua
|
589
|
+
- regex: '(Pre)/(\d+)\.(\d+)'
|
590
|
+
device_replacement: 'Palm Pre'
|
591
|
+
- regex: '(Pixi)/(\d+)\.(\d+)'
|
592
|
+
device_replacement: 'Palm Pixi'
|
593
|
+
- regex: '(Touchpad)/(\d+)\.(\d+)'
|
594
|
+
device_replacement: 'HP Touchpad'
|
595
|
+
- regex: 'HPiPAQ([A-Za-z0-9]+)/(\d+).(\d+)'
|
596
|
+
device_replacement: 'HP iPAQ $1'
|
597
|
+
- regex: 'Palm([A-Za-z0-9]+)'
|
598
|
+
device_replacement: 'Palm $1'
|
599
|
+
- regex: 'Treo([A-Za-z0-9]+)'
|
600
|
+
device_replacement: 'Palm Treo $1'
|
601
|
+
- regex: 'webOS.*(P160UNA)/(\d+).(\d+)'
|
602
|
+
device_replacement: 'HP Veer'
|
603
|
+
|
604
|
+
##########
|
605
|
+
# incomplete!
|
606
|
+
# Kindle
|
607
|
+
##########
|
608
|
+
- regex: '(Kindle Fire)'
|
609
|
+
- regex: '(Kindle)'
|
610
|
+
- regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
|
611
|
+
device_replacement: 'Kindle Fire'
|
612
|
+
|
613
|
+
##########
|
614
|
+
# complete but probably catches spoofs
|
615
|
+
# iSTUFF
|
616
|
+
##########
|
617
|
+
# ipad and ipod must be parsed before iphone
|
618
|
+
# cannot determine specific device type from ua string. (3g, 3gs, 4, etc)
|
619
|
+
- regex: '(iPad) Simulator;'
|
620
|
+
- regex: '(iPad);'
|
621
|
+
- regex: '(iPod);'
|
622
|
+
- regex: '(iPhone) Simulator;'
|
623
|
+
- regex: '(iPhone);'
|
624
|
+
|
625
|
+
##########
|
626
|
+
# Acer
|
627
|
+
##########
|
628
|
+
- regex: 'acer_([A-Za-z0-9]+)_'
|
629
|
+
device_replacement: 'Acer $1'
|
630
|
+
- regex: 'acer_([A-Za-z0-9]+)_'
|
631
|
+
device_replacement: 'Acer $1'
|
632
|
+
|
633
|
+
##########
|
634
|
+
# Amoi
|
635
|
+
##########
|
636
|
+
- regex: 'Amoi\-([A-Za-z0-9]+)'
|
637
|
+
device_replacement: 'Amoi $1'
|
638
|
+
- regex: 'AMOI\-([A-Za-z0-9]+)'
|
639
|
+
device_replacement: 'Amoi $1'
|
640
|
+
|
641
|
+
##########
|
642
|
+
# Amoi
|
643
|
+
##########
|
644
|
+
- regex: 'Asus\-([A-Za-z0-9]+)'
|
645
|
+
device_replacement: 'Asus $1'
|
646
|
+
- regex: 'ASUS\-([A-Za-z0-9]+)'
|
647
|
+
device_replacement: 'Asus $1'
|
648
|
+
|
649
|
+
##########
|
650
|
+
# Bird
|
651
|
+
##########
|
652
|
+
- regex: 'BIRD\-([A-Za-z0-9]+)'
|
653
|
+
device_replacement: 'Bird $1'
|
654
|
+
- regex: 'BIRD\.([A-Za-z0-9]+)'
|
655
|
+
device_replacement: 'Bird $1'
|
656
|
+
- regex: 'BIRD ([A-Za-z0-9]+)'
|
657
|
+
device_replacement: 'Bird $1'
|
658
|
+
|
659
|
+
##########
|
660
|
+
# Dell
|
661
|
+
##########
|
662
|
+
- regex: 'Dell ([A-Za-z0-9]+)'
|
663
|
+
device_replacement: 'Dell $1'
|
664
|
+
|
665
|
+
##########
|
666
|
+
# DoCoMo
|
667
|
+
##########
|
668
|
+
- regex: 'DoCoMo/2\.0 ([A-Za-z0-9]+)'
|
669
|
+
device_replacement: 'DoCoMo $1'
|
670
|
+
- regex: '([A-Za-z0-9]+)\_W\;FOMA'
|
671
|
+
device_replacement: 'DoCoMo $1'
|
672
|
+
- regex: '([A-Za-z0-9]+)\;FOMA'
|
673
|
+
device_replacement: 'DoCoMo $1'
|
674
|
+
|
675
|
+
##########
|
676
|
+
# Huawei Vodafone
|
677
|
+
##########
|
678
|
+
- regex: 'vodafone([A-Za-z0-9]+)'
|
679
|
+
device_replacement: 'Huawei Vodafone $1'
|
680
|
+
|
681
|
+
##########
|
682
|
+
# i-mate
|
683
|
+
##########
|
684
|
+
- regex: 'i\-mate ([A-Za-z0-9]+)'
|
685
|
+
device_replacement: 'i-mate $1'
|
686
|
+
|
687
|
+
##########
|
688
|
+
# kyocera
|
689
|
+
##########
|
690
|
+
- regex: 'Kyocera\-([A-Za-z0-9]+)'
|
691
|
+
device_replacement: 'Kyocera $1'
|
692
|
+
- regex: 'KWC\-([A-Za-z0-9]+)'
|
693
|
+
device_replacement: 'Kyocera $1'
|
694
|
+
|
695
|
+
##########
|
696
|
+
# lenovo
|
697
|
+
##########
|
698
|
+
- regex: 'Lenovo\-([A-Za-z0-9]+)'
|
699
|
+
device_replacement: 'Lenovo $1'
|
700
|
+
- regex: 'Lenovo\_([A-Za-z0-9]+)'
|
701
|
+
device_replacement: 'Lenovo $1'
|
702
|
+
|
703
|
+
##########
|
704
|
+
# lg
|
705
|
+
##########
|
706
|
+
- regex: 'LG/([A-Za-z0-9]+)'
|
707
|
+
device_replacement: 'LG $1'
|
708
|
+
- regex: 'LG-LG([A-Za-z0-9]+)'
|
709
|
+
device_replacement: 'LG $1'
|
710
|
+
- regex: 'LGE-LG([A-Za-z0-9]+)'
|
711
|
+
device_replacement: 'LG $1'
|
712
|
+
- regex: 'LGE VX([A-Za-z0-9]+)'
|
713
|
+
device_replacement: 'LG $1'
|
714
|
+
- regex: 'LG ([A-Za-z0-9]+)'
|
715
|
+
device_replacement: 'LG $1'
|
716
|
+
- regex: 'LGE LG\-AX([A-Za-z0-9]+)'
|
717
|
+
device_replacement: 'LG $1'
|
718
|
+
- regex: 'LG\-([A-Za-z0-9]+)'
|
719
|
+
device_replacement: 'LG $1'
|
720
|
+
- regex: 'LGE\-([A-Za-z0-9]+)'
|
721
|
+
device_replacement: 'LG $1'
|
722
|
+
- regex: 'LG([A-Za-z0-9]+)'
|
723
|
+
device_replacement: 'LG $1'
|
724
|
+
|
725
|
+
##########
|
726
|
+
# kin
|
727
|
+
##########
|
728
|
+
- regex: '(KIN)\.One (\d+)\.(\d+)'
|
729
|
+
device_replacement: 'Microsoft $1'
|
730
|
+
- regex: '(KIN)\.Two (\d+)\.(\d+)'
|
731
|
+
device_replacement: 'Microsoft $1'
|
732
|
+
|
733
|
+
##########
|
734
|
+
# motorola
|
735
|
+
##########
|
736
|
+
- regex: '(Motorola)\-([A-Za-z0-9]+)'
|
737
|
+
- regex: 'MOTO\-([A-Za-z0-9]+)'
|
738
|
+
device_replacement: 'Motorola $1'
|
739
|
+
- regex: 'MOT\-([A-Za-z0-9]+)'
|
740
|
+
device_replacement: 'Motorola $1'
|
741
|
+
|
742
|
+
##########
|
743
|
+
# philips
|
744
|
+
##########
|
745
|
+
- regex: 'Philips([A-Za-z0-9]+)'
|
746
|
+
device_replacement: 'Philips $1'
|
747
|
+
- regex: 'Philips ([A-Za-z0-9]+)'
|
748
|
+
device_replacement: 'Philips $1'
|
749
|
+
|
750
|
+
##########
|
751
|
+
# Samsung
|
752
|
+
##########
|
753
|
+
- regex: 'SAMSUNG-([A-Za-z0-9\-]+)'
|
754
|
+
device_replacement: 'Samsung $1'
|
755
|
+
- regex: 'SAMSUNG\; ([A-Za-z0-9\-]+)'
|
756
|
+
device_replacement: 'Samsung $1'
|
757
|
+
|
758
|
+
##########
|
759
|
+
# Softbank
|
760
|
+
##########
|
761
|
+
- regex: 'Softbank/1\.0/([A-Za-z0-9]+)'
|
762
|
+
device_replacement: 'Softbank $1'
|
763
|
+
- regex: 'Softbank/2\.0/([A-Za-z0-9]+)'
|
764
|
+
device_replacement: 'Softbank $1'
|
765
|
+
|
766
|
+
##########
|
767
|
+
# Generic Smart Phone
|
768
|
+
##########
|
769
|
+
- regex: '(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)'
|
770
|
+
device_replacement: "Generic Smartphone"
|
771
|
+
|
772
|
+
##########
|
773
|
+
# Generic Feature Phone
|
774
|
+
##########
|
775
|
+
- regex: '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\-|airn|alav|asus|attw|au\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\-n|bw\-u|beck|benq|bilb|blac|c55/|cdm\-|chtm|capi|comp|cond|craw|dall|dbte|dc\-s|dica|ds\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\-|fly\_|g\-mo|g1 u|g560|gf\-5|grun|gene|go.w|good|grad|hcit|hd\-m|hd\-p|hd\-t|hei\-|hp i|hpip|hs\-c|htc |htc\-|htca|htcg)'
|
776
|
+
device_replacement: 'Generic Feature Phone'
|
777
|
+
- regex: '^(htcp|htcs|htct|htc\_|haie|hita|huaw|hutc|i\-20|i\-go|i\-ma|i230|iac|iac\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\-|klon|lexi|lg g|lg\-a|lg\-b|lg\-c|lg\-d|lg\-f|lg\-g|lg\-k|lg\-l|lg\-m|lg\-o|lg\-p|lg\-s|lg\-t|lg\-u|lg\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\-|lge/|lynx|leno|m1\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\-|nem\-|newg|neon)'
|
778
|
+
device_replacement: 'Generic Feature Phone'
|
779
|
+
- regex: '^(netf|noki|nzph|o2 x|o2\-x|opwv|owg1|opti|oran|ot\-s|p800|pand|pg\-1|pg\-2|pg\-3|pg\-6|pg\-8|pg\-c|pg13|phil|pn\-2|pt\-g|palm|pana|pire|pock|pose|psio|qa\-a|qc\-2|qc\-3|qc\-5|qc\-7|qc07|qc12|qc21|qc32|qc60|qci\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\-|scp\-|sdk/|se47|sec\-|sec0|sec1|semc|sgh\-|shar|sie\-|sk\-0|sl45|slid|smb3|smt5|sp01|sph\-|spv |spv\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\-mo|t218|t250|t600|t610|t618|tcl\-|tdg\-|telm|tim\-|ts70|tsm\-|tsm3|tsm5|tx\-9|tagt)'
|
780
|
+
device_replacement: 'Generic Feature Phone'
|
781
|
+
- regex: '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\-|your|zte\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\-|webc|whit|wmlb|xda\-|xda\_)'
|
782
|
+
device_replacement: 'Generic Feature Phone'
|
783
|
+
|
784
|
+
##########
|
785
|
+
# Spiders (this is hack...)
|
786
|
+
##########
|
787
|
+
- regex: '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks)'
|
788
|
+
device_replacement: 'Spider'
|
789
|
+
|
790
|
+
|
791
|
+
mobile_user_agent_families:
|
792
|
+
- 'Firefox Mobile'
|
793
|
+
- 'Opera Mobile'
|
794
|
+
- 'Opera Mini'
|
795
|
+
- 'Mobile Safari'
|
796
|
+
- 'webOS'
|
797
|
+
- 'IE Mobile'
|
798
|
+
- 'Playstation Portable'
|
799
|
+
- 'Nokia'
|
800
|
+
- 'Blackberry'
|
801
|
+
- 'Palm'
|
802
|
+
- 'Silk'
|
803
|
+
- 'Android'
|
804
|
+
- 'Maemo'
|
805
|
+
- 'Obigo'
|
806
|
+
- 'Netfront'
|
807
|
+
- 'AvantGo'
|
808
|
+
- 'Teleca'
|
809
|
+
- 'SEMC-Browser'
|
810
|
+
- 'Bolt'
|
811
|
+
- 'Iris'
|
812
|
+
- 'UP.Browser'
|
813
|
+
- 'Symphony'
|
814
|
+
- 'Minimo'
|
815
|
+
- 'Bunjaloo'
|
816
|
+
- 'Jasmine'
|
817
|
+
- 'Dolfin'
|
818
|
+
- 'Polaris'
|
819
|
+
- 'BREW'
|
820
|
+
- 'Chrome Mobile'
|
821
|
+
- 'UC Browser'
|
822
|
+
- 'Tizen Browser'
|
823
|
+
|
824
|
+
# Some select mobile OSs report a desktop browser.
|
825
|
+
# make sure we note they're mobile
|
826
|
+
mobile_os_families:
|
827
|
+
- 'Windows Phone 6.5'
|
828
|
+
- 'Windows CE'
|
829
|
+
- 'Symbian OS'
|