#!/bin/php . */ 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); ?>