1
0
Fork 0

Implementate le whitelist

This commit is contained in:
pezcurrel 2019-12-17 13:19:12 +01:00
parent 353ad24504
commit 026b333c25
3 changed files with 171 additions and 87 deletions

View file

@ -28,7 +28,8 @@ $opts=array(
'timeout'=>5, 'timeout'=>5,
'biglistfp'=>null, 'biglistfp'=>null,
'prodlistfp'=>null, 'prodlistfp'=>null,
'blacklists'=>array() 'blacklists'=>array(),
'whitelists'=>array()
); );
$help='DESCRIZIONE $help='DESCRIZIONE
@ -38,10 +39,12 @@ $help='DESCRIZIONE
una che conterrà i dati di tutte le istanze di partenza e delle istanze 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 ad esse note (comprese quelle bloccate, escluse soltanto quelle che non
rispondono da un lasso di tempo impostabile), e una che conterrà solo rispondono da un lasso di tempo impostabile), e una che conterrà solo
le istanze non bloccate, che danno possibilità di iscrizione di nuovi le istanze non bloccate, la cui piattaforma è mastodon, che danno
utenti, il cui numero di utenti è compreso tra 11 e 30000, che possibilità di iscrizione di nuovi utenti, il cui numero di utenti
conoscono almeno altre 500 istanze, e la cui media di toot per utente è compreso tra 11 e 30000, che conoscono almeno altre 500 istanze,
è maggiore o uguale a 10. 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 SINTASSI
crawler.php -i <file> | -s <file> -b <file> -p <file> [altre opzioni] crawler.php -i <file> | -s <file> -b <file> -p <file> [altre opzioni]
OPZIONI OPZIONI
@ -85,8 +88,16 @@ OPZIONI
formato di questi file vedi sopra il paragrafo relativo nella formato di questi file vedi sopra il paragrafo relativo nella
descrizione dell\'opzione «-s, --startinstancesfp». Questa opzione può descrizione dell\'opzione «-s, --startinstancesfp». Questa opzione può
essere utilizzata più volte per specificare più file di istanze essere utilizzata più volte per specificare più file di istanze
bloccate. Nel file di configurazione è l\'unica opzione con un formato bloccate. Nel file di configurazione ha un formato particolare:
particolare: «blacklistfp=file1[,file2[,file3[...]]]. «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 <secondi> -t, --timeout <secondi>
Imposta il timeout delle richieste http(s) in secondi. Imposta il timeout delle richieste http(s) in secondi.
DEFAULT: '.$opts['timeout'].' secondi. DEFAULT: '.$opts['timeout'].' secondi.
@ -171,6 +182,8 @@ if (!is_null($inifp)) {
mexit('Lopzione «excludeafter» specificata in «'.$inifp.'» non è in un formato corretto (usa «-h» per vedere la guida).'.N,1); mexit('Lopzione «excludeafter» specificata in «'.$inifp.'» non è in un formato corretto (usa «-h» per vedere la guida).'.N,1);
} elseif ($key=='blacklists') { } elseif ($key=='blacklists') {
$opts['blacklists']=explode(',',$val); $opts['blacklists']=explode(',',$val);
} elseif ($key=='whitelists') {
$opts['whitelists']=explode(',',$val);
} else { } else {
$opts[$key]=$val; $opts[$key]=$val;
} }
@ -233,6 +246,13 @@ for ($i=1; $i<$argc; $i++) {
$i++; $i++;
$opts['blacklists'][]=$argv[$i]; $opts['blacklists'][]=$argv[$i];
break; break;
case '-w':
case '--whitelistfp':
if ($i+1>=$argc || $argv[$i+1]=='')
mexit('Lopzione «'.$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 '-l':
case '--loadbiglist': case '--loadbiglist':
if ($i+1>=$argc || ($argv[$i+1]!='si' && $argv[$i+1]!='no')) if ($i+1>=$argc || ($argv[$i+1]!='si' && $argv[$i+1]!='no'))
@ -292,6 +312,7 @@ if ($opts['loadbiglist']) {
} }
$blinstances=array(); $blinstances=array();
$wlinstances=array();
function loadblacklist($bluri) { function loadblacklist($bluri) {
global $blinstances, $opts; global $blinstances, $opts;
@ -314,8 +335,6 @@ function loadblacklist($bluri) {
} }
} }
if ($opts['onlinecheck']) {
$startinstances=array(); $startinstances=array();
echo('Carico il file delle istanze di partenza («'.$opts['startinstancesfp'].'») ... '); echo('Carico il file delle istanze di partenza («'.$opts['startinstancesfp'].'») ... ');
$buf=@file_get_contents($opts['startinstancesfp']); $buf=@file_get_contents($opts['startinstancesfp']);
@ -344,12 +363,31 @@ if ($opts['onlinecheck']) {
} }
} }
foreach ($opts['blacklists'] as $bluri) { foreach ($opts['blacklists'] as $bluri) {
echo('Carico le istanze bloccate dall\'URI «'.$bluri.'» ... '); echo('Carico la lista delle istanze bloccate dall\'URI «'.$bluri.'» ... ');
loadblacklist($bluri); loadblacklist($bluri);
} }
sort($blinstances); sort($blinstances);
echo(count($blinstances).' istanze bloccate.'.N); 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]!='#' && !in_array($val,$wlinstances))
$wlinstances[]=$val;
}
} else {
mexit(N.'Non ho potuto caricare la whitelist delle istanze «'.$wluri.'», muoio.'.N,1);
}
}
sort($wlinstances);
echo(count($wlinstances).' istanze whitelistate.'.N);
if ($opts['onlinecheck']) {
$context=stream_context_create(array('http'=>array('timeout'=>$opts['timeout']))); $context=stream_context_create(array('http'=>array('timeout'=>$opts['timeout'])));
foreach ($startinstances as $dom=>$bluri) { foreach ($startinstances as $dom=>$bluri) {
@ -391,39 +429,64 @@ foreach ($biglist as $dom=>$oinfo) {
echo('~~~~~~'.N); echo('~~~~~~'.N);
if ($opts['onlinecheck']) { 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); $buf=@file_get_contents('https://'.$dom.'/nodeinfo/2.0',false,$context);
if ($buf!==false) { if ($buf!==false) {
echo('OK :-)'.N); echo('OK :-)'.N);
$ninfo=json_decode($buf,true); $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 { } else {
echo('ERRORE :-('.N); 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); $buf=@file_get_contents('https://'.$dom.'/api/v1/instance',false,$context);
if ($buf!==false) { if ($buf!==false) {
echo('OK :-)'.N); echo('OK :-)'.N);
$info=json_decode($buf,true); $info=json_decode($buf,true);
if (!is_null($oinfo) && array_key_exists('cr-checks',$oinfo)) if (!is_null($oinfo) && array_key_exists('X-Checks',$oinfo))
$info['cr-checks']=$oinfo['cr-checks']; $info['X-Checks']=$oinfo['X-Checks'];
$info['cr-checks'][]=array('time'=>time(),'ok'=>true); $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; $newbiglist[$dom]=$info;
} else { } else {
echo('ERRORE :-( ... '); echo('ERRORE :-( ... ');
$lastokk=null; $lastokk=null;
if (!is_null($oinfo) && array_key_exists('cr-checks',$oinfo)) { if (!is_null($oinfo) && array_key_exists('X-Checks',$oinfo)) {
foreach ($oinfo['cr-checks'] as $key=>$val) foreach ($oinfo['X-Checks'] as $key=>$val)
if ($val['ok']) $lastokk=$key; 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); echo('ma riproveremo...'.N);
$oinfo['cr-checks'][]=array('time'=>time(),'ok'=>false); $oinfo['X-Checks'][]=array('time'=>time(),'ok'=>false);
$newbiglist[$dom]=$oinfo; $newbiglist[$dom]=$oinfo;
} else { } else {
echo('e non riproveremo...'.N); echo('e non riproveremo...'.N);
@ -435,64 +498,81 @@ foreach ($biglist as $dom=>$oinfo) {
$info=$oinfo; $info=$oinfo;
} }
$whynot=array(); $whynot=array();
if (array_key_exists('uri',$info)) {
if (!in_array($dom,$wlinstances)) {
if (in_array($dom,$blinstances)) if (in_array($dom,$blinstances))
$whynot[]='Istanza blacklistata'; $whynot[]='Istanza blacklistata';
if (array_key_exists('uri',$info)) { 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)) if (!array_key_exists('registrations',$info))
$whynot[]='Stato delle registrazioni non disponibile'; $whynot[]='Stato delle registrazioni non disponibile';
elseif ($info['registrations']==false) elseif ($info['registrations']==false)
$whynot[]='Registrazioni chiuse'; $whynot[]='Registrazioni chiuse';
if (!array_key_exists('stats',$info)) if (!array_key_exists('stats',$info)) {
$whynot[]='Stats non disponibili'; $whynot[]='Stats non disponibili';
elseif (!array_key_exists('user_count',$info['stats'])) } else {
if (!array_key_exists('user_count',$info['stats']))
$whynot[]='Numero utenti non disponibile'; $whynot[]='Numero utenti non disponibile';
elseif ($info['stats']['user_count']<10 || $info['stats']['user_count']>30000) elseif ($info['stats']['user_count']<10 || $info['stats']['user_count']>30000)
$whynot[]='Numero utenti ('.$info['stats']['user_count'].') non compreso tra 10 e 30000'; $whynot[]='Numero utenti ('.$info['stats']['user_count'].') non compreso tra 10 e 30000';
elseif (!array_key_exists('domain_count',$info['stats'])) if (!array_key_exists('domain_count',$info['stats']))
$whynot[]='Numero istanze conosciute non disponibile'; $whynot[]='Numero istanze conosciute non disponibile';
elseif ($info['stats']['domain_count']<500) elseif ($info['stats']['domain_count']<500)
$whynot[]='Numero istanze conosciute minore di 500'; $whynot[]='Numero istanze conosciute minore di 500';
elseif (!array_key_exists('status_count',$info['stats'])) /* if (!array_key_exists('status_count',$info['stats']))
$whynot[]='Numero di toots non disponibile'; $whynot[]='Numero di toots non disponibile';
elseif ($info['stats']['status_count']/$info['stats']['user_count']<10) 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'; $whynot[]='Media dei toots per utente minore di 10';
if (!array_key_exists('contact_account',$info) || is_null($info['contact_account'])) }
if (!array_key_exists('contact_account',$info) || is_null($info['contact_account'])) {
$whynot[]='Informazioni sull\'account admin principale non disponibili'; $whynot[]='Informazioni sull\'account admin principale non disponibili';
elseif (!array_key_exists('created_at',$info['contact_account'])) }/* else {
if (!array_key_exists('created_at',$info['contact_account']))
$whynot[]='Data di creazione dell\'account admin principale non disponibile'; $whynot[]='Data di creazione dell\'account admin principale non disponibile';
elseif (time()-strtotime($info['contact_account']['created_at'])<6*31*24*60*60) 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'; $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)) { } elseif (!array_key_exists($dom,$prodlist)) {
$whynot[]='Info non disponibili, e l\'istanza non era già presente nella lista delle istanze occhei'; $whynot[]='Info non disponibili, e l\'istanza non era già presente nella lista delle istanze occhei';
} }
if (count($whynot)==0) { if (count($whynot)==0) {
if (array_key_exists($dom,$prodlist)) { 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'])) { 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['X-ShortDescriptionChanged']=true;
$info['prev_short_description']=$prodlist[$dom]['short_description']; $info['X-PrevShortDescription']=$prodlist[$dom]['short_description'];
} else { } 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'])) { if (array_key_exists('description',$info) && (!array_key_exists('description',$prodlist[$dom]) || $prodlist[$dom]['description']!=$info['description'])) {
$info['description_changed']=true; $info['X-DescriptionChanged']=true;
$info['prev_description']=$prodlist[$dom]['description']; $info['X-PrevDescription']=$prodlist[$dom]['description'];
} else { } else {
$info['description_changed']=false; $info['X-DescriptionChanged']=false;
} }
echo('«'.$dom.'» era nella lista delle istanze occhei ed è stata AGGIORNATA! :-)'.N); echo('«'.$dom.'» era nella lista delle istanze occhei ed è stata AGGIORNATA! :-)'.N);
if (array_key_exists('show',$prodlist[$dom])) if (array_key_exists('X-Show',$prodlist[$dom]))
$info['show']=$prodlist[$dom]['show']; $info['X-Show']=$prodlist[$dom]['X-Show'];
else else
$info['show']=-1; $info['X-Show']=-1;
} else { } else {
$info['short_description_changed']=false; $info['X-ShortDescriptionChanged']=false;
$info['description_changed']=false; $info['X-DescriptionChanged']=false;
$info['show']=-1; $info['X-Show']=-1;
echo('«'.$dom.'» non era nella lista delle istanze occhei ed è stata AGGIUNTA! :-)'.N); echo('«'.$dom.'» non era nella lista delle istanze occhei ed è stata AGGIUNTA! :-)'.N);
} }
$prodlist[$dom]=$info; $prodlist[$dom]=$info;
} else { } else {
if (array_key_exists($dom,$prodlist)) { if (array_key_exists($dom,$prodlist)) {
unset($prodlist[$dom]);
echo('«'.$dom.'» era nella lista delle istanze occhei ma è stata SCARTATA! :-('.N); echo('«'.$dom.'» era nella lista delle istanze occhei ma è stata SCARTATA! :-('.N);
} else { } else {
echo('«'.$dom.'» non era nella lista delle istanze occhei e NON CI È ENTRATA! :-('.N); 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']) { if ($opts['onlinecheck']) {
$json=json_encode($newbiglist,JSON_PRETTY_PRINT); $json=json_encode($newbiglist,JSON_PRETTY_PRINT);
file_put_contents($opts['biglistfp'],$json); file_put_contents($opts['biglistfp'],$json);
$newbiglistc=count($newbiglist); $newbiglistc=count($newbiglist);
$diff=$newbiglistc-$ibiglistc; $diff=$newbiglistc-$ibiglistc;
if ($diff>=0) $diff='+'.$diff; if ($diff>=0) $diff='+'.$diff;
echo('Totale istanze nella listona: '.$newbiglistc.' ('.$diff.' rispetto allultima volta)'.N); echo('Totale istanze nella listona: '.$newbiglistc.' ('.$diff.' rispetto all\'ultima volta)'.N);
} else { } else {
echo('Totale istanze nella listona: '.count($biglist).N); 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); file_put_contents($opts['prodlistfp'],$json);
$diff=count($prodlist)-$iprodlistc; $diff=count($prodlist)-$iprodlistc;
if ($diff>=0) $diff='+'.$diff; if ($diff>=0) $diff='+'.$diff;
echo('Totale istanze nella listina di quelle occhei: '.count($prodlist).' ('.$diff.' rispetto allultima volta)'.N); echo('Totale istanze nella listina di quelle occhei: '.count($prodlist).' ('.$diff.' rispetto all\'ultima volta)'.N);
?> ?>

View file

@ -6,3 +6,4 @@ timeout=5
biglistfp=biglist_pant.json biglistfp=biglist_pant.json
prodlistfp=prodlist_pant.json prodlistfp=prodlist_pant.json
blacklists=blacklist_cagi.txt blacklists=blacklist_cagi.txt
whitelists=whitelist_sorellanza.txt

View file

@ -6,3 +6,4 @@ timeout=5
biglistfp=biglist.json biglistfp=biglist.json
prodlistfp=prodlist.json prodlistfp=prodlist.json
blacklists=blacklist_cagi.txt blacklists=blacklist_cagi.txt
whitelists=whitelist_sorellanza.txt