Changeset 1250

Show
Ignore:
Timestamp:
08/09/08 17:25:23 (4 months ago)
Author:
_ck_
Message:

0.0.9 not so "mini" anymore, bug fixes for last online, IP tracked/displayed + IP lookup, bots recorded/displayed by agent

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • mini-track/trunk/mini-track.php

    r1247 r1250  
    66Author: _ck_ 
    77Author URI: http://bbShowcase.org 
    8 Version: 0.0.8 
     8Version: 0.0.9 
    99 
    1010License: CC-GNU-GPL http://creativecommons.org/licenses/GPL/2.0/ 
     
    3535        .mini_track strong, mini_track a {color: #006400;} 
    3636        .mini_track_online {font-size:90%; color:green;}  
    37         .mini_track_offline {font-size:90%; color:#bbb;} 
     37        .mini_track_offline {font-size:90%; color:#aaa;} 
     38        .mini_track_title {border-bottom: 1px dashed #ccc; cursor: help;} 
    3839"; 
    3940 
    40 $mini_track_options['bots']="worm|bot|spider|crawler|Googlebot|mediapartners|MSNBOT|YahooSeeker|Overture|VerticalCrawler|FastSearch|modspider|froogle|" 
    41 ."Bloglines|ZyBorg|InfoSeek|inktomi|looksmart|Scooter|Slurp|AskJeeves\/Teoma|teoma_agent|teomaagent|MARTINI|Gigabot|Netcraft|SurveyBot|ia_archiver|" 
    42 ."lycos|scooter|fast\-webcrawler|slurp\@inktomi|turnitinbot|technorati|Findexa|NextLinks|findlinks|Gais|gaisbo|zyborg|surveybot|" 
    43 ."bloglines|BlogSearch|PubSub|pubsub|Syndic8|userland|gigabot|become\.com"; 
     41$mini_track_options['bots']="Googlebot|mediapartners|MSNBOT|YahooSeeker|Overture|VerticalCrawler|FastSearch|modspider|froogle|" 
     42."Bloglines|ZyBorg|InfoSeek|looksmart|Scooter|AskJeeves|Teoma|teoma_agent|teomaagent|MARTINI|Gigabot|Netcraft|SurveyBot|ia_archiver|" 
     43."lycos|scooter|fast\-webcrawler|inktomi|slurp\@inktomi|Slurp|turnitinbot|technorati|Findexa|NextLinks|findlinks|Gais|gaisbo|zyborg|surveybot|" 
     44."Feedfetcher|bloglines|BlogSearch|PubSub|pubsub|Syndic8|userland|gigabot|become\.com|Yeti|naver|Sogou|worm|spider|crawler|bot"; 
    4445 
    4546/* STOP EDITING HERE */ 
    4647 
     48$mini_track_options['bots']=explode("|",str_replace("\\","", strtolower($mini_track_options['bots']) )); 
     49 
     50$mini_track_options['debug'] = false;  
     51 
    4752$bb->load_options = true;       // better db performance, but probably won't work here, put it into your bb-config.php 
    4853 
     54// hooks and triggers 
    4955add_action('bb_foot','mini_track'); 
     56add_action('bb_init','mini_track_init'); 
    5057add_action('bb_admin_footer', 'mini_track',999); 
     58add_action('bb_user_login', 'mini_track_login'); 
     59add_action('bb_user_logout', 'mini_track_logout'); 
    5160bb_register_activation_hook( __FILE__,  'mini_track_activation'); 
    5261if ($mini_track_options['style']) {add_action('bb_head','mini_track_style');} 
    53 if ($mini_track_options['last_online_in_profile']) {add_filter( 'get_profile_info_keys','mini_track_profile_key');} 
     62if ($mini_track_options['last_online_in_profile']) {add_filter( 'get_profile_info_keys','mini_track_profile_key',100);} 
    5463if ($mini_track_options['online_status_in_post']) {add_filter( 'post_author_title', 'mini_track_online_filter',100);} 
    55 if (isset($_GET['mini_track_display']) || isset($_GET['mini_track_reset'])) {add_action('bb_init','mini_track_display');} 
    56  
    57 function mini_track($display=0) {   
    58 global $mini_track_options, $mini_track_done, $mini_track, $bb_current_user;  
    59  
    60 if (isset($mini_track_done)) {return;} $mini_track_done=true; // only run once if manually called 
     64if (isset($_GET['mini_track_display']) || isset($_GET['mini_track_reset'])) {add_action('bb_init','mini_track_display',100);} 
     65if (isset($_GET['mini_track_ip'])) {add_action('bb_init','mini_track_ip',100);} 
     66 
     67function mini_track_init() {   
     68global $mini_track, $mini_track_options,  $mini_track_current, $bb_current_user, $bbdb; 
     69$users=0; $members=0; $bots=0; $onpage=0; $names=""; $index=""; $debug=""; 
     70$mini_track=bb_get_option('mini_track'); 
     71list($index,$debug)=mini_track_index($bb_current_user->ID); 
     72 
     73// store first seen date when they arrive 
     74if (!is_array($mini_track) || !array_key_exists($index,$mini_track)) {$mini_track[$index]->seen=time(); if ($bb_current_user->ID) {@bb_update_usermeta($bb_current_user->ID,'mini_track',date('r'));}}  
     75 
     76$mini_track[$index]->time=time();  
     77$mini_track[$index]->ip=$_SERVER['REMOTE_ADDR']; 
     78$mini_track[$index]->url=$_SERVER['REQUEST_URI'];       // this also has some issues with dynamic url cruft but is acceptable 
     79$mini_track[$index]->id=$bb_current_user->ID; 
     80if ($bb_current_user->ID) {$mini_track[$index]->name=$bb_current_user->data->user_login;} 
     81else { 
     82// if (eregi($mini_track_options['bots'],$_SERVER['HTTP_USER_AGENT'])) {$mini_track[$index]->bot=1;} 
     83$agent=strtolower($_SERVER['HTTP_USER_AGENT']); 
     84foreach ($mini_track_options['bots'] as $key=>$name) {if (!(strpos($agent,$name)===false)) {$mini_track[$index]->bot=$key+1; break;}} 
     85}       // detect/save bots 
     86++$mini_track[$index]->pages;   // count how many pages they've viewed 
     87 
     88$bb_uri=bb_get_option('uri'); $profile=$bb_uri."profile.php?id="; 
     89$cutoff=time()-$mini_track_options['track_time']*60;    // seconds to consider user "online"  
     90 
     91if ($mini_track_options['debug']) {$mini_track[$index]->debug=$debug;}  // debug 
     92 
     93foreach ($mini_track as $key=>$value) {  
     94if ($value->time<$cutoff) { 
     95// store last seen date when they leave 
     96if ($value->id) {mini_track_logout($value->id);}  
     97unset($mini_track[$key]); 
     98} else  {$users++;  
     99        if ($value->id) {$members++; $names.="<a href='$profile$value->id'>$value->name</a>, ";}  
     100        if (isset($value->bot)) {$bots++;}  
     101        if ($value->url==$mini_track[$index]->url) {$onpage++;} 
     102           } 
     103
     104// @bb_update_option('mini_track',$mini_track); // argh stupid bbPress read before write wastes queries 
     105// $bbdb->get_var("UPDATE bb_topicmeta SET `meta_value` = '' WHERE topic_id = '0' AND meta_key = 'mini_track' LIMIT 1"); 
     106$bbdb->update( $bbdb->topicmeta, array( 'meta_value' => bb_maybe_serialize( $mini_track )), array( 'topic_id' => 0, 'meta_key' => 'mini_track' ) ); 
     107 
     108// this serialized string will get nasty for more than a few dozen people online 
     109$mini_track_current['users']=$users; 
     110$mini_track_current['members']=$members; 
     111$mini_track_current['bots']=$bots; 
     112$mini_track_current['names']=rtrim($names,", "); 
     113$mini_track_current['onpage']=$onpage; 
     114}       // mini_track_init 
     115 
     116 
     117function mini_track($display=0) { 
     118global $mini_track, $mini_track_options, $mini_track_current, $mini_track_done;  
     119if (isset($mini_track_done)) {return;} $mini_track_done=true;   // only run once if manually called 
    61120if (empty($display)) { 
    62121        if ($mini_track_options['automatic_in_footer']) {$display=1;} 
     
    64123        if ($display && $mini_track_options['show_only_on_front_page'] && !is_front()) {$display=0;} 
    65124} 
    66 $mini_track=bb_get_option('mini_track'); 
    67 $users=0; $members=0; $bots=0; $onpage=0; $names=""; $index=""; 
    68  
    69 if ($mini_track_options['fast_index']) { 
    70 $index=ip2long($_SERVER["REMOTE_ADDR"]);        // this has some limitations and bugs - disable if you use the next two lines  
    71 } else { 
    72 // more advanced indexing technique on the next two lines - disable for speed at expense of no NAT/proxy detection 
    73 $indexlist=array('REMOTE_ADDR','HTTP_USER_AGENT','HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR','HTTP_FORWARDED','HTTP_VIA', 'HTTP_X_COMING_FROM', 'HTTP_COMING_FROM');  
    74 foreach ($indexlist as $check) {if (isset($_SERVER[$check])) {$index.=$_SERVER[$check];}} $index=md5($index); 
    75 } 
    76  
    77 // store first seen date when they arrive 
    78 if ($bb_current_user->ID && is_array($mini_track) && !array_key_exists($index,$mini_track)) {@bb_update_usermeta($bb_current_user->ID,'mini_track',date('r'));}  
    79  
    80 $mini_track[$index]->time=time();  
    81 $mini_track[$index]->url=addslashes(urlencode($_SERVER["REQUEST_URI"]));        // this also has some issues with dynamic url cruft but is acceptable 
    82 $mini_track[$index]->id=$bb_current_user->ID; 
    83 if ($bb_current_user->ID) {$mini_track[$index]->name=$bb_current_user->data->user_login;} 
    84 elseif (eregi($mini_track_options['bots'],$_SERVER['HTTP_USER_AGENT'])) {$mini_track[$index]->bot=1;}   // detect/save bots 
    85 ++$mini_track[$index]->pages;   // count how many pages they've viewed 
    86  
    87 $bb_uri=bb_get_option('uri'); $profile=$bb_uri."profile.php?id="; 
    88 $cutoff=time()-$mini_track_options['track_time']*60;    // seconds to consider user "online"  
    89  
    90 foreach ($mini_track as $key=>$value) {  
    91 if ($value->time<$cutoff) { 
    92 // store last seen date when they leave 
    93 if ($mini_track[$key]->id) {@bb_update_usermeta($mini_track[$key]->id,'mini_track',date('r',$mini_track[$key]->time));}  
    94 unset($mini_track[$key]);} 
    95 else  {$users++;  
    96         if ($value->id) {$members++; $names.="<a href='$profile$value->id'>$value->name</a>, ";}  
    97         if (isset($value->bot)) {$bots++;}  
    98         if ($value->url==$mini_track[$index]->url) {$onpage++;} 
    99            } 
    100 } 
    101  
    102125if ($display) { // to do: internationalize i18n 
    103126if (bb_current_user_can('administrate')) {$start="<a href='?mini_track_display'>"; $end="</a>";} else {$start=""; $end="";} 
    104 echo "<div class='mini_track'>There are <strong>$users</strong> total $start"."users online".$end."."; 
    105 echo " <strong>$members</strong> of them are members"; 
    106 if ($members && ($display==2 || $display=="members")) {echo ": ".rtrim($names,", ").".";} else {echo ".";} 
    107 if ($onpage>1 && !$mini_track_options['show_only_on_front_page']) {echo " <strong>$onpage</strong> of them are on this page.</div>";} 
    108 
    109  
    110 @bb_update_option('mini_track',$mini_track);    // this serialized string will get nasty for more than a few dozen people online 
     127echo "<div class='mini_track'>There are <strong>".$mini_track_current['users']."</strong> total $start"."users online".$end."."; 
     128if ($mini_track_current['onpage']>1 && !$mini_track_options['show_only_on_front_page']) {echo " <strong>".$mini_track_current['onpage']."</strong> of them are on this page.";} 
     129if ($mini_track_current['members']>0) {echo " <strong>".$mini_track_current['members']."</strong> of them are members";} 
     130if ($mini_track_current['members']>0 && ($display==2 || $display=="members")) {echo ": ".$mini_track_current['names'];}  
     131elseif ($mini_track_current['members']>0 && $display==1) {echo ".";
     132echo "</div>"; 
     133
    111134} 
    112135 
    113136function mini_track_display() { 
    114137if (!bb_current_user_can('administrate')) {return;} 
    115 global $mini_track_options; 
     138global $mini_track, $mini_track_current, $mini_track_options; 
    116139$bb_uri=bb_get_option('uri'); $profile=$bb_uri."profile.php?id="; 
    117 if (isset($_GET['mini_track_reset'])) {@bb_update_option('mini_track','');} 
    118 $mini_track=bb_get_option('mini_track'); 
     140if (isset($_GET['mini_track_reset'])) {mini_track_activation(); mini_track_init();} 
    119141echo '<html><head><title>'.count($mini_track).' Users Online &laquo; '.bb_get_option('name').'</title> 
    120142<meta http-equiv="refresh" content="'.$mini_track_options['display_refresh_time'].';url='.$bb_uri.'?mini_track_display" /> 
    121143<style>table {border:1px solid #111;} table td {text-align:center;} table .link {text-align:left;} table th.link {padding-left:5em;} 
    122 table th {background: #aaa;} .alt {background: #eee;} .time {font-size:85%;} .bot {color:red;} .guest {color:green;} </style></head><body>'; 
     144table th {background: #aaa;} .alt {background: #eee;} .tiny {font-size:85%;} .bot {color:red; font-size:90%;} .guest {color:green;}  
     145.link div {padding-left: 5px; width:500px; white-space:nowrap; overflow; hidden;} </style></head><body>'; 
    123146echo "<div style='float:right;'>[<a href='$bb_url?mini_track_reset'><small>reset</small></a>]</div>"; 
    124 mini_track(1);  
     147mini_track(2);  
    125148echo "<br clear=both /><br /><table width='99%' cellpadding=1 cellspacing=1> 
    126 <tr class=alt><th>#</th><th>user</th><th>pages</th><th>last activity</th><th class=link>last URL</th></tr>"; 
     149<tr class=alt><th>#</th><th>user</th><th>ip</th><th>pages</th><th>time online</th><th>last activity</th><th class=link>last URL</th></tr>"; 
    127150$mini_track=array_reverse($mini_track,true); 
    128151$counter=0; 
     
    130153$url=urldecode($value->url); 
    131154echo "<tr".(($counter % 2) ? " class=alt" : "")."><td align=right>".(++$counter)."</td><td>"; 
    132 if ($value->id) echo "<a href='$profile$value->id'>$value->name</a>"; 
    133 elseif (isset($value->bot)) {echo "<span class=bot>bot</span>";} else {echo "<span class=guest>guest</span>";} 
    134 echo "</td><td>".intval($value->pages)."</td><td class=time>".ceil(((time())-$value->time+1)/60)." minutes ago</td><td class=link><a href='$url'>$url</a></td></tr>"; 
     155if ($value->id) echo "<a target='_blank' href='$profile$value->id'>$value->name</a>"; 
     156elseif (isset($value->bot)) {echo "<span class=bot>".$mini_track_options['bots'][$value->bot-1]."</span>";} else {echo "<span class=guest>guest</span>";} 
     157echo "</td><td class=tiny><a target='_blank' ".(($mini_track_options['debug']) ?" title='$value->debug' " : "")."href='?mini_track_ip=$value->ip'>$value->ip</a></td><td>".intval($value->pages)."</td><td class=tiny>".ceil((($value->time)-$value->seen+1)/60)." minutes</td><td class=tiny>".ceil(((time())-$value->time+1)/60)." minutes ago</td><td class=link><div style='overflow:hidden;'><a href='$url'>$url</a></div></td></tr>"; 
    135158} 
    136159echo "</table></body></html>"; 
    137160exit(); 
     161} 
     162 
     163function mini_track_index($id=0) { 
     164global $mini_track_options; 
     165$id=intval($id); 
     166if ($mini_track_options['fast_index']) { 
     167$index=ip2long($_SERVER['REMOTE_ADDR']);        // this has some limitations 
     168} else { 
     169// more advanced indexing technique on the next two lines - disable for speed at expense of no NAT/proxy detection 
     170$indexlist=array('REMOTE_ADDR','HTTP_USER_AGENT','HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED_FOR','HTTP_FORWARDED','HTTP_VIA', 'HTTP_X_COMING_FROM', 'HTTP_COMING_FROM');  
     171$meta=$id; foreach ($indexlist as $check) {if (isset($_SERVER[$check])) {$meta.=" ".$_SERVER[$check];}} $index=md5($meta); 
     172} 
     173// $array['index']=$index; $array['debug']=$meta; return $array; 
     174return array($index,$meta); 
    138175} 
    139176 
     
    157194global $self, $user, $bb_user_cache;  // nasty trick 
    158195if (empty($self)==true && isset($_GET['tab'])==false && bb_get_location()=="profile-page") { 
    159         $bb_user_cache[$user->ID]->last_online="<span title='".$bb_user_cache[$user->ID]->mini_track."'>".bb_since($bb_user_cache[$user->ID]->mini_track,1).__(' ago ')."</span>"; 
     196        if ($mini_track=$bb_user_cache[$user->ID]->mini_track) { 
     197        $bb_user_cache[$user->ID]->last_online="<span class='mini_track_title' title='".$mini_track."'>".bb_since($mini_track,1)." ".__('ago')."</span>"; 
    160198        if (mini_track_online()) {$bb_user_cache[$user->ID]->last_online.=" (<span class='mini_track_online'>".__("online")."</span>)";}  
    161199        else {$bb_user_cache[$user->ID]->last_online.=" (<span class='mini_track_offline'>".__("offline")."</span>)";}  
     200        } else {$bb_user_cache[$user->ID]->last_online=" <span class='mini_track_offline'>".__("unknown")."</span> ";} 
    162201        (array) $keys=array_merge(array_slice((array) $keys, 0 , 1), array('last_online' => array(0, __('Last Online'))), array_slice((array) $keys,  1));     
    163202} 
     
    167206function mini_track_style() {global $mini_track_options; echo "<style type='text/css'>".$mini_track_options['style']."</style>"; } 
    168207 
    169 function mini_track_activation() {bb_update_option('mini_track',array());} 
     208function mini_track_activation() {global $mini_track,$mini_track_done; unset($mini_track_done);  $mini_track=array(); @bb_update_option('mini_track',$mini_track);} 
     209 
     210function mini_track_logout($id=0) { 
     211global $mini_track, $bb_current_user; 
     212$mini_track=bb_get_option('mini_track'); 
     213if (!$id) {$id=$bb_current_user->ID;} 
     214if ($id) { 
     215        foreach ($mini_track as $key=>$value) { 
     216                if ($value->id==$id) {@bb_update_usermeta($value->id,'mini_track',date('r',$value->time)); unset($mini_track[$key]); @bb_update_option('mini_track',$mini_track); break;} 
     217        } 
     218
     219
     220function mini_track_login($id=0) { 
     221global $mini_track; 
     222$mini_track=bb_get_option('mini_track'); 
     223list($index,$debug)=mini_track_index(0); unset($mini_track[$index]);    // remove  the entity with same info but 0 user id 
     224@bb_update_option('mini_track',$mini_track); 
     225
     226 
     227function mini_track_ip(){ 
     228if (!bb_current_user_can('administrate') || !$_GET['mini_track_ip']) {return;} 
     229$ip=$_GET['mini_track_ip']; $rdns=gethostbyaddr($ip); if ($rdns==$ip) {$rdns="(no rDNS)";} 
     230echo "<html><pre><h2>IP ".$ip."</h2><h3>".$rdns."</h3>";  
     231$data=mini_track_ip_lookup($ip);  
     232foreach ($data as $key=>$value) { 
     233if (eregi("abuse|tech|nettype|comment|remark|ReferralServer|signature|auth|encryption",$key)===false) {echo "$key: $value <br />";} 
     234
     235exit(); 
     236
     237 
     238function mini_track_ip_lookup($ip,$server=0){ 
     239$host=array('ws.arin.net','wq.apnic.net','www.db.ripe.net','lacnic.net','www.afrinic.net'); 
     240$keyword=array('arin.net','apnic.net','ripe.net','lacnic.net','afrinic.net'); 
     241$path=array('/whois/?queryinput=','/apnic-bin/whois.pl?searchtext=','/whois/?form_type=simple&searchtext=','/cgi-bin/lacnic/whois?query=','/cgi-bin/whois?form_type=simple&searchtext='); 
     242do {unset($data);  
     243if ($fp = fsockopen ($host[$server], 80, &$errno, &$errstr, 10)) { 
     244        $request = "GET $path[$server]$ip HTTP/1.0\r\nHost: $host[$server]\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n\r\n";  
     245        $page=''; fputs ($fp, $request); while (!feof($fp)) {$page.=fgets ($fp,1024);} fclose ($fp);    // echo $page; 
     246        preg_match("/\<pre\>(.*)\<\/pre\>/sim",$page,$temp); $lines=explode("\n",strip_tags($temp[0])); 
     247        foreach ($lines as $line) {$line=trim($line);if ((!ereg('^\#|\%.*$',$line)) && ($line>'')) {$temp=explode(":",$line,2); $data[trim($temp[0])] = trim($temp[1]);}} 
     248} else {$data['error'] = "$errstr ($errno)\n";}          
     249$server=0; for ($i = 1; $i <= count($host); $i++){if (strpos($data['ReferralServer'],$keyword[$i])){$server=$i;break;}} 
     250} while ($server>0); 
     251return $data; 
     252
    170253?> 
  • mini-track/trunk/readme.txt

    r1242 r1250  
    4343* If you upgrade from an old version you need to use the RESET link in the mini-track display panel. 
    4444 
     45* If you see repeats of the same IP's in the real-time display, that means the user is going through a proxy. Some bots like yahoo's slurp will connect to your site many times in a row from the same external IP, but a different computer in their network: Mini-Track can detect and follow this. 
     46 
    4547= Does this slow down my website? = 
    4648 
     
    8486* bunch of new features including online status in posts, last online time in profile, bot tracking 
    8587 
     88= Version 0.0.9 (2008-08-09) = 
     89 
     90* bug fixes for last online, IP tracked/displayed + IP lookup, bots recorded/displayed by agent 
     91 
    8692== To Do == 
    8793 
     94* store time online per member in profile ++(first seen - last seen) 
     95 
    8896* internationalization  
     97 
     98* geoip 
     99 
     100* convert to real db table instead of meta