Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   FTP checker/parser/sorter/PR-er (https://forum.antichat.xyz/showthread.php?t=158405)

intNet 22.11.2009 14:22

FTP checker/parser/sorter/PR-er
 
Что-то не нашёл нормального чекера фтп с определением ПР и сортировки по нему. В результате решено было написать дынный скрипт.
Возможности:
[+] Parser/sorter/dup remover + приводит все фтп к нормальному виду
[+] Определение PR и сортировка по нему.

П.С. За код сильно не пинайте - perl не родной язык.
Thx to Pashkela за регулярку.

Код:

#!usr/bin/perl
use threads;
use threads::shared;
use Fcntl ':flock';
use LWP::UserAgent;

#settings
my $threads = 10; #Кол-во потоков
my $input_file_name = 'ftp.txt';
my $output_file_name = 'good_ftp.txt';
my $sleep_time = 0; #задержка
my $timeout = 5; #timeout in seconds
my $agent = "FTPCheck";
#/settings
my $good: shared = 0;
my @array : shared;
my $ua = LWP::UserAgent -> new(timeout => $timeout, agent => $agent);
my $ua2 = LWP::UserAgent -> new(timeout => $timeout, agent =>$agent);

system("title #FTP-CheckeR by intNet#");
about();
print localtime()." Parsing started...\n";
parse();
print localtime()." ok!\n".localtime()." Check started...\n\n";
@array = ftoarr($input_file_name);
threads ->new(\&gogo) for 1..$threads;
$_ -> join for threads->list;
print "\n\n".localtime()." Check done!\nGood: $good\n\n";
print localtime()." Sorting by PR...\n";
sort_by_pr($output_file_name);
print localtime()." Done!\n";
system("pause");

sub sort_by_pr {
        open FILE, "<$output_file_name" || die "Can't open $output_file_name\n";
        my @arr = <FILE>;
        close FILE;
        open FILE, ">$output_file_name";
        for(my $i = 10; $i>=0; --$i) {
                foreach $akk(@arr) {
                        print FILE $akk if $akk =~ /PR: $i/;
                        print "PR $i - $akk" if $akk =~ /PR: $i/;
                }
        }
        close FILE;
}

sub parse {
# помещает во входной файл отсортированные и очищенные уникальные фтп
        open DAT, "<$input_file_name" or die "Can't open $input_file_name\n";
        @temp_arr = <DAT>;
        close DAT;
        my $a = 0;
        my @arr;
        foreach $akk(@temp_arr) {
                if($akk =~ /([^ ]*:[^ ]*\@[^ \n]*)/) {
                        push @arr => "$1\n";
                        $a++;
                }
        }
        my @new_arr;
        foreach $akk(@arr) {  #adding ftp:// and :21 if needed
                chomp $akk;
                if($akk =~ /ftp:\/\//) {
                        if($akk =~ /:21/) {
                          push @new_arr =>"$akk\n";
                        } else {
                                push @new_arr=>$akk.":21\n";
                        }
                } else {
                        if($akk =~ /:21/) {
                                push @new_arr => 'ftp://'.$akk."\n";
                        } else {
                                push @new_arr => 'ftp://'.$akk.":21\n";
                        }
                }
        }               
        @arr = sort @new_arr;
        for($i=0;$i<$a;$i++){
                @arr[$i] = '' if @arr[$i] eq @arr[$i+1]; #dup remove
        }
        open DAT, ">$input_file_name";
        print DAT @arr;
        close DAT;
        return ;
}

sub ftoarr {
        die "File $_[0] not exist or has zero-size\n" if(-z $_[0] || !-e $_[0]);
        open DAT, "<$_[0]" || die "Can't open $_[0]\n";
        my @ar = <DAT>;
        close DAT;
        return @ar;
}

sub fnote {
#syntax - WriteToFile(FileNameToWriteData, Data)
        open my $data_file, ">>$_[0]" || die "Can't open $output_file_name\n";
        flock $data_file, LOCK_EX;
        print $data_file $_[1];
        flock $data_file, LOCK_UN;
        close $data_file;
}       

sub gogo {
        while(@array) {
                my $str = undef;
                my $host = undef;
                my $pr = undef;
                my $cy = undef;
                {
                        lock(@array);
                        $str = shift(@array);
                        chomp $str;
                        next if $str eq '';
                }
                print "Now $str...";
                if(checkftp($str) ==1) {
                        {
                                lock($good);
                                $good++;
                        }
                        if($str =~ /^ftp:\/\/?(.*):(.*)\@(.*):(\d+)/i) {
                                $host = $3;
                        } else {
                                $host = '';
                        }
                        $res = $ua2->get('http://www.moshiach.ru/checker/worker.php?service=google_pr&url='.$host);
                        $pr = substr($res->content, 6);
                        $pr = 0 if $pr =~ /N\/A/;
                        fnote($output_file_name, $str." | host: $host | PR: $pr\n");
                        print " GOOD!($good), Host: $host, PR: $pr\n";
                } else {
                        print " BAD!\n";
                }
                sleep $sleep_time;
        }
}
       
sub checkftp {       
        $getres = $ua->get($_[0]);
        if($getres->as_string =~ /200 OK/) {
                return 1;
        } else {
                return 0;
        }
}

sub about {
        print "#FTP-Checker\n#Version 1.0 [beta]\n".
                        "#(C)oded by intNet\n".
                        "\t[+] Parser\n\t[+] Checker\n\t[+] PR-checker with sorter\n\n";
        return ;
}
#by intNet

П.П.С. скрипт писался для себя.


Время: 18:40