public function now(){ $request = $this->getPageRequest(); $view = $this->getView(); if(!$request->isJSON()) return View::ERROR_BADREQUEST; $view->contenttype = View::CTYPE_JSON; $view->mode = View::MODE_AJAX; $view->record = false; $limit = $this->_getQueryLimit(); $duration = 60; // Use FindRaw because it's faster than using full Models for everything, especially when dealing with 20k + records. $listings = UserActivityModel::FindRaw('datetime >= ' . (Time::GetCurrent() - $duration), $limit, 'datetime DESC'); $data = array(); // Performance reports $data['information'] = array( 'duration' => $duration, ); $data['performance'] = array('get' => 0, 'post' => 0); $data['requests'] = array('get' => 0, 'post' => 0); $users = array(); $bots = array(); $guestname = \ConfigHandler::Get('/user/displayname/anonymous'); foreach($listings as $log){ if($log['type'] == 'GET'){ $data['performance']['get'] += $log['processing_time']; $data['requests']['get']++; } elseif($log['type'] == 'POST'){ $data['performance']['post'] += $log['processing_time']; $data['requests']['post']++; } $ua = new \Core\UserAgent($log['useragent']); if(class_exists('\\geocode\\IPLookup')){ // If the geo library is available, use that to resolve the IP to something more meaningful than just a number. $lookup = new \geocode\IPLookup($log['ip_addr']); $file = \Core\Filestore\Factory::File('assets/images/iso-country-flags/' . strtolower($lookup->country) . '.png'); if($lookup->province && $lookup->city){ $title = $lookup->city . ', ' . $lookup->province . ', ' . $lookup->getCountryName(); } elseif($lookup->province){ $title = $lookup->province . ', ' . $lookup->getCountryName(); } elseif($lookup->city){ $title = $lookup->city . ' ' . $lookup->getCountryName(); } else{ $title = $lookup->getCountryName(); } $ip = '<span title="' . $title . '">'; if($file->exists()){ $ip .= '<img src="' . $file->getPreviewURL('20x20') . '" alt="' . $lookup->country . '"/> '; } $ip .= $log['ip_addr']; $ip .= '</span>'; } else{ $ip = $log['ip_addr']; } // Bots have their own data, because, well... they're bots. // Damn bots! if($ua->isBot()){ if(!isset($bots[ $log['ip_addr'] ])){ $bots[ $log['ip_addr'] ] = array( 'ip' => $ip, 'useragent' => $log['useragent'], 'lastpage' => $log['request'], 'status' => $log['status'], //'type' => $ua->, 'browser' => $ua->getAsHTML(), 'count' => 1, ); } else{ $bots[$log['ip_addr']]['count']++; } } // The user agent information I want to know on a per-user basis, not a per-click basis. else{ if(!isset($users[ $log['session_id'] ])){ $thisuser = UserModel::Construct($log['user_id']); $users[ $log['session_id'] ] = array( 'session' => $log['session_id'], 'ip' => $ip, 'user_id' => $log['user_id'], 'username' => ($thisuser ? $thisuser->getDisplayName() : $guestname), 'useragent' => $log['useragent'], 'lastpage' => $log['request'], //'type' => $ua->type, 'browser' => $ua->getAsHTML(), 'os' => '', 'count' => 1, ); } else{ $users[$log['session_id']]['count'] ++; } } } //UserAgent::Test(); die(); if($data['requests']['get'] > 0) $data['performance']['get'] = round($data['performance']['get'] / $data['requests']['get'], 2); if($data['requests']['post'] > 0) $data['performance']['post'] = $data['performance']['post'] / $data['requests']['post']; $data['users'] = array_values($users); $data['bots'] = array_values($bots); //var_dump($data, $users, $listings); die(); $view->jsondata = $data; }
public function testAgents(){ $tests = [ [ 'ua' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36', 'browser' => 'Chrome', 'version' => '46.0', 'major_ver' => '46', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'Blink', 'platform' => 'Windows', 'platform_ver' => '7', 'platform_arch' => 'x86', 'platform_bits' => '64', ], [ 'ua' => 'Wget/1.12 (linux-gnu)', 'browser' => 'Wget', 'version' => '1.12', 'major_ver' => '1', 'minor_ver' => '12', 'ismobile' => false, 'isbot' => false, 'engine' => '', 'platform' => 'GNU/Linux', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)', 'browser' => 'MJ12 Bot', 'version' => '1.4', 'major_ver' => '1', 'minor_ver' => '4', 'ismobile' => false, 'isbot' => true, 'engine' => '', 'platform' => 'unknown', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)', 'browser' => 'BingBot', 'version' => '2.0', 'major_ver' => '2', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => true, 'engine' => '', 'platform' => 'unknown', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', 'browser' => 'Baidu Spider', 'version' => '2.0', 'major_ver' => '2', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => true, 'engine' => '', 'platform' => 'unknown', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Core Plus 4.2.0 (http://corepl.us)', 'browser' => 'Core Plus', 'version' => '4.2', 'major_ver' => '4', 'minor_ver' => '2', 'ismobile' => false, 'isbot' => false, 'engine' => '', 'platform' => 'unknown', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)', 'browser' => 'Internet Explorer', 'version' => '6.0', 'major_ver' => '6', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'Trident', 'platform' => 'Windows', 'platform_ver' => 'XP', 'platform_arch' => 'x86', 'platform_bits' => '32', ], [ 'ua' => 'Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2', 'browser' => 'Firefox', 'version' => '6.0', 'major_ver' => '6', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'Gecko', 'platform' => 'Windows', 'platform_ver' => 'XP', 'platform_arch' => 'x86', 'platform_bits' => '32', ], [ 'ua' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2202.3 Safari/537.36', 'browser' => 'Chrome', 'version' => '40.0', 'major_ver' => '40', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'Blink', 'platform' => 'GNU/Linux', 'platform_ver' => '', 'platform_arch' => 'x86', 'platform_bits' => '64', ], [ 'ua' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36', 'browser' => 'Chrome', 'version' => '27.0', 'major_ver' => '27', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'WebKit', 'platform' => 'Windows', 'platform_ver' => '7', 'platform_arch' => 'x86', 'platform_bits' => '64', ], [ 'ua' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0', 'browser' => 'Firefox', 'version' => '21.0', 'major_ver' => '21', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'Gecko', 'platform' => 'Windows', 'platform_ver' => '7', 'platform_arch' => 'x86', 'platform_bits' => '64', ], [ 'ua' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13', 'browser' => 'Safari', 'version' => '6.0', 'major_ver' => '6', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'WebKit', 'platform' => 'MacOSX', 'platform_ver' => '10.8.3', 'platform_arch' => 'x86', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0', 'browser' => 'Firefox', 'version' => '21.0', 'major_ver' => '21', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'Gecko', 'platform' => 'Ubuntu', 'platform_ver' => '', 'platform_arch' => 'x86', 'platform_bits' => '64', ], [ 'ua' => 'Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25', 'browser' => 'Mobile Safari', 'version' => '6.0', 'major_ver' => '6', 'minor_ver' => '0', 'ismobile' => true, 'isbot' => false, 'engine' => 'WebKit', 'platform' => 'iOS', 'platform_ver' => '6.1.3', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25', 'browser' => 'Mobile Safari', 'version' => '6.0', 'major_ver' => '6', 'minor_ver' => '0', 'ismobile' => true, 'isbot' => false, 'engine' => 'WebKit', 'platform' => 'iOS', 'platform_ver' => '6.1.3', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36', 'browser' => 'Chrome', 'version' => '27.0', 'major_ver' => '27', 'minor_ver' => '0', 'ismobile' => false, 'isbot' => false, 'engine' => 'WebKit', 'platform' => 'GNU/Linux', 'platform_ver' => '', 'platform_arch' => 'x86', 'platform_bits' => '64', ], [ 'ua' => 'Mozilla/5.0 (Linux; Android 4.1.1; GT-I9300 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', 'browser' => 'Android Browser', 'version' => '4.0', 'major_ver' => '4', 'minor_ver' => '0', 'ismobile' => true, 'isbot' => false, 'engine' => 'WebKit', 'platform' => 'Android', 'platform_ver' => '4.1.1', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0', 'browser' => 'Firefox', 'version' => '26.0', 'major_ver' => '26', 'minor_ver' => '0', 'ismobile' => true, 'isbot' => false, 'engine' => 'Gecko', 'platform' => 'Firefox OS', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Googlebot/2.1 ( http://www.googlebot.com/bot.html) ', 'browser' => 'Googlebot', 'version' => '2.1', 'major_ver' => '2', 'minor_ver' => '1', 'ismobile' => false, 'isbot' => true, 'engine' => '', 'platform' => 'unknown', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Lynx/2.8.7rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8r', 'browser' => 'Lynx', 'version' => '2.8', 'major_ver' => '2', 'minor_ver' => '8', 'ismobile' => false, 'isbot' => false, 'engine' => 'libwww-FM', 'platform' => 'unknown', 'platform_ver' => '', 'platform_arch' => '', 'platform_bits' => '', ], [ 'ua' => 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.1', 'browser' => 'Iceweasel', 'version' => '38.2', 'major_ver' => '38', 'minor_ver' => '2', 'ismobile' => false, 'isbot' => false, 'engine' => 'Gecko', 'platform' => 'GNU/Linux', 'platform_ver' => '', 'platform_arch' => 'x86', 'platform_bits' => '64', ], ]; foreach($tests as $test){ $ua = new \Core\UserAgent($test['ua']); $this->assertEquals($test['browser'], $ua->browser, 'Browser match failed for UA ' . $test['ua']); $this->assertEquals($test['version'], $ua->version, 'Version match failed for UA ' . $test['ua']); $this->assertEquals($test['major_ver'], $ua->major_ver, 'Version (Major String) match failed for UA ' . $test['ua']); $this->assertEquals($test['minor_ver'], $ua->minor_ver, 'Version (Minor String) match failed for UA ' . $test['ua']); $this->assertEquals($test['ismobile'], $ua->isMobile(), 'IsMobile match failed for UA ' . $test['ua']); $this->assertEquals($test['isbot'], $ua->isBot(), 'IsBot match failed for UA ' . $test['ua']); $this->assertEquals($test['engine'], $ua->rendering_engine_name, 'Engine match failed for UA ' . $test['ua']); $this->assertEquals($test['platform'], $ua->platform, 'OS match failed for UA ' . $test['ua']); $this->assertEquals($test['platform_ver'], $ua->platform_version, 'OS (Version) match failed for UA ' . $test['ua']); $this->assertEquals($test['platform_arch'], $ua->platform_architecture, 'OS (Architecture) match failed for UA ' . $test['ua']); $this->assertEquals($test['platform_bits'], $ua->platform_bits, 'OS (Bits) match failed for UA ' . $test['ua']); } }