Прошу помочь разобраться

Discussion in 'PHP' started by mkth, 5 Feb 2010.

  1. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Нарыл скрипт перлового прокси, решил его немного доработать под себя, чтобы все время не вводить юзер агент ручками, пусть значения берутся из файла... Но почему то вся моя затея не привела ни к чему хорошему, скрипт не пашет, две недели ломаю голову, ткните мну, где нужно поправить код, истинные знатоки перла...

    Code:
    #!/usr/bin/perl
    
    use HTTP::Daemon;
    use LWP::UserAgent;
    use Compress::Zlib;
    use CGI::Carp qw(fatalsToBrowser);
    
    my @ext = qw(x-gtar x-gzip x-tar zip image zip z gz tz taz tgz lzh arj arc tar cab wmz yfs wsz exe uu xxe bhx b64 hqx mim);
    
    my $port = 8080;
    
    $SIG{PIPE} = 'IGNORE';
    
    my $server = HTTP::Daemon->new( LocalPort => $port ) or
    die "Can't start server ($@)" unless defined $server;
    
    while (my $conn = $server->accept) {
        my $ua = LWP::UserAgent->new;
        my $str = do {my $fh = open "<filename.txt"; local $/ = undef; <$fh>};
        chomp $str;
        $ua->default_header('My header' => $str);}
    while (my $conn = $server->accept) {
        while (my $request = $conn->get_request) {
               $conn->autoflush;
                    $request -> remove_header('Proxy-Connection');
    		$request -> remove_header('Keep-Alive');
    		$request -> header(Connection=>'close');
               my $resp = $ua->simple_request($request);
               my $c_cont = $resp->content;
            if ( $resp->content_encoding || (grep { $_ =~ /$resp->content_type/g } @ext) || length($c_cont) < 3000 ) {
            $conn->send_response($resp);
            }
            else {
                 $c_cont_zip = Compress::Zlib::memGzip($c_cont);
                 $resp->content($c_cont_zip);
                 $resp->content_encoding('gzip');
                 $conn->send_response($resp);
                 }
         }
        print STDERR "Close: ", $conn->reason, "\n";
        $conn->close;
        undef $conn;
    }
    
     
  2. IIAHbI4

    IIAHbI4 Banned

    Joined:
    24 Aug 2006
    Messages:
    276
    Likes Received:
    331
    Reputations:
    11
    по моему код нужно править начиная здесь

    PHP:
    #!/usr/bin/perl

    use HTTP::Daemon;
    use 
    LWP::UserAgent;
    use 
    Compress::Zlib;
    use 
    CGI::Carp qw(fatalsToBrowser);

    my @ext qw(x-gtar x-gzip x-tar zip image zip z gz tz taz tgz lzh arj arc tar cab wmz yfs wsz exe uu xxe bhx b64 hqx mim);

    my $port 8080;

    $SIG{PIPE} = 'IGNORE';

    my $server HTTP::Daemon->newLocalPort => $port ) or
    die 
    "Can't start server ($@)" unless defined $server;

    while (
    my $conn $server->accept) {
        
    my $ua LWP::UserAgent->new;
        
    my $str = do {my $fh open "<filename.txt"local $/ = undef; <$fh>};
        
    chomp $str;
        
    $ua->default_header('My header' => $str);}
    while (
    my $conn $server->accept) {
        while (
    my $request $conn->get_request) {
               
    $conn->autoflush;
                    
    $request -> remove_header('Proxy-Connection');
            
    $request -> remove_header('Keep-Alive');
            
    $request -> header(Connection=>'close');
               
    my $resp $ua->simple_request($request);
               
    my $c_cont $resp->content;
            if ( 
    $resp->content_encoding || (grep $_ =~ /$resp->content_type/} @ext) || length($c_cont) < 3000 ) {
            
    $conn->send_response($resp);
            }
            else {
                 
    $c_cont_zip Compress::Zlib::memGzip($c_cont);
                 
    $resp->content($c_cont_zip);
                 
    $resp->content_encoding('gzip');
                 
    $conn->send_response($resp);
                 }
         }
        print 
    STDERR "Close: "$conn->reason"\n";
        
    $conn->close;
        
    undef $conn;
    }
    но это не точно
     
  3. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Спасибо, только где именно, я что то не понял?
     
  4. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,051
    Likes Received:
    615
    Reputations:
    690
    Прочитай и попробуй разобратся .
    /showthread.php?t=20299
    http://www.internet-technologies.ru/scripts/script_767.html
    а так пример:
    PHP:
    #!/usr/bin/perl

    use HTTP::Daemon;
    use 
    LWP::UserAgent;
    use 
    Compress::Zlib;
    use 
    CGI::Carp qw(fatalsToBrowser);

    # Ниже список расширений (типов) файлов, которые мы не сжимаем
    my @ext qw(x-gtar x-gzip x-tar zip image zip z gz tz taz tgz lzh arj arc tar cab wmz yfs wsz exe uu xxe bhx b64 hqx mim);

    # Номер порта нашего сервера, его мы указываем в настройках домашнего браузера
    my $port 8080;

    # Если браузер внезапно отключится
    $SIG{PIPE} = 'IGNORE';

    # Создаем объект сервера
    my $server HTTP::Daemon->newLocalPort => $port ) or
    die 
    "Can't start server ($@)" unless defined $server;

    # Создаем объект удаленного (серверного) браузера
    my $ua LWP::UserAgent->new;

    # Ждем подключения нашего (домашнего) браузера
    while (my $conn $server->accept) {

    # Дождавшись, получаем объект запроса в $request (вот тут мы его можем менять)
    while (my $request $conn->get_request) {
    $conn->autoflush;

    # Например "сменим" браузер
    $request->header(User_Agent => 'SuperPuper/v.9.14 Platinum');

    # Перечислим все данные, которые мы можем получать, кроме flash (теперь нам flash не передадут)

    $request->header(Accept =>
    "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1");

    # Посылаем запрос через серверный браузер и получаем объект ответа в $resp
    my $resp $ua->simple_request($request);

    # В переменной $c_cont содержание (данные) ответа
    my $c_cont $resp->content;

    # Проверяем необходимость сжатия, если сжатие не нужно, тут же отправляем на домашний браузер
    if ( $resp->content_encoding || (grep $_ =~ /$resp->content_type/} @ext) || length($c_cont) < 3000 ) {
    $conn->send_response($resp);
    }
    else {
    # Сжимаем данные
    $c_cont_zip Compress::Zlib::memGzip($c_cont);

    # Устанавливаем сжатые данные в объект ответа
    $resp->content($c_cont_zip);

    # Устанавливаем признак сжатия в объект ответа
    $resp->content_encoding('gzip');

    # Посылаем ответ домашнему браузеру
    $conn->send_response($resp);
    }
    }
    print 
    STDERR "Close: "$conn->reason"\n";
    $conn->close;
    undef $conn;
    }
     
    _________________________
  5. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Заранее прошу прощения, быть может мои просьбы покажутся истинным кодерам немного глупыми, но, как работает сам скрипт прокси мне ясно... Я его малость переделал, вот в таком виде он робит нормально

    Code:
    use HTTP::Daemon;
    use LWP::UserAgent;
    use Compress::Zlib;
    use CGI::Carp qw(fatalsToBrowser);
    my @ext = qw(x-gtar x-gzip x-tar zip image zip z gz tz taz tgz lzh arj arc tar cab wmz yfs wsz exe uu xxe bhx b64 hqx mim);
    my $port = 8080;
    $SIG{PIPE} = 'IGNORE';
    my $server = HTTP::Daemon->new( LocalPort => $port ) or
    die "Can't start server ($@)" unless defined $server;
    my $ua = LWP::UserAgent->new;
    $ua->default_header('My header' => "value") # вот тут я сломал голову
    while (my $conn = $server->accept) {
        while (my $request = $conn->get_request) {
               $conn->autoflush;
                    $request -> remove_header('Proxy-Connection');
            $request -> remove_header('Keep-Alive');
            $request -> header(Connection=>'close');
               my $resp = $ua->simple_request($request);
               my $c_cont = $resp->content;
            if ( $resp->content_encoding || (grep { $_ =~ /$resp->content_type/g } @ext) || length($c_cont) < 3000 ) {
            $conn->send_response($resp);
            }
            else {
                 $c_cont_zip = Compress::Zlib::memGzip($c_cont);
                 $resp->content($c_cont_zip);
                 $resp->content_encoding('gzip');
                 $conn->send_response($resp);
                 }
         }
        print STDERR "Close: ", $conn->reason, "\n";
        $conn->close;
        undef $conn;
    }
    
    А добавил я вот эти строки

    Code:
     while (my $conn = $server->accept) {
        my $ua = LWP::UserAgent->new;
        my $str = do {my $fh = open "<filename.txt"; local $/ = undef; <$fh>};
        chomp $str;
        $ua->default_header('My header' => $str)
        .................
    }
    
    скрипт робить перестал...

    Т.е., мне нужна помощь именно в этих строках, как взять значение и засунуть его в запрос, а работа всего скрипта мне ясна, более или менее понятна...
     
    #5 mkth, 5 Feb 2010
    Last edited: 5 Feb 2010
  6. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Code:
    my $str = do {open my $fh, "<filename.txt"; local $/ = undef; <$fh>};
    
    Хотя это бредовый код.

    ЗЫ.
    Code:
    use strict;
    use warnings;
    
     
  7. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Выходят предупреждения, но я так и не понял ниче, прошу подправить мой код...
     
  8. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Идея в том, чтобы юзерагент менялся при каждом запросе?
     
    _________________________
  9. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Да! Руками вбивать каждый раз новый агент имхо немного трудновато, а так запихать их все в тектовый файл и пусть при каждом запросе агент берется из файла...
     
  10. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Меня немного смущает тот факт, что если запрос отправляется на страницу со скриптами, то пока все скрипты отработают, то юзерагент должен остаться один и тот же...
     
  11. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Напиши типа

    open(F, '<agents.txt') || die $!;
    chomp(my @agents = <F>);
    close F;

    $ua->agent($agents[rand @agents]);
     
    _________________________
  12. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Спасибо, но все равно не прет почему-то... :mad:

    Code:
    #!/usr/bin/perl
    
    use HTTP::Daemon;
    use LWP::UserAgent;
    use Compress::Zlib;
    use CGI::Carp qw(fatalsToBrowser);
    
    open(F, '<agents.txt') || die $!;
    chomp(my @agents = <F>);
    close F;
    
    my $ua = LWP::UserAgent->new;  # сам добавил, без этого не работал вообще код
    $ua->agent($agents[rand @agents]);
    
    my @ext = qw(x-gtar x-gzip x-tar zip image zip z gz tz taz tgz lzh arj arc tar cab wmz yfs wsz exe uu xxe bhx b64 hqx mim);
    
    my $port = 8080;
    
    $SIG{PIPE} = 'IGNORE';
    
    my $server = HTTP::Daemon->new( LocalPort => $port ) or
    die "Can't start server ($@)" unless defined $server;
    
    while (my $conn = $server->accept) {
        while (my $request = $conn->get_request) {
               $conn->autoflush;
                    $request -> remove_header('Proxy-Connection');
    		$request -> remove_header('Keep-Alive');
    		$request -> header(Connection=>'close');
               my $resp = $ua->simple_request($request);
               my $c_cont = $resp->content;
            if ( $resp->content_encoding || (grep { $_ =~ /$resp->content_type/g } @ext) || length($c_cont) < 3000 ) {
            $conn->send_response($resp);
            }
            else {
                 $c_cont_zip = Compress::Zlib::memGzip($c_cont);
                 $resp->content($c_cont_zip);
                 $resp->content_encoding('gzip');
                 $conn->send_response($resp);
                 }
         }
        print STDERR "Close: ", $conn->reason, "\n";
        $conn->close;
        undef $conn;
    }
    
     
  13. mkth

    mkth New Member

    Joined:
    28 Nov 2007
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Попутно хотел бы узнать, можно ли в перле обрабатывать яваскрипты, как это делает браузер, нет ли такого модуля на cpanе ? Тогда бы я все совершенно по-другому сделал и не мудохался бы с прокси и браузером?