MastodonStartpage/web/admin/crawler/crawlerone.php
pezcurrel 9fcfa50609 ...
2020-03-25 00:03:29 +01:00

197 lines
5.6 KiB
PHP
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 listanza alla lista delle istanze OK! :-)'.N);
$okinsts[]=$inst;
fwrite($okf,$inst.N);
} else {
echo('NO :-('.N);
echo('«'.$inst.'»: il software non è mastodon, NON aggiungo listanza 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 listanza alla lista delle istanze ok :-('.N);
}
echo('«'.$inst.'»: provo a recuperare la lista delle istanze conosciute allistanza ... ');
$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é lho già fatto.'.N);
}
} else {
echo('>>> NON crawlo «'.$peer.'» perché il suo nome corrisponde a unesclusione.'.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);
?>