197 lines
5.6 KiB
PHP
Executable file
197 lines
5.6 KiB
PHP
Executable file
#!/bin/php
|
||
<?php
|
||
|
||
/*
|
||
This program is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
setlocale(LC_ALL,'it_IT.UTF-8');
|
||
|
||
define('N',"\n");
|
||
|
||
$contextopts=array(
|
||
'http'=>array(
|
||
'timeout'=>3
|
||
),
|
||
'socket'=>array(
|
||
'tcp_nodelay'=>true
|
||
)
|
||
);
|
||
$context=stream_context_create($contextopts);
|
||
|
||
$startinst='mastodon.social';
|
||
$exfp='crawlerone.exclude';
|
||
$allfp='listaglobale.txt';
|
||
$okfp='listamastodon.txt';
|
||
$softfp='listasoft.txt';
|
||
|
||
$allf=@fopen($allfp,'w');
|
||
$okf=@fopen($okfp,'w');
|
||
$softf=@fopen($softfp,'w');
|
||
|
||
//$insts=array(array('dom'=>$startinst,'ckd'=>false));
|
||
$insts=array();
|
||
$okinsts=array();
|
||
$softwares=array();
|
||
|
||
function isempty($val) {
|
||
if (preg_match('/^\s*$/',$val)===1)
|
||
return(true);
|
||
else
|
||
return(false);
|
||
}
|
||
|
||
function cdate() {
|
||
return(strftime('%a %d %b %Y, %T'));
|
||
}
|
||
|
||
function waituntilonline() {
|
||
global $context;
|
||
$url='http://www.google.com';
|
||
while (@file_get_contents($url,false,$context)===false) {
|
||
echo(cdate().' - Pare che siamo offline...'.N);
|
||
sleep(5);
|
||
}
|
||
echo(cdate().' - Pare che siamo online! :-)'.N);
|
||
}
|
||
|
||
function updexarr() {
|
||
global $exarr, $exfp;
|
||
$exarr=file($exfp,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
|
||
}
|
||
|
||
function ckexarr($inst) {
|
||
global $exarr;
|
||
foreach ($exarr as $re)
|
||
if (preg_match($re,$inst)===1) return(true);
|
||
return(false);
|
||
}
|
||
|
||
function crawl($inst) {
|
||
global $insts, $okinsts, $softwares, $allf, $okf, $softf, $context;
|
||
waituntilonline();
|
||
updexarr();
|
||
foreach ($softwares as $key=>$val)
|
||
echo('Software «'.$key.'»: '.$val.' istanze.'.N);
|
||
if (!isempty($inst)) {
|
||
// i check sulla presenza di $inst tra le già scovate e crawlate e quello sull'eventuale esclusione vengon fatti subito prima della chiamata ricorsiva di crawl, sotto
|
||
echo('«'.$inst.'» non è presente nella lista delle istanze scovate, la aggiungo.'.N);
|
||
$insts[]=$inst;
|
||
fwrite($allf,$inst.N);
|
||
echo('«'.$inst.'»: provo a recuperare info da Nodeinfo ... ');
|
||
$buf=@file_get_contents('https://'.$inst.'/nodeinfo/2.0',false,$context);
|
||
if ($buf!=false) {
|
||
echo('OK :-)'.N);
|
||
echo('«'.$inst.'»: Nodeinfo: controllo che il software sia mastodon ... ');
|
||
$buf=json_decode($buf,true);
|
||
if (is_array($buf) && array_key_exists('software',$buf) && array_key_exists('name',$buf['software'])) {
|
||
if (preg_match('/mastodon/i',$buf['software']['name'])===1) {
|
||
echo('SI! :-)'.N);
|
||
echo('«'.$inst.'»: il software è mastodon, aggiungo l’istanza alla lista delle istanze OK! :-)'.N);
|
||
$okinsts[]=$inst;
|
||
fwrite($okf,$inst.N);
|
||
} else {
|
||
echo('NO :-('.N);
|
||
echo('«'.$inst.'»: il software non è mastodon, NON aggiungo l’istanza alla lista delle istanze ok :-('.N);
|
||
}
|
||
$software=strtolower($buf['software']['name']);
|
||
if (!isempty($software)) {
|
||
if (!array_key_exists($software,$softwares)) {
|
||
echo('Ho trovato un software che non mi è ancora noto: «'.$software.'»!'.N);
|
||
$softwares[$software]=1;
|
||
fwrite($softf,$software.N);
|
||
} else {
|
||
$softwares[$software]++;
|
||
}
|
||
}
|
||
} else {
|
||
echo('ERRORE! :-('.N);
|
||
}
|
||
} else {
|
||
echo('ERRORE :-('.N);
|
||
echo('«'.$inst.'»: Nodeinfo non ha risposto, NON aggiungo l’istanza alla lista delle istanze ok :-('.N);
|
||
}
|
||
echo('«'.$inst.'»: provo a recuperare la lista delle istanze conosciute all’istanza ... ');
|
||
$peers=@file_get_contents('https://'.$inst.'/api/v1/instance/peers',false,$context);
|
||
if ($peers!=false) {
|
||
echo('OK :-)'.N);
|
||
$peers=json_decode($peers,true);
|
||
if (is_array($peers)) {
|
||
foreach ($peers as $peer) {
|
||
if (@is_string($peer)) {
|
||
if (!ckexarr($peer)) {
|
||
if (!in_array($peer,$insts)) {
|
||
echo('>>> Crawlo «'.$peer.'».'.N);
|
||
crawl($peer);
|
||
} else {
|
||
echo('>>> NON crawlo «'.$peer.'» perché l’ho già fatto.'.N);
|
||
}
|
||
} else {
|
||
echo('>>> NON crawlo «'.$peer.'» perché il suo nome corrisponde a un’esclusione.'.N);
|
||
}
|
||
} else {
|
||
echo('>>> NON crawlo «'.$peer.'» perché il suo nome non è una stringa.'.N);
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
echo('ERRORE :-('.N);
|
||
}
|
||
} else {
|
||
echo('NON aggiungo istanze senza nome.'.N);
|
||
}
|
||
echo('~~~~~~~ Stats: '.count($insts).' istanze note, '.count($okinsts).' istanze mastodon vive, '.count($softwares).' software trovati. ~~~~~~~'.N);
|
||
}
|
||
|
||
crawl($startinst);
|
||
echo('FINE CRAWLING! :-)'.N);
|
||
|
||
@fclose($allfp);
|
||
@fclose($okfp);
|
||
@fclose($softfp);
|
||
|
||
echo('Salvo i risultati (tutte le istanze, istanze ok, softwares) ordinati nei rispettivi file.'.N);
|
||
|
||
sort($insts);
|
||
sort($okinsts);
|
||
arsort($softwares,SORT_NUMERIC);
|
||
|
||
$f=@fopen($allfp,'w');
|
||
if ($f!==false) {
|
||
foreach ($insts as $inst)
|
||
fwrite($f,$inst.N);
|
||
fclose($f);
|
||
} else {
|
||
echo('Non ho potuto aprire in scrittura il file «'.$allfp.'».'.N);
|
||
}
|
||
$f=@fopen($okfp,'w');
|
||
if ($f!==false) {
|
||
foreach ($okinsts as $inst)
|
||
fwrite($f,$inst.N);
|
||
fclose($f);
|
||
} else {
|
||
echo('Non ho potuto aprire in scrittura il file «'.$okfp.'».'.N);
|
||
}
|
||
$f=@fopen($softfp,'w');
|
||
if ($f!==false) {
|
||
foreach ($softwares as $software=>$num)
|
||
fwrite($f,$software.' '.$num.N);
|
||
fclose($f);
|
||
} else {
|
||
echo('Non ho potuto aprire in scrittura il file «'.$softfp.'».'.N);
|
||
}
|
||
|
||
exit(0);
|
||
|
||
?>
|