[perl] подправить заголовоки http

Discussion in 'PHP' started by maxfax, 10 Jun 2011.

  1. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    Всем привет!

    google не хочет отдавать страницу,возможно что то не так с заголовками,подскажите как исправить!

    Code:
    #!/usr/bin/perl
    
    use IO::Socket;
    my $server = "www.google.com";
    my $port = 80;
    my $socket=IO::Socket::INET->new( PeerAddr => $server, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM) or die print "Unable to connect to $server:$portn";
    
    print $socket "GET / HTTP/1.1\r\n";
    print $socket "Host: www.google.com\r\n";
    print $socket "Connection: keep-alive\r\n";
    print $socket "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24\r\n";
    print $socket "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
    print $socket "Accept-Encoding: gzip,deflate,sdch\r\n";
    print $socket "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
    print $socket "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n";
    print $socket "Connection: close\r\n";
    
    my $ans=<$socket>;
    print $ans;
     
  2. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    В последней строке, передающей заголовки
    Code:
    print $socket "Connection: close\r\n\r\n";
    
     
  3. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    не помогает ответ HTTP/1.1 302 Found
     
  4. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Смотрите поле Location в ответе и переходите на него
     
  5. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    смотрел , оно такое Location: http://www.google.com/

    меняю строку в скрипте
    Code:
    print $socket "Host: http://www.google.com/\r\n";
    в ответ получаю
    HTTP/1.1 404 Not Found
     
  6. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Плохо смотрите
    Code:
    Location: http://www.google.[b]ru[/b]/
    
    А этот заголовок
    Code:
    Host: http://www.google.com/\r\n
    
    неправильный
     
  7. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    извиняюсь может я что не могу понять, о вот скрипт целиков выдает 404

    Code:
    
    #!/usr/bin/perl
    
    use IO::Socket;
    my $server = "google.ru";
    my $port = 80;
    my $socket=IO::Socket::INET->new( PeerAddr => $server, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM) or die print "Unable to connect to $server:$portn";
    
    print $socket "GET / HTTP/1.1\r\n";
    print $socket "Host: http://www.google.ru/\r\n";
    print $socket "Connection: keep-alive\r\n";
    print $socket "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24\r\n";
    print $socket "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
    print $socket "Accept-Encoding: gzip,deflate,sdch\r\n";
    print $socket "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
    print $socket "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n";
    print $socket "Connection: close\r\n\r\n";
    
    my $ans;
    
    while($ans=<$socket>){
       print $ans;
    }
    
     
  8. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Вот такой вариант попробуйте
    Code:
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use IO::Socket::INET;
    
    my $server = "www.google.ru";
    my $port = 80;
    my $socket = IO::Socket::INET->new (
      'PeerAddr' => $server,
      'PeerPort' => $port,
      'Proto' => 'tcp',
      'Type' => SOCK_STREAM,
      'Timeout' => 10
    ) or die print "Unable to connect to $server:$port: $!\n";
    
    my $req = "GET / HTTP/1.1\r\n"
      . "Host: $server\r\n"
      . "Referer: http://$server\r\n"
      . "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24\r\n"
      . "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
      . "Accept-Encoding: gzip,deflate,sdch\r\n"
      . "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n"
      . "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n"
      . "Connection: close\r\n\r\n";
    
    print $socket $req;
    
    print while <$socket>;
    
    Или LWP заюзайте
     
  9. mazaxaka

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

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    тебе на сокетах нада? lwp не устраивает?
     
  10. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    lwp то что нужно, спасибо и krypt3r за помощь.
     
  11. maxfax

    maxfax New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    правда одна проблема, LWP не хочет открывать адреса типа http://www.google.com.ua/search?q=a если просто http://www.google.com.ua все работает, в чем может быть проблема ?
     
  12. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Все открывает:
    Code:
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use LWP::UserAgent;
    
    $\ = "\n";
    my $url = 'http://www.google.com.ua/search?q=a&ie=UTF-8&oe=UTF-8';
    my $ua = LWP::UserAgent->new;
    $ua->agent ('User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24');
    my $req = $ua->get ($url);
    die 'Cannot get the page' unless $req->is_success;
    #print 'Return code: ', $req->status_line;
    if ($req->status_line eq '200 OK') {
      my $content = $req->content;
      print $content;
    } else {
      print 'Error: ', $req->status_line;
    }
    1;