Post/get запрос через прокси

Discussion in 'PHP' started by beerbear, 22 Apr 2007.

  1. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Есть, например, такой запрос:

    Code:
    <?
        $proxy = "217.219.192.69";
        $port = "80";
    
        $host = "http://site.ru";
        $path = "/";
    
        
    
        $fp =  @fsockopen($proxy, $port, $errno, $errstr, 10);
        if($fp)
        {
            $headers = "GET $path HTTP/1.1\r\n";
            $headers.= "Host: $host\r\n";
            $headers.= "Connection: Close\r\n\r\n";
    
            fwrite($fp, $headers);
            while(!feof($fp))
            {
                echo fread($fp,1024);
            }
            fclose($fp);
        }
        else
        {
            echo "$errno $errstr";
        }
    ?> 
    
    
    

    Как сделать, чтобы прокси брались из файла, например, proxy.txt, потом разделялись на прокси и порт, проверялись, если нормально - юзались в запросе, если нет - бралась следующая строка из proxy.txt?

    Спасибо!
     
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    PHP:
    $file file('proxies.txt'); // Файл с проксями
    list($proxy$port) = explode(":"trim($file)); // Теперь $proxy -  сервер прокси, до двоеточия, а порт = порт, после двоеточия
     
  3. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    ну или так::
    PHP:
    //массив проксей (в файле прокси разделены '\n'), порт и хост разделены ':'
    $f_proxy fopen('proxy.txt'r);
    $proxy fread($f_proxy65000);
    $proxy_server explode("\n"$proxy);
    $n=count($proxy_server);
    for (
    $i=0$i<=count($proxy_server)-1$i++)
     {
      
    $proxy_serv[$i] = explode(":"$proxy_server[$i]);
     }
    fclose($f_proxy);
    Здесь ты получаешь из файла 'proxy.txt' двумерный массив ($proxy_serv) вида:
    HTML:
    array [1 => 1 - ip
                       2 - port
              2 => ...]
    PHP:
    <?
        
    $host "http://site.ru";
        
    $path "/";

    //массив проксей (в файле прокси разделены '\n'), порт и хост разделены ':'
    $f_proxy fopen('proxy.txt'r);
    $proxy fread($f_proxy65000);
    $proxy_server explode("\n"$proxy);
    $n=count($proxy_server);
    for (
    $i=0$i<=count($proxy_server)-1$i++)
     {
      
    $proxy_serv[$i] = explode(":"$proxy_server[$i]);
     }
    fclose($f_proxy);

    for (
    $i=0$i<count($proxy_serv); $i++)
    {
        
    $fp =  fsockopen($proxy_serv[$i][1], $proxy_serv[$i][2], $errno$errstr10);
        if(
    $fp)
       
    // ;) 
        
    {
            
    $headers "GET $path HTTP/1.1\r\n";
            
    $headers.= "Host: $host\r\n";
            
    $headers.= "Connection: Close\r\n\r\n";

            
    fwrite($fp$headers);
            while(!
    feof($fp))
            {
                
    $rez_data fread($fp,1024);
               
    // здесь код для обработки ответа
              //...
            
    }
            
    fclose($fp);
        }
        else
        {
            echo 
    "$errno $errstr";
        }
    }
    ?>
    зы::Разницы никакой, 2-ой код используется в начале скрипта, а далее использйется массив, 1-ый код использутся каждый раз в при открытиии сокета.
     
    #3 mR_LiNK[deface_0nl, 22 Apr 2007
    Last edited: 25 Apr 2007
    1 person likes this.
  4. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    2ой более экономичный к ресурсам =)
     
  5. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Че-то нифига у меня не получается...

    Скрипт такой:

    Code:
    <?php
    
    $usver = file("names.txt");
    $parol = file("pass.txt"); 
    
    foreach ($usver as $i=>$v) {
    $hostname = "site.com";
    $path = "/login";
    $line = "";
    
    
      $fp = fsockopen($hostname, 80, $errno, $errstr, 30); 
      if (!$fp) echo "$errstr ($errno)<br />\n"; 
      else
      { 
    //пошел пост запрос
    //...............
    //..............
    }
    fclose($fp);
    
    
    
    //потом гет запрос
    //...............
    //..............
    
    //потом еще один пост запрос
    //...............
    //..............
    
    Пытался сделать, чтобы каждый пользователь, типа, подключался под разным IP.
    Ткните носом, где посмотреть конкретный пример с использованием списка проксей из файлика и проверкой их на коннект.

    Или, если кому не влом, приведите код тут.
    С меня репа! Спасибо!
     
  6. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    2) ВЫШЕ я уже приводил код использование списка прокси, хранящихся в файле
    PHP:
    $f_proxy fopen('proxy.txt'r); 
    $proxy fread($f_proxy65000); 
    $proxy_server explode("\n"$proxy); 
    $n=count($proxy_server); 
    for (
    $i=0$i<=count($proxy_server)-1$i++) 
     { 
      
    $proxy_serv[$i] = explode(":"$proxy_server[$i]); 
     } 
    fclose($f_proxy);
    На выходе ты получаешь массив $proxy_serv
    далее его и используешь, код вывода разных проксей из массива я приводил выШЕ!! (в цикле)

    проверка на соединение ты и так уже написал::
    PHP:
    ...
    if (!
    $fp) echo "$errstr ($errno)<br />\n";
    ...
    можно также дополнить времением ожидания ответа..

    зы:: по поводу первого сорь, обознался, перепутал file() с fread()..
     
    #6 mR_LiNK[deface_0nl, 24 Apr 2007
    Last edited: 25 Apr 2007
    1 person likes this.
  7. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Не понял. Скрипт выдирает из файлов переменные построчно и юзает их. я привел код скрипта не полностью, а для примера.
    Без проксей все работает на ура. Сейчас хочу, чтобы подключался через проксю. Пробовал заюзать код выше - не получается.
     
  8. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    что именно не получается???
    выложи код!
    выложи ошибки!!

    если не хочешь выкладывать здесь, стучи в асю, посмотрим что не так

    зы:: пост ниже кстати, верен тоже, этот параметр необходим
     
    #8 mR_LiNK[deface_0nl, 25 Apr 2007
    Last edited: 25 Apr 2007
  9. SMiX

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

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    Нужен хеадер
    Proxy-Connection: close
     
  10. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    2beerbear
    тебе сюда http://www.forum.antichat.ru/thread38811.html

    зы: много лучше, чем то что выше!
     
  11. hackconnect

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

    Joined:
    8 Mar 2007
    Messages:
    49
    Likes Received:
    5
    Reputations:
    0
    кстати, так как это прокси-запрос, лучше для совместимости в начало $path приписывать 'http://'.$host
     
  12. Developer

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

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    PHP:
     $f_proxy fopen('proxy.txt'r); 
    $proxy fread($f_proxy65000); 
    $proxy_server explode("\n"$proxy); 
    $n=count($proxy_server); 
    for (
    $i=0$i<=count($proxy_server)-1$i++) 
     { 
      
    $proxy_serv[$i] = explode(":"$proxy_server[$i]); 
     } 
    fclose($f_proxy); 
    Садо-мазо клуб?

    PHP:
    <?php

    // Формат proxy_list.txt: на каждой строчке данные о прокси в формате IP:PORT
    // Пример: 10.10.10.10:8080

    $list file('proxy_list.txt');

    foreach (
    $list as $proxy) {
        list(
    $ip$port) = explode(':'$proxy);
        
    myFunction($ip$port);
    }

    ?>
     
  13. SMiX

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

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    Мде. Старая тема - если файл большой?
    PHP:
    <?
    $f fopen('proxy.txt','r');
    while(
    $proxy fgets($f))
    {
        
    $proxy explode(':',$proxy);
        
    //$proxy = Array('ip','port')

    }
    fclose($f);
    ?>
     
  14. Developer

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

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    Вот, не поленился написать полностью скрипт проверки прокси:

    PHP:
    <?php

    // Proxy Checker
    // By SpeedHack

    // Options
    // Слеш после хоста обязателен, т.е. написать просто http://site.ru нельзя
    $url 'http://site.ru/';
    $timeout 15;

    // EOL
    define('EOL'"\n");

    // Proxy check function
    // Входящие параметры: IP, порт, URL тест-сайта, таймаут соединение (по умолчанию 30)
    function checkProxy ($ip$port$url$timeout 30)
    {
        if (
    $fp fsockopen($ip$port$errno$errstr$timeout)) {
            
    $info parse_url($url);
            
    $headers 'GET ' $info['path'] . ' HTTP/1.0' EOL;
            
    $headers .= 'Host: ' $info['host'] . EOL;
            
    $headers .= 'Connection: Close' EOL EOL;
            
    fwrite($fp$headers);
            
    $buffer '';
            while (!
    feof($fp)) {
                
    $buffer .= fread($fp1024);
            }
            
    fclose($fp);
            
    // Тут можно вставить свое условие для проверки
            // Я для примера вставил условие, которое является истинов при
            // Нахождении в полученных данных слова 'OK'
            
    return (strpos($buffer'OK') !== false) ? true false;
        } else {
            return 
    false;
        }
    }

    $list file('proxy_list.txt');

    foreach (
    $list as $proxy) {
        list(
    $ip$port) = explode(':'rtrim($proxy));
        echo 
    'Proxy ' rtrim($proxy) . ': ';
        echo (
    checkProxy($ip$port$timeout)) ? '<font color="green">OnLine</font>' '<font color="red">OffLine</font>';
        echo 
    '<br />' EOL;
    }

    ?>
     
    1 person likes this.
  15. Developer

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

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    Лично тестировал file на 80 000 строчном файле - как с куста. Не думаю что прокси будет больше. На крайний случай, вместо fopen есть file_get_contents.