Skip to content
This repository was archived by the owner on Apr 9, 2023. It is now read-only.

Commit 17b8fcc

Browse files
committed
Improved user agent detection
1 parent d8f8b61 commit 17b8fcc

1 file changed

Lines changed: 50 additions & 72 deletions

File tree

webanalytics.php

Lines changed: 50 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -173,111 +173,89 @@ class web_analytics {
173173
private $u_bot = 0;
174174

175175
function analyse_user_agent($user_agent) {
176-
$result = array("browser" => array("name" => null, "version" => null), "os" => array("name" => null, "version" => null), "device" => array("name" => null));
177-
$gecko = false;
178-
if(preg_match("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) Gecko\/\d+/i", $user_agent)) {
179-
$gecko = true;
180-
}
181-
$webkit = false;
182-
if(preg_match("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) AppleWebKit\/\d[\d.]* \(KHTML, like Gecko\)/i", $user_agent)) {
183-
$webkit = true;
184-
}
185-
$trident = false;
176+
$result = array();
177+
$gecko = preg_match("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) Gecko\/\d+/i", $user_agent);
178+
$webkit = preg_match("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) AppleWebKit\/\d[\d.]* \(KHTML, like Gecko\)/i", $user_agent);
186179
if(preg_match_all("/\w+\/\d[\d.]*/", $user_agent, $matches)) {
187180
$browser = preg_split("/\//",$matches[0][array_key_last($matches[0])]);
181+
$trident = (preg_match("/trident/i", $browser[0]) && !$gecko && !$webkit);
188182
if($webkit) {
189-
if(preg_match("/safari/i", $browser[0]) && (preg_match("/chrome/i", $user_agent) || preg_match("/crios/i", $user_agent))) {
183+
if(preg_match("/safari/i", $browser[0])) {
190184
$browser = preg_split("/\//",$matches[0][2]);
191-
if(preg_match("/version/i", $browser[0])) {
192-
$browser = preg_split("/\//",$matches[0][3]);
193-
}
194-
if(!preg_match("/chrome/i", $browser[0])) {
195-
$browser[0] = "chrome";
185+
$i = 3;
186+
while((preg_match("/version/i", $browser[0]) || preg_match("/mobile/i", $browser[0])) && isset($matches[0][$i])) {
187+
$browser = preg_split("/\//",$matches[0][$i]);
188+
$i++;
196189
}
197190
}
198-
} else if(preg_match("/trident/i", $browser[0]) && !$gecko) {
199-
$trident = true;
200191
}
201-
$result["browser"]["name"] = $browser[0];
202-
$result["browser"]["version"] = $browser[1];
203192
}
204193
if(preg_match("/\([A-Za-z0-9_.\- ;:\/]*\)/", $user_agent, $match)) {
205-
$platform = preg_replace("/\(/", "", $match[0]);
206-
$platform = preg_replace("/\)/", "", $platform);
207-
$platforms = preg_split("/; /", $platform);
208-
$os = null;
209-
$osv = null;
194+
$platforms = preg_split("/; /", preg_replace("/\)/", "", preg_replace("/\(/", "", $match[0])));
210195
if($trident) {
211196
$browser = preg_split("/ /",$platforms[1]);
212197
if(preg_match("/msie/i", $browser[0])) {
213-
$result["browser"]["name"] = $browser[0];
214-
$result["browser"]["version"] = $browser[1];
215198
$os = preg_split("/ \d/", preg_replace("/ nt/i", "",$platforms[2]));
216199
$osv = preg_split("/ /",$platforms[2]);
217-
$result["device"]["name"] = "pc";
200+
if(preg_match("/xbox/i", $platforms[array_key_last($platforms)])) {
201+
$result["device"]["name"] = $platforms[array_key_last($platforms)];
202+
}
218203
} else {
219-
$result["browser"]["name"] = "msie";
204+
$browser[0] = "msie";
220205
$version = preg_split("/:/", $platforms[array_key_last($platforms)]);
221-
$result["browser"]["version"] = $version[1];
206+
$browser[1] = $version[1];
222207
}
223208
}
224209
if(preg_match("/windows/i", $platforms[0])) {
225210
$os = preg_split("/ \d/", preg_replace("/ nt/i", "",$platforms[0]));
226211
$osv = preg_split("/ /",$platforms[0]);
227-
$result["device"]["name"] = "pc";
228212
if(preg_match("/phone/i", $os[0])) {
229213
$result["device"]["name"] = $platforms[array_key_last($platforms)-1]." ".$platforms[array_key_last($platforms)];
230214
}
231-
if(isset($platforms[3]) && preg_match("/xbox/i", $platforms[3])) {
232-
$result["device"]["name"] = $platforms[3];
233-
if(isset($platforms[4])) {
234-
$result["device"]["name"] = $platforms[4];
235-
}
215+
if(preg_match("/xbox/i", $platforms[array_key_last($platforms)])) {
216+
$result["device"]["name"] = $platforms[array_key_last($platforms)];
236217
}
237218
} else if(preg_match("/linux/i", $platforms[0])) {
238-
$os = preg_split("/ \d/",$platforms[1]);
239-
$osv = preg_split("/ /",$platforms[1]);
240-
if(preg_match("/android/i", $os[0]) && preg_match("/build/i", $platforms[2])) {
241-
$device = preg_split("/ build/i", $platforms[2]);
242-
$result["device"]["name"] = $device[0];
219+
$i = preg_match("/u/i", $platforms[1]) ? 2 : 1;
220+
$os = preg_split("/ \d/",$platforms[$i]);
221+
if(preg_match("/android/i", $os[0])) {
222+
$osv = preg_split("/ /",$platforms[$i]);
223+
} else {
224+
$os = preg_split("/ /",$platforms[0]);
243225
}
244-
} else if(preg_match("/linux/i", $platforms[1])) {
245-
$os = preg_split("/ /",$platforms[1]);
246-
if(preg_match("/x11/i", $platforms[0])) {
247-
$result["device"]["name"] = "pc";
226+
foreach ($platforms as $property) {
227+
if(preg_match("/build/i", $property)) {
228+
$device = preg_split("/ build/i", $property);
229+
$result["device"]["name"] = $device[0];
230+
}
248231
}
249-
} else if(preg_match("/cros/i", $platforms[1])) {
232+
} else if(preg_match("/linux/i", $platforms[1]) || preg_match("/cros/i", $platforms[1]) || preg_match("/ubuntu/i", $platforms[1])) {
250233
$os = preg_split("/ /",$platforms[1]);
251-
$result["device"]["name"] = "chromebook";
252234
} else if(preg_match("/macintosh/i", $platforms[0])) {
253235
$os = preg_split("/ \d/",preg_replace("/intel /i", "", $platforms[1]));
254236
$osv = preg_split("/ /",$platforms[1]);
255-
$result["device"]["name"] = "mac";
237+
$result["device"]["name"] = $platforms[0];
256238
} else if(preg_match("/iphone/i", $platforms[0]) || preg_match("/ipad/i", $platforms[0]) || preg_match("/ipod/i", $platforms[0])) {
257239
$os = preg_split("/ \d/",preg_replace("/cpu /i", "", $platforms[1]));
258240
$osv = preg_split("/ /", preg_replace("/ like mac os x/i", "", $platforms[1]));
259241
$result["device"]["name"] = $platforms[0];
242+
} else if(preg_match("/android/i", $platforms[0])) {
243+
$os = preg_split("/ \d/",$platforms[0]);
244+
$osv = preg_split("/ /",$platforms[0]);
245+
$result["device"]["name"] = $platforms[1];
260246
}
261-
$result["os"]["name"] = isset($os) ? $os[0] : null;
262-
$result["os"]["version"] = isset($osv) ? $osv[array_key_last($osv)] : null;
263-
}
264-
return $result;
265-
}
266-
267-
function check_if_bot() {
268-
$bot_array = array('/googlebot/i' => 'Google',
269-
'/bingbot/i' => 'Bing',
270-
'/twitterbot/i' => 'Twitter',
271-
'/baiduspider/i' => 'Baidu',
272-
'/yandex/i' => 'Yandex',
273-
'/duckduck/i' => 'DuckDuckGo',
274-
'/archive.org_bot/i' => 'Archive.org');
275-
foreach ($bot_array as $regex => $value) {
276-
if (preg_match($regex, $this->ua)) {
277-
return TRUE;
247+
if(isset($os)) {
248+
$result["os"]["name"] = $os[0];
249+
}
250+
if(isset($osv)) {
251+
$result["os"]["version"] = $osv[array_key_last($osv)];
278252
}
279253
}
280-
return FALSE;
254+
if(isset($browser)) {
255+
$result["browser"]["name"] = $browser[0];
256+
$result["browser"]["version"] = $browser[1];
257+
}
258+
return $result;
281259
}
282260

283261
// Get user language and country from hostname and http header
@@ -433,11 +411,11 @@ function get_agent() {
433411
$this->db_manager->add("wa_agents", array(
434412
"id" => $id,
435413
"agent" => $this->ua,
436-
"browser" => $uaa["browser"]["name"],
437-
"browser_version" => $uaa["browser"]["version"],
438-
"os" => $uaa["os"]["name"],
439-
"os_version" => $uaa["os"]["version"],
440-
"device" => $uaa["device"]["name"],
414+
"browser" => isset($uaa["browser"]["name"]) ? $uaa["browser"]["name"] : null,
415+
"browser_version" => isset($uaa["browser"]["version"]) ? $uaa["browser"]["version"] : null,
416+
"os" => isset($uaa["os"]["name"]) ? $uaa["os"]["name"] : null,
417+
"os_version" => isset($uaa["os"]["version"]) ? $uaa["os"]["version"] : null,
418+
"device" => isset($uaa["device"]["name"]) ? $uaa["device"]["name"] : null,
441419
"mobile" => $this->u_mobile,
442420
"bot" => $this->u_bot
443421
));
@@ -591,7 +569,7 @@ function __construct($db_manager, $server, $cookies, $anonymousips = TRUE) {
591569
} else { $this->d = $domain; }
592570
}
593571
$this->u_mobile = preg_match('/mobile/i', $this->ua) ? 1 : 0;
594-
$this->u_bot = $this->check_if_bot() ? 1 : 0;
572+
$this->u_bot = (preg_match('/bot/i', $this->ua) || preg_match('/crawler/i', $this->ua)) ? 1 : 0;
595573
$this->u_language = isset($this->s["HTTP_ACCEPT_LANGUAGE"]) ? substr($this->s['HTTP_ACCEPT_LANGUAGE'], 0, 2) : null;
596574
$this->u_country_code = $this->get_country_code();
597575
$this->check_database();

0 commit comments

Comments
 (0)