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

Commit 648ac21

Browse files
committed
Update webstatistics.php
1 parent 0e2c228 commit 648ac21

1 file changed

Lines changed: 178 additions & 99 deletions

File tree

webstatistics.php

Lines changed: 178 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,21 @@
7272
}
7373
}
7474
$top_useragents = array();
75+
$top_browsers = array();
76+
$top_oss = array();
7577
foreach($web_analytics_db->query("SELECT `user_agent`, COUNT(*) FROM wa_browsers GROUP BY `user_agent` ORDER BY COUNT(*) DESC LIMIT 10;") as $useragent) {
7678
$top_useragents[$useragent[0]] = $useragent[1];
79+
$uaa = analyse_user_agent($useragent[0]);
80+
if(isset($top_browsers[$uaa["browser"]["name"]])) {
81+
$top_browsers[$uaa["browser"]["name"]] += $useragent[1];
82+
} else {
83+
$top_browsers[$uaa["browser"]["name"]] = $useragent[1];
84+
}
85+
if(isset($top_oss[$uaa["os"]["name"]])) {
86+
$top_oss[$uaa["os"]["name"]] += $useragent[1];
87+
} else {
88+
$top_oss[$uaa["os"]["name"]] = $useragent[1];
89+
}
7790
}
7891
$total_isps = 0;
7992
$top_isps = array();
@@ -176,15 +189,6 @@
176189
<li class="nav-item">
177190
<a class="nav-link" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home <span class="sr-only">(current)</span></a>
178191
</li>
179-
<li class="nav-item">
180-
<a class="nav-link" id="traffic-tab" data-toggle="tab" href="#traffic" role="tab" aria-controls="requests" aria-selected="false">Traffic</a>
181-
</li>
182-
<li class="nav-item">
183-
<a class="nav-link" id="visitors-tab" data-toggle="tab" href="#visitors" role="tab" aria-controls="visitors" aria-selected="false">Visitors</a>
184-
</li>
185-
<li class="nav-item">
186-
<a class="nav-link" id="origin-tab" data-toggle="tab" href="#origin" role="tab" aria-controls="origin" aria-selected="false">Origin</a>
187-
</li>
188192
</ul>
189193
<form class="form-inline my-2 my-lg-0">
190194
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
@@ -317,49 +321,46 @@
317321
<div class="col-md-6">
318322
<div class="card">
319323
<div class="card-header">
320-
User agent
324+
ISP
321325
</div>
322326
<div class="card-body">
323-
<div id="uabyv" style="width: 100%;"></div>
327+
<div id="ispbyn" style="width: 100%;"></div>
324328
</div>
325329
</div>
326330
</div>
327331
</div>
328-
</div>
329-
<div class="tab-pane fade" id="traffic" role="tabpanel" aria-labelledby="traffic-tab">
330-
<h1>Traffic</h1>
331-
<div class="row">
332-
<div class="col">
333-
<h2>URIs/Pages ordered by requests</h2>
334-
<table class="table">
335-
<thead class="thead-dark">
336-
<tr><th scope="col">URI</th><th scope="col">requests</th><th scope="col">proportion</th></tr>
337-
</thead>
338-
<?php foreach ($top_uris as $key => $value) { echo "<tr><td scope='row'>".$key."</td><td>".$value."</td><td><div class='progress'><div class='progress-bar' role='progressbar' style='width: ".(($value/$total_requests)*100)."%' aria-valuenow='".(($value/$total_requests)*100)."' aria-valuemin='0' aria-valuemax='100'>".round(($value/$total_requests)*100, 2)."%</div></div></td></tr>"; } ?>
339-
<tr><th>Total</th><th><?php echo $total_requests; ?></th></tr>
340-
</table>
341-
</div>
342-
</div>
343-
</div>
344-
<div class="tab-pane fade" id="visitors" role="tabpanel" aria-labelledby="visitors-tab">
345-
<h1>Visitors</h1>
346332
<div class="row">
347333
<div class="col-md-6">
348-
<div id="cbyv" style="width: 100%;"></div>
334+
<div class="card">
335+
<div class="card-header">
336+
Browser
337+
</div>
338+
<div class="card-body">
339+
<div id="bbyv" style="width: 100%;"></div>
340+
</div>
341+
</div>
349342
</div>
350343
<div class="col-md-6">
351-
<div id="ispbyn" style="width: 100%;"></div>
344+
<div class="card">
345+
<div class="card-header">
346+
Operating system
347+
</div>
348+
<div class="card-body">
349+
<div id="obyv" style="width: 100%;"></div>
350+
</div>
351+
</div>
352352
</div>
353353
</div>
354-
</div>
355-
<div class="tab-pane fade" id="origin" role="tabpanel" aria-labelledby="origin-tab">
356-
<h1>Origin</h1>
357354
<div class="row">
358-
<div class="col-md-6">
359-
<div id="cbyr" style="width: 100%;"></div>
360-
</div>
361-
<div class="col-md-6">
362-
<div id="ctbyr" style="width: 100%;"></div>
355+
<div class="col-md-12">
356+
<div class="card">
357+
<div class="card-header">
358+
Pages
359+
</div>
360+
<div class="card-body">
361+
<div id="pbyr" style="width: 100%;"></div>
362+
</div>
363+
</div>
363364
</div>
364365
</div>
365366
</div>
@@ -404,54 +405,14 @@ function drawobyrChart() {
404405
var chart = new google.charts.Bar(document.getElementById('obyr'));
405406
chart.draw(data, {});
406407
}
407-
function drawcbyvChart() {
408+
function drawlbyvChart() {
408409
var data = new google.visualization.DataTable();
409-
data.addColumn('string', 'Country');
410+
data.addColumn('string', 'Language');
410411
data.addColumn('number', 'Visitors');
411412
data.addRows([
412413
<?php
413414
$i = 0;
414-
foreach ($top_countriesvo as $key => $value) {
415-
if($i == 0) {
416-
echo "['".$key."', ".$value."]";
417-
$i++;
418-
} else {
419-
echo ",['".$key."', ".$value."]";
420-
}
421-
}
422-
?>
423-
]);
424-
var chart = new google.visualization.PieChart(document.getElementById('cbyv'));
425-
chart.draw(data, {'title':'Country'});
426-
}
427-
function drawcbyrChart() {
428-
var data = new google.visualization.DataTable();
429-
data.addColumn('string', 'Country');
430-
data.addColumn('number', 'Requests');
431-
data.addRows([
432-
<?php
433-
$i = 0;
434-
foreach ($top_countries as $key => $value) {
435-
if($i == 0) {
436-
echo "['".$key."', ".$value."]";
437-
$i++;
438-
} else {
439-
echo ",['".$key."', ".$value."]";
440-
}
441-
}
442-
?>
443-
]);
444-
var chart = new google.visualization.PieChart(document.getElementById('cbyr'));
445-
chart.draw(data, {'title':'Country'});
446-
}
447-
function drawctbyrChart() {
448-
var data = new google.visualization.DataTable();
449-
data.addColumn('string', 'Continent');
450-
data.addColumn('number', 'Requests');
451-
data.addRows([
452-
<?php
453-
$i = 0;
454-
foreach ($top_continents as $key => $value) {
415+
foreach ($top_languages as $key => $value) {
455416
if($i == 0) {
456417
echo "['".$key."', ".$value."]";
457418
$i++;
@@ -461,17 +422,17 @@ function drawctbyrChart() {
461422
}
462423
?>
463424
]);
464-
var chart = new google.visualization.PieChart(document.getElementById('ctbyr'));
465-
chart.draw(data, {'title':'Continent'});
425+
var chart = new google.charts.Bar(document.getElementById('lbyv'));
426+
chart.draw(data, {});
466427
}
467-
function drawlbyvChart() {
428+
function drawbbyvChart() {
468429
var data = new google.visualization.DataTable();
469-
data.addColumn('string', 'Language');
430+
data.addColumn('string', 'Browser');
470431
data.addColumn('number', 'Visitors');
471432
data.addRows([
472433
<?php
473434
$i = 0;
474-
foreach ($top_languages as $key => $value) {
435+
foreach ($top_browsers as $key => $value) {
475436
if($i == 0) {
476437
echo "['".$key."', ".$value."]";
477438
$i++;
@@ -481,17 +442,17 @@ function drawlbyvChart() {
481442
}
482443
?>
483444
]);
484-
var chart = new google.charts.Bar(document.getElementById('lbyv'));
445+
var chart = new google.charts.Bar(document.getElementById('bbyv'));
485446
chart.draw(data, {});
486447
}
487-
function drawuabyvChart() {
448+
function drawobyvChart() {
488449
var data = new google.visualization.DataTable();
489-
data.addColumn('string', 'User agent');
450+
data.addColumn('string', 'OS');
490451
data.addColumn('number', 'Visitors');
491452
data.addRows([
492453
<?php
493454
$i = 0;
494-
foreach ($top_useragents as $key => $value) {
455+
foreach ($top_oss as $key => $value) {
495456
if($i == 0) {
496457
echo "['".$key."', ".$value."]";
497458
$i++;
@@ -501,8 +462,8 @@ function drawuabyvChart() {
501462
}
502463
?>
503464
]);
504-
var chart = new google.charts.Bar(document.getElementById('uabyv'));
505-
chart.draw(data, {'title':'User agent'});
465+
var chart = new google.charts.Bar(document.getElementById('obyv'));
466+
chart.draw(data, {});
506467
}
507468
function drawispbynChart() {
508469
var data = new google.visualization.DataTable();
@@ -521,8 +482,8 @@ function drawispbynChart() {
521482
}
522483
?>
523484
]);
524-
var chart = new google.visualization.PieChart(document.getElementById('ispbyn'));
525-
chart.draw(data, {'title':'ISP'});
485+
var chart = new google.charts.Bar(document.getElementById('ispbyn'));
486+
chart.draw(data, {});
526487
}
527488
function drawrbydChart() {
528489
var data = google.visualization.arrayToDataTable([
@@ -571,17 +532,36 @@ function drawrbydtChart() {
571532
var chart = new google.charts.Bar(document.getElementById('rbydt'));
572533
chart.draw(data, {});
573534
}
535+
function drawpbyrChart() {
536+
var data = new google.visualization.DataTable();
537+
data.addColumn('string', 'Page');
538+
data.addColumn('number', 'Views');
539+
data.addRows([
540+
<?php
541+
$i = 0;
542+
foreach ($top_uris as $key => $value) {
543+
if($i == 0) {
544+
echo "['".$key."', ".$value."]";
545+
$i++;
546+
} else {
547+
echo ",['".$key."', ".$value."]";
548+
}
549+
}
550+
?>
551+
]);
552+
var chart = new google.charts.Bar(document.getElementById('pbyr'));
553+
chart.draw(data, {});
554+
}
574555
function drawCharts() {
575556
drawobyrChart();
576-
drawcbyrChart();
577-
drawctbyrChart();
578-
drawcbyvChart();
579557
drawlbyvChart();
580-
drawuabyvChart();
558+
drawbbyvChart();
559+
drawobyvChart();
581560
drawispbynChart();
582561
drawrbydChart();
583562
drawrbywdChart();
584563
drawrbydtChart();
564+
drawpbyrChart();
585565
}
586566
$(window).resize(function(){
587567
drawCharts();
@@ -598,6 +578,105 @@ function drawCharts() {
598578
</nav>
599579
</html>
600580
<?php
581+
/* UAA */
582+
583+
function analyse_user_agent($user_agent) {
584+
$result = array();
585+
$gecko = preg_match("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) Gecko\/\d+/i", $user_agent);
586+
$webkit = preg_match("/Mozilla\/\d[\d.]* \([A-Za-z0-9_.\- ;:\/]*\) AppleWebKit\/\d[\d.]* \(KHTML, like Gecko\)/i", $user_agent);
587+
if(preg_match_all("/\w+\/\d[\d.]*/", $user_agent, $matches)) {
588+
$browser = preg_split("/\//",$matches[0][array_key_last($matches[0])]);
589+
$trident = (preg_match("/trident/i", $browser[0]) && !$gecko && !$webkit);
590+
if($webkit) {
591+
if(preg_match("/safari/i", $browser[0])) {
592+
$browser = preg_split("/\//",$matches[0][2]);
593+
$i = 3;
594+
while((preg_match("/version/i", $browser[0]) || preg_match("/mobile/i", $browser[0])) && isset($matches[0][$i])) {
595+
$browser = preg_split("/\//",$matches[0][$i]);
596+
$i++;
597+
}
598+
}
599+
}
600+
}
601+
if(preg_match("/\([A-Za-z0-9_.\- ;:\/]*\)/", $user_agent, $match)) {
602+
$platforms = preg_split("/; /", preg_replace("/\)/", "", preg_replace("/\(/", "", $match[0])));
603+
if($trident) {
604+
$browser = preg_split("/ /",$platforms[1]);
605+
if(preg_match("/msie/i", $browser[0])) {
606+
$os = preg_split("/ \d/", preg_replace("/ nt/i", "",$platforms[2]));
607+
$osv = preg_split("/ /",$platforms[2]);
608+
if(preg_match("/xbox/i", $platforms[array_key_last($platforms)])) {
609+
$result["device"]["name"] = $platforms[array_key_last($platforms)];
610+
}
611+
} else {
612+
$browser[0] = "msie";
613+
$version = preg_split("/:/", $platforms[array_key_last($platforms)]);
614+
$browser[1] = $version[1];
615+
}
616+
}
617+
if(preg_match("/windows/i", $platforms[0])) {
618+
$os = preg_split("/ \d/", preg_replace("/ nt/i", "",$platforms[0]));
619+
$osv = preg_split("/ /",$platforms[0]);
620+
if(preg_match("/phone/i", $os[0])) {
621+
$result["device"]["name"] = $platforms[array_key_last($platforms)-1]." ".$platforms[array_key_last($platforms)];
622+
}
623+
if(preg_match("/xbox/i", $platforms[array_key_last($platforms)])) {
624+
$result["device"]["name"] = $platforms[array_key_last($platforms)];
625+
}
626+
if(isset($platforms[2]) && preg_match("/x\d[\d]*/", $platforms[2])) {
627+
$result["device"]["cpu"] = $platforms[2];
628+
}
629+
} else if(preg_match("/linux/i", $platforms[0])) {
630+
$i = preg_match("/u/i", $platforms[1]) ? 2 : 1;
631+
$os = preg_split("/ \d/",$platforms[$i]);
632+
if(preg_match("/android/i", $os[0])) {
633+
$osv = preg_split("/ /",$platforms[$i]);
634+
} else {
635+
$os = preg_split("/ /",$platforms[0]);
636+
if(isset($os[1])) {
637+
$result["device"]["cpu"] = $os[1];
638+
}
639+
}
640+
foreach ($platforms as $property) {
641+
if(preg_match("/build/i", $property)) {
642+
$device = preg_split("/ build/i", $property);
643+
$result["device"]["name"] = $device[0];
644+
}
645+
}
646+
} else if(preg_match("/linux/i", $platforms[1]) || preg_match("/cros/i", $platforms[1]) || preg_match("/ubuntu/i", $platforms[1])) {
647+
$os = preg_split("/ /",$platforms[1]);
648+
if(isset($os[1])) {
649+
$result["device"]["cpu"] = $os[1];
650+
}
651+
} else if(preg_match("/macintosh/i", $platforms[0])) {
652+
$os = preg_split("/ \d/",preg_replace("/intel /i", "", $platforms[1]));
653+
$osv = preg_split("/ /",$platforms[1]);
654+
$result["device"]["name"] = $platforms[0];
655+
} else if(preg_match("/iphone/i", $platforms[0]) || preg_match("/ipad/i", $platforms[0]) || preg_match("/ipod/i", $platforms[0])) {
656+
$os = preg_split("/ \d/",preg_replace("/cpu /i", "", $platforms[1]));
657+
$osv = preg_split("/ /", preg_replace("/ like mac os x/i", "", $platforms[1]));
658+
$result["device"]["name"] = $platforms[0];
659+
} else if(preg_match("/android/i", $platforms[0])) {
660+
$os = preg_split("/ \d/",$platforms[0]);
661+
$osv = preg_split("/ /",$platforms[0]);
662+
$result["device"]["name"] = $platforms[1];
663+
}
664+
if(isset($os)) {
665+
$result["os"]["name"] = $os[0];
666+
}
667+
if(isset($osv)) {
668+
$result["os"]["version"] = $osv[array_key_last($osv)];
669+
}
670+
}
671+
if(isset($browser)) {
672+
$result["browser"]["name"] = $browser[0];
673+
$result["browser"]["version"] = $browser[1];
674+
}
675+
$result["is_mobile"] = preg_match('/mobile/i', $user_agent) ? 1 : 0;
676+
$result["is_bot"] = (preg_match('/bot/i', $user_agent) || preg_match('/crawler/i', $user_agent)) ? 1 : 0;
677+
return $result;
678+
}
679+
601680
/* Classes */
602681

603682
// WebAnalytics database manager

0 commit comments

Comments
 (0)