Тема: proxy grab&check
Показать сообщение отдельно

  #5  
Старый 18.10.2007, 17:22
BuH@LicH
Новичок
Регистрация: 06.02.2007
Сообщений: 13
Провел на форуме:
83591

Репутация: 40
По умолчанию

satana8920, специально для тебя proxy grab&check. Подробности в комментариях
Код:
######################################################
# За основу скрипта взята работа s7r34m : Group of Freedom Search www.gfs-team.ru,
# Отредактированная под нужды топикстартера
######################################################
use FileHandle;
use Getopt::Std;

autoflush STDOUT 1;
getopts('f:');
printInfo();
getProxies($opt_f);
checkProxies();
exit;


#############################################
#This function gets proxylists from internet
#############################################
sub getProxies
{
    $links_file = shift;
    $num = 0;

    open(PROXY_LINKS, $links_file);
    @proxy_links=<PROXY_LINKS> or die print "$! ";
    close(PROXY_LINKS);
	
    open(ALLP,">./allproxies.txt");

    
    #Get proxies 
    foreach $url(@proxy_links)
	{
		print "Getting proxies from $url ... ";
		chomp($url);
		$s=getPage($url);
		# Данное регулярное выражение подходит только для страниц, на которых прокси сервера соотеветствуют маске: ip:port,
		# Например, http://www.freeproxy.ru./download/lists/goodproxy.txt
		# Для другого случая пишешь свою регулярку.
		while($s=~/(\d*\.\d*\.\d*\.\d*)\:(\d*)/msgi) 
		{
			print ALLP $1.":".$2."\n";
			$num++;
		}
		print "done\n";
	}

    print "\n".$num." proxies found\n\n";
    close ALLP;
}



################################
#This function checks proxylist
################################
sub checkProxies
{
    use threads;
    use threads::shared;

    $threadsNumber=64;
    print "Checking proxies... ";
    share(@flags);
    open(ALLP,"<./allproxies.txt");

    #creating threads
    for($i=0;$i<$threadsNumber;$i++)
    {
        threads->create("myThread",$i);
        $flags[$i]="nothing";
    }
    foreach $thr(threads->list)
    {
        $thr->detach;
    }

    #main loop
    #searches for unoccupied thread
    #and gives it a work
    $num=0;
    while($proxy=<ALLP>)
    {
        $num++;
        print "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
        print "Checking proxies... ".$num;
        $current=0;
        while()
        {
            if($flags[$current] eq "nothing")
            {
                $flags[$current]=$proxy;
                last;
            }
            if($flags[$current] eq "good")
            {
                $flags[$current]=$proxy;
                $goodNumber++;
                last;
            }
            $current++;
            if($current==$threadsNumber-1) {$current=0;}
        }
    }

    #checking finished
    #now we may kill all threads
    $i=0;
    while($i<$threadsNumber)
    {
        if($flags[$i] eq "nothing")
        {
            $flags[$i]="finish";
        }
        if($flags[$i] eq "good")
        {
            $flags[$i]="finish";
            $goodNumber++;
        }
        if($flags[$i] eq "finished")
        {
            $i++;
        }
    }
    close ALLP;
    print "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
    print "Checking proxies... finished\n";
    print $goodNumber." eleet proxies found\n";

    sleep(1);
}

########
#Thread
########
sub myThread
{
    while()
    {
        sleep(1);
        if($flags[$_[0]] eq "finish") {last;}
        if($flags[$_[0]] eq "nothing") {next;} #wait for task
        if($flags[$_[0]] eq "good") {next;} #wait for task
        $proxy=$flags[$_[0]];
        $result=testProxy($proxy);
        if($result==1)
        {
            open(ELEET,">>./eleet.txt");
            print ELEET $proxy;
            close ELEET;
            $flags[$_[0]]="good";
        } else {
            $flags[$_[0]]="nothing";
        }
    }
    $flags[$_[0]]="finished";
}


###########################
#This function tests proxy
###########################
sub testProxy
{
      $env="http://nntime.com/textenv.pl";
      #$env="http://samair.ru/cgi/textenv.pl"

      $s=getPage($env,"http://".$_[0]);
      ($adr,$port)=split(/:/,$_[0]);
      if($s!~/REMOTE_ADDR=$adr/) {return 0}; #bad or transparent proxy
      if($s=~/HTTP_VIA/) {return 0;} #anonymous or transparent proxy
      if($s=~/HTTP_X_FORWARDED_FOR/) {return 0;} #anonymous or transparent proxy
      return 1; #eleet proxy
}



####################################################
#This function prints information about the program
####################################################
sub printInfo
{
    print "*********************************************\n";
    print "Usage:\n";
    print "$0 -f file_with_links.txt:\n";
    print "*********************************************\n\n";
}


#################################
#This functon makes HTTP request
#################################
sub getPage
{
    use LWP::UserAgent;
    $ua=LWP::UserAgent->new;

    $ua->proxy(http=>$_[1]);
    $ua->timeout(10);

    $ua->agent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
    $req=HTTP::Request->new(GET=>$_[0]);

    $res=$ua->request($req);

    if($res->is_success)
    {
        return $res->content;
    }
}
 
Ответить с цитированием