diff --git a/web/admin/crawler/crawler.php b/web/admin/crawler/crawler.php index 78cf9d2..f51b933 100755 --- a/web/admin/crawler/crawler.php +++ b/web/admin/crawler/crawler.php @@ -28,7 +28,8 @@ $opts=array( 'timeout'=>5, 'biglistfp'=>null, 'prodlistfp'=>null, - 'blacklists'=>array() + 'blacklists'=>array(), + 'whitelists'=>array() ); $help='DESCRIZIONE @@ -38,10 +39,12 @@ $help='DESCRIZIONE una che conterrà i dati di tutte le istanze di partenza e delle istanze ad esse note (comprese quelle bloccate, escluse soltanto quelle che non rispondono da un lasso di tempo impostabile), e una che conterrà solo - le istanze non bloccate, che danno possibilità di iscrizione di nuovi - utenti, il cui numero di utenti è compreso tra 11 e 30000, che - conoscono almeno altre 500 istanze, e la cui media di toot per utente - è maggiore o uguale a 10. + le istanze non bloccate, la cui piattaforma è mastodon, che danno + possibilità di iscrizione di nuovi utenti, il cui numero di utenti + è compreso tra 11 e 30000, che conoscono almeno altre 500 istanze, + che hanno avuto almeno 10 utenti attivi nell\'ultimo mese o, se questo + dato non è disponibile, la cui media di toot per utente è maggiore + o uguale a 10. SINTASSI crawler.php -i | -s -b -p [altre opzioni] OPZIONI @@ -85,8 +88,16 @@ OPZIONI formato di questi file vedi sopra il paragrafo relativo nella descrizione dell\'opzione «-s, --startinstancesfp». Questa opzione può essere utilizzata più volte per specificare più file di istanze - bloccate. Nel file di configurazione è l\'unica opzione con un formato - particolare: «blacklistfp=file1[,file2[,file3[...]]]. + bloccate. Nel file di configurazione ha un formato particolare: + «blacklistfp=file1[,file2[,file3[...]]]». + -w, --whitelistfp + Imposta un eventuale file di istanze da non scartare mai, nemmeno + se fanno parte di una delle blacklist utilizzato o non corrispondono + ai criteri di filtraggio. Il formato di questi file è semplice: + un dominio per riga (le righe vuote o che cominciano con il carattere + «#» vengono ignorate. Questa opzione può essere utilizzata più volte + per specificare più whitelist. Nel file di configurazione + ha un formato particolare: «whitelistfp=file1[,file2[,file3[...]]]». -t, --timeout Imposta il timeout delle richieste http(s) in secondi. DEFAULT: '.$opts['timeout'].' secondi. @@ -171,6 +182,8 @@ if (!is_null($inifp)) { mexit('L’opzione «excludeafter» specificata in «'.$inifp.'» non è in un formato corretto (usa «-h» per vedere la guida).'.N,1); } elseif ($key=='blacklists') { $opts['blacklists']=explode(',',$val); + } elseif ($key=='whitelists') { + $opts['whitelists']=explode(',',$val); } else { $opts[$key]=$val; } @@ -233,6 +246,13 @@ for ($i=1; $i<$argc; $i++) { $i++; $opts['blacklists'][]=$argv[$i]; break; + case '-w': + case '--whitelistfp': + if ($i+1>=$argc || $argv[$i+1]=='') + mexit('L’opzione «'.$argv[$i].'» richiede un parametro di tipo file (usa «-h» per vedere la guida).'.N,1); + $i++; + $opts['whitelists'][]=$argv[$i]; + break; case '-l': case '--loadbiglist': if ($i+1>=$argc || ($argv[$i+1]!='si' && $argv[$i+1]!='no')) @@ -292,6 +312,7 @@ if ($opts['loadbiglist']) { } $blinstances=array(); +$wlinstances=array(); function loadblacklist($bluri) { global $blinstances, $opts; @@ -314,41 +335,58 @@ function loadblacklist($bluri) { } } -if ($opts['onlinecheck']) { +$startinstances=array(); +echo('Carico il file delle istanze di partenza («'.$opts['startinstancesfp'].'») ... '); +$buf=@file_get_contents($opts['startinstancesfp']); +if ($buf!==false) { + echo('OK :-)'.N); + $buf=explode(N,$buf); + foreach ($buf as $val) { + if ($val!='' && $val[0]!='#') { + $kv=explode('|',$val); + if ($kv[1]=='') $kv[1]=null; + $startinstances[$kv[0]]=$kv[1]; + } + } +} else { + mexit(N.'Non ho potuto caricare il file delle istanze di partenza «'.$opts['startinstancesfp'].'», muoio.'.N,1); +} +if (count($startinstances)<1) + mexit('Il file delle istanze di partenza «'.$opts['startinstancesfp'].'» non contiene alcuna voce, muoio.'.N,1); - $startinstances=array(); - echo('Carico il file delle istanze di partenza («'.$opts['startinstancesfp'].'») ... '); - $buf=@file_get_contents($opts['startinstancesfp']); +foreach ($startinstances as $dom=>$bluri) { + if (!is_null($bluri)) { + echo('Recupero la lista delle istanze bloccate da «'.$dom.'» («'.$bluri.'») ... '); + loadblacklist($bluri); + } else { + echo('NON recupero la lista delle istanze bloccate da «'.$dom.'»: la uri della stessa non è definita.'.N); + } +} +foreach ($opts['blacklists'] as $bluri) { + echo('Carico la lista delle istanze bloccate dall\'URI «'.$bluri.'» ... '); + loadblacklist($bluri); +} +sort($blinstances); +echo(count($blinstances).' istanze bloccate.'.N); + +foreach ($opts['whitelists'] as $wluri) { + echo('Carico la whitelist delle istanze dall\'URI «'.$wluri.'» ... '); + $buf=@file_get_contents($wluri); if ($buf!==false) { echo('OK :-)'.N); $buf=explode(N,$buf); foreach ($buf as $val) { - if ($val!='' && $val[0]!='#') { - $kv=explode('|',$val); - if ($kv[1]=='') $kv[1]=null; - $startinstances[$kv[0]]=$kv[1]; - } + if ($val!='' && $val[0]!='#' && !in_array($val,$wlinstances)) + $wlinstances[]=$val; } } else { - mexit(N.'Non ho potuto caricare il file delle istanze di partenza «'.$opts['startinstancesfp'].'», muoio.'.N,1); + mexit(N.'Non ho potuto caricare la whitelist delle istanze «'.$wluri.'», muoio.'.N,1); } - if (count($startinstances)<1) - mexit('Il file delle istanze di partenza «'.$opts['startinstancesfp'].'» non contiene alcuna voce, muoio.'.N,1); +} +sort($wlinstances); +echo(count($wlinstances).' istanze whitelistate.'.N); - foreach ($startinstances as $dom=>$bluri) { - if (!is_null($bluri)) { - echo('Recupero la lista delle istanze bloccate da «'.$dom.'» («'.$bluri.'») ... '); - loadblacklist($bluri); - } else { - echo('NON recupero la lista delle istanze bloccate da «'.$dom.'»: la uri della stessa non è definita.'.N); - } - } - foreach ($opts['blacklists'] as $bluri) { - echo('Carico le istanze bloccate dall\'URI «'.$bluri.'» ... '); - loadblacklist($bluri); - } - sort($blinstances); - echo(count($blinstances).' istanze bloccate.'.N); +if ($opts['onlinecheck']) { $context=stream_context_create(array('http'=>array('timeout'=>$opts['timeout']))); @@ -391,39 +429,64 @@ foreach ($biglist as $dom=>$oinfo) { echo('~~~~~~'.N); if ($opts['onlinecheck']) { - echo('Recupero le informazioni Nodeinfo su «'.$dom.'» ('.$i.'/'.$biglistc.' - '.round(100/$biglistc*$i).'%) ... '); + echo('Recupero le informazioni su «'.$dom.'» ('.$i.'/'.$biglistc.' - '.round(100/$biglistc*$i).'%)'.N); + + echo('Recupero le informazioni Nodeinfo ... '); + $ninfo=null; $buf=@file_get_contents('https://'.$dom.'/nodeinfo/2.0',false,$context); if ($buf!==false) { echo('OK :-)'.N); $ninfo=json_decode($buf,true); - if (!is_null($ninfo) && array_key_exists('software',$ninfo) && array_key_exists('name',$ninfo['software'])) { - echo('Il software è '.$ninfo['software']['name'].'!'.N); - } else { - echo('Impossibile determinare il software!'.N); - } } else { echo('ERRORE :-('.N); } - echo('Recupero le informazioni API su «'.$dom.'» ('.$i.'/'.$biglistc.' - '.round(100/$biglistc*$i).'%) ... '); + echo('Recupero le informazioni API sull\'attività dell\'istanza ... '); + $activity=null; + $buf=@file_get_contents('https://'.$dom.'/api/v1/instance/activity',false,$context); + if ($buf!==false) { + echo('OK :-)'.N); + $activity=json_decode($buf,true); + } else { + echo('ERRORE :-('.N); + } + + echo('Recupero le informazioni API sull\'istanza ... '); + $info=null; $buf=@file_get_contents('https://'.$dom.'/api/v1/instance',false,$context); if ($buf!==false) { echo('OK :-)'.N); $info=json_decode($buf,true); - if (!is_null($oinfo) && array_key_exists('cr-checks',$oinfo)) - $info['cr-checks']=$oinfo['cr-checks']; - $info['cr-checks'][]=array('time'=>time(),'ok'=>true); + if (!is_null($oinfo) && array_key_exists('X-Checks',$oinfo)) + $info['X-Checks']=$oinfo['X-Checks']; + $info['X-Checks'][]=array('time'=>time(),'ok'=>true); + if (!is_null($ninfo)) { + if (array_key_exists('usage',$ninfo) && array_key_exists('users',$ninfo['usage'])) { + if (array_key_exists('activeMonth',$ninfo['usage']['users'])) + $info['X-ActiveUsersPerMonth']=$ninfo['usage']['users']['activeMonth']; + if (array_key_exists('activeHalfyear',$ninfo['usage']['users'])) + $info['X-ActiveUsersPerHalfYear']=$ninfo['usage']['users']['activeHalfyear']; + } + if (array_key_exists('software',$ninfo)) { + if (array_key_exists('name',$ninfo['software'])) + $info['X-Software']=$ninfo['software']['name']; + if (array_key_exists('version',$ninfo['software'])) + $info['X-Version']=$ninfo['software']['version']; + } + } + if (!is_null($activity)) + $info['X-Activity']=$activity; $newbiglist[$dom]=$info; } else { echo('ERRORE :-( ... '); $lastokk=null; - if (!is_null($oinfo) && array_key_exists('cr-checks',$oinfo)) { - foreach ($oinfo['cr-checks'] as $key=>$val) + if (!is_null($oinfo) && array_key_exists('X-Checks',$oinfo)) { + foreach ($oinfo['X-Checks'] as $key=>$val) if ($val['ok']) $lastokk=$key; } - if (is_null($oinfo) || is_null($lastokk) || time()-$oinfo['cr-checks'][$lastokk]['time']<=$opts['excludeafter']) { + if (is_null($oinfo) || is_null($lastokk) || time()-$oinfo['X-Checks'][$lastokk]['time']<=$opts['excludeafter']) { echo('ma riproveremo...'.N); - $oinfo['cr-checks'][]=array('time'=>time(),'ok'=>false); + $oinfo['X-Checks'][]=array('time'=>time(),'ok'=>false); $newbiglist[$dom]=$oinfo; } else { echo('e non riproveremo...'.N); @@ -435,64 +498,81 @@ foreach ($biglist as $dom=>$oinfo) { $info=$oinfo; } $whynot=array(); - if (in_array($dom,$blinstances)) - $whynot[]='Istanza blacklistata'; if (array_key_exists('uri',$info)) { - if (!array_key_exists('registrations',$info)) - $whynot[]='Stato delle registrazioni non disponibile'; - elseif ($info['registrations']==false) - $whynot[]='Registrazioni chiuse'; - if (!array_key_exists('stats',$info)) - $whynot[]='Stats non disponibili'; - elseif (!array_key_exists('user_count',$info['stats'])) - $whynot[]='Numero utenti non disponibile'; - elseif ($info['stats']['user_count']<10 || $info['stats']['user_count']>30000) - $whynot[]='Numero utenti ('.$info['stats']['user_count'].') non compreso tra 10 e 30000'; - elseif (!array_key_exists('domain_count',$info['stats'])) - $whynot[]='Numero istanze conosciute non disponibile'; - elseif ($info['stats']['domain_count']<500) - $whynot[]='Numero istanze conosciute minore di 500'; - elseif (!array_key_exists('status_count',$info['stats'])) - $whynot[]='Numero di toots non disponibile'; - elseif ($info['stats']['status_count']/$info['stats']['user_count']<10) - $whynot[]='Media dei toots per utente minore di 10'; - if (!array_key_exists('contact_account',$info) || is_null($info['contact_account'])) - $whynot[]='Informazioni sull\'account admin principale non disponibili'; - elseif (!array_key_exists('created_at',$info['contact_account'])) - $whynot[]='Data di creazione dell\'account admin principale non disponibile'; - elseif (time()-strtotime($info['contact_account']['created_at'])<6*31*24*60*60) - $whynot[]='L\'account admin principale risulta esser stato creato meno di 6 mesi fa'; + if (!in_array($dom,$wlinstances)) { + if (in_array($dom,$blinstances)) + $whynot[]='Istanza blacklistata'; + if (array_key_exists('X-Software',$info) && !in_array($info['X-Software'],array('mastodon','corgidon'))) + $whynot[]='Il software non è Mastodon (ma '.$info['X-Software'].')'; + if (!array_key_exists('registrations',$info)) + $whynot[]='Stato delle registrazioni non disponibile'; + elseif ($info['registrations']==false) + $whynot[]='Registrazioni chiuse'; + if (!array_key_exists('stats',$info)) { + $whynot[]='Stats non disponibili'; + } else { + if (!array_key_exists('user_count',$info['stats'])) + $whynot[]='Numero utenti non disponibile'; + elseif ($info['stats']['user_count']<10 || $info['stats']['user_count']>30000) + $whynot[]='Numero utenti ('.$info['stats']['user_count'].') non compreso tra 10 e 30000'; + if (!array_key_exists('domain_count',$info['stats'])) + $whynot[]='Numero istanze conosciute non disponibile'; + elseif ($info['stats']['domain_count']<500) + $whynot[]='Numero istanze conosciute minore di 500'; + /* if (!array_key_exists('status_count',$info['stats'])) + $whynot[]='Numero di toots non disponibile'; + elseif ($info['stats']['status_count']/$info['stats']['user_count']<10) + $whynot[]='Media dei toots per utente minore di 10';*/ + } + if (array_key_exists('X-ActiveUsersPerMonth',$info)) { + if ($info['X-ActiveUsersPerMonth']<10) + $whynot[]='Numero utenti attivi nell\'ultimo mese minore di 10'; + } elseif (array_key_exists('stats',$info) && array_key_exists('status_count',$info['stats']) && array_key_exists('user_count',$info['stats']) && $info['stats']['user_count']>0 && $info['stats']['status_count']/$info['stats']['user_count']<10) { + $whynot[]='Media dei toots per utente minore di 10'; + } + if (!array_key_exists('contact_account',$info) || is_null($info['contact_account'])) { + $whynot[]='Informazioni sull\'account admin principale non disponibili'; + }/* else { + if (!array_key_exists('created_at',$info['contact_account'])) + $whynot[]='Data di creazione dell\'account admin principale non disponibile'; + elseif (time()-strtotime($info['contact_account']['created_at'])<6*31*24*60*60) + $whynot[]='L\'account admin principale risulta esser stato creato meno di 6 mesi fa'; + }*/ + } else { + echo('«'.$dom.'» è whitelistata, la teniamo a prescindere.'.N); + } } elseif (!array_key_exists($dom,$prodlist)) { $whynot[]='Info non disponibili, e l\'istanza non era già presente nella lista delle istanze occhei'; } if (count($whynot)==0) { if (array_key_exists($dom,$prodlist)) { if (array_key_exists('short_description',$info) && (!array_key_exists('short_description',$prodlist[$dom]) || $prodlist[$dom]['short_description']!=$info['short_description'])) { - $info['short_description_changed']=true; - $info['prev_short_description']=$prodlist[$dom]['short_description']; + $info['X-ShortDescriptionChanged']=true; + $info['X-PrevShortDescription']=$prodlist[$dom]['short_description']; } else { - $info['short_description_changed']=false; + $info['X-ShortDescriptionChanged']=false; } if (array_key_exists('description',$info) && (!array_key_exists('description',$prodlist[$dom]) || $prodlist[$dom]['description']!=$info['description'])) { - $info['description_changed']=true; - $info['prev_description']=$prodlist[$dom]['description']; + $info['X-DescriptionChanged']=true; + $info['X-PrevDescription']=$prodlist[$dom]['description']; } else { - $info['description_changed']=false; + $info['X-DescriptionChanged']=false; } echo('«'.$dom.'» era nella lista delle istanze occhei ed è stata AGGIORNATA! :-)'.N); - if (array_key_exists('show',$prodlist[$dom])) - $info['show']=$prodlist[$dom]['show']; + if (array_key_exists('X-Show',$prodlist[$dom])) + $info['X-Show']=$prodlist[$dom]['X-Show']; else - $info['show']=-1; + $info['X-Show']=-1; } else { - $info['short_description_changed']=false; - $info['description_changed']=false; - $info['show']=-1; + $info['X-ShortDescriptionChanged']=false; + $info['X-DescriptionChanged']=false; + $info['X-Show']=-1; echo('«'.$dom.'» non era nella lista delle istanze occhei ed è stata AGGIUNTA! :-)'.N); } $prodlist[$dom]=$info; } else { if (array_key_exists($dom,$prodlist)) { + unset($prodlist[$dom]); echo('«'.$dom.'» era nella lista delle istanze occhei ma è stata SCARTATA! :-('.N); } else { echo('«'.$dom.'» non era nella lista delle istanze occhei e NON CI È ENTRATA! :-('.N); @@ -501,13 +581,15 @@ foreach ($biglist as $dom=>$oinfo) { } } +echo('~~~~~~'.N); + if ($opts['onlinecheck']) { $json=json_encode($newbiglist,JSON_PRETTY_PRINT); file_put_contents($opts['biglistfp'],$json); $newbiglistc=count($newbiglist); $diff=$newbiglistc-$ibiglistc; if ($diff>=0) $diff='+'.$diff; - echo('Totale istanze nella listona: '.$newbiglistc.' ('.$diff.' rispetto all’ultima volta)'.N); + echo('Totale istanze nella listona: '.$newbiglistc.' ('.$diff.' rispetto all\'ultima volta)'.N); } else { echo('Totale istanze nella listona: '.count($biglist).N); } @@ -515,6 +597,6 @@ $json=json_encode($prodlist,JSON_PRETTY_PRINT); file_put_contents($opts['prodlistfp'],$json); $diff=count($prodlist)-$iprodlistc; if ($diff>=0) $diff='+'.$diff; -echo('Totale istanze nella listina di quelle occhei: '.count($prodlist).' ('.$diff.' rispetto all’ultima volta)'.N); +echo('Totale istanze nella listina di quelle occhei: '.count($prodlist).' ('.$diff.' rispetto all\'ultima volta)'.N); ?> diff --git a/web/admin/crawler/crawler_pant.ini b/web/admin/crawler/crawler_pant.ini index cdf9bea..190070f 100644 --- a/web/admin/crawler/crawler_pant.ini +++ b/web/admin/crawler/crawler_pant.ini @@ -6,3 +6,4 @@ timeout=5 biglistfp=biglist_pant.json prodlistfp=prodlist_pant.json blacklists=blacklist_cagi.txt +whitelists=whitelist_sorellanza.txt diff --git a/web/admin/crawler/crawler_sorellanza.ini b/web/admin/crawler/crawler_sorellanza.ini index 6760660..822be72 100644 --- a/web/admin/crawler/crawler_sorellanza.ini +++ b/web/admin/crawler/crawler_sorellanza.ini @@ -6,3 +6,4 @@ timeout=5 biglistfp=biglist.json prodlistfp=prodlist.json blacklists=blacklist_cagi.txt +whitelists=whitelist_sorellanza.txt