7272 }
7373}
7474$ top_useragents = array ();
75+ $ top_browsers = array ();
76+ $ top_oss = array ();
7577foreach ($ 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 ();
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">
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