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,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(); foreach ($startinstances as $dom=>$bluri) {
echo('Carico il file delle istanze di partenza («'.$opts['startinstancesfp'].'») ... '); if (!is_null($bluri)) {
$buf=@file_get_contents($opts['startinstancesfp']); 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) { if ($buf!==false) {
echo('OK :-)'.N); echo('OK :-)'.N);
$buf=explode(N,$buf); $buf=explode(N,$buf);
foreach ($buf as $val) { foreach ($buf as $val) {
if ($val!='' && $val[0]!='#') { if ($val!='' && $val[0]!='#' && !in_array($val,$wlinstances))
$kv=explode('|',$val); $wlinstances[]=$val;
if ($kv[1]=='') $kv[1]=null;
$startinstances[$kv[0]]=$kv[1];
}
} }
} else { } 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 ($opts['onlinecheck']) {
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);
$context=stream_context_create(array('http'=>array('timeout'=>$opts['timeout']))); $context=stream_context_create(array('http'=>array('timeout'=>$opts['timeout'])));
@ -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 (in_array($dom,$blinstances))
$whynot[]='Istanza blacklistata';
if (array_key_exists('uri',$info)) { if (array_key_exists('uri',$info)) {
if (!array_key_exists('registrations',$info)) if (!in_array($dom,$wlinstances)) {
$whynot[]='Stato delle registrazioni non disponibile'; if (in_array($dom,$blinstances))
elseif ($info['registrations']==false) $whynot[]='Istanza blacklistata';
$whynot[]='Registrazioni chiuse'; if (array_key_exists('X-Software',$info) && !in_array($info['X-Software'],array('mastodon','corgidon')))
if (!array_key_exists('stats',$info)) $whynot[]='Il software non è Mastodon (ma '.$info['X-Software'].')';
$whynot[]='Stats non disponibili'; if (!array_key_exists('registrations',$info))
elseif (!array_key_exists('user_count',$info['stats'])) $whynot[]='Stato delle registrazioni non disponibile';
$whynot[]='Numero utenti non disponibile'; elseif ($info['registrations']==false)
elseif ($info['stats']['user_count']<10 || $info['stats']['user_count']>30000) $whynot[]='Registrazioni chiuse';
$whynot[]='Numero utenti ('.$info['stats']['user_count'].') non compreso tra 10 e 30000'; if (!array_key_exists('stats',$info)) {
elseif (!array_key_exists('domain_count',$info['stats'])) $whynot[]='Stats non disponibili';
$whynot[]='Numero istanze conosciute non disponibile'; } else {
elseif ($info['stats']['domain_count']<500) if (!array_key_exists('user_count',$info['stats']))
$whynot[]='Numero istanze conosciute minore di 500'; $whynot[]='Numero utenti non disponibile';
elseif (!array_key_exists('status_count',$info['stats'])) elseif ($info['stats']['user_count']<10 || $info['stats']['user_count']>30000)
$whynot[]='Numero di toots non disponibile'; $whynot[]='Numero utenti ('.$info['stats']['user_count'].') non compreso tra 10 e 30000';
elseif ($info['stats']['status_count']/$info['stats']['user_count']<10) if (!array_key_exists('domain_count',$info['stats']))
$whynot[]='Media dei toots per utente minore di 10'; $whynot[]='Numero istanze conosciute non disponibile';
if (!array_key_exists('contact_account',$info) || is_null($info['contact_account'])) elseif ($info['stats']['domain_count']<500)
$whynot[]='Informazioni sull\'account admin principale non disponibili'; $whynot[]='Numero istanze conosciute minore di 500';
elseif (!array_key_exists('created_at',$info['contact_account'])) /* if (!array_key_exists('status_count',$info['stats']))
$whynot[]='Data di creazione dell\'account admin principale non disponibile'; $whynot[]='Numero di toots non disponibile';
elseif (time()-strtotime($info['contact_account']['created_at'])<6*31*24*60*60) elseif ($info['stats']['status_count']/$info['stats']['user_count']<10)
$whynot[]='L\'account admin principale risulta esser stato creato meno di 6 mesi fa'; $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)) { } 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