Помогие с curl - curl_exec выводит чушь.

Тема в разделе "PHP", создана пользователем Бобр Добр, 2 фев 2012.

Модераторы: latteo
  1. Бобр Добр

    Бобр Добр

    Регистр.:
    17 янв 2010
    Сообщения:
    242
    Симпатии:
    37
    Привет всем! Парни помогите плз сил больше нет.

    Короче нужно написать прокси чекер который определяет и тип прокси. Алгоритм такой:
    PHP:
     Cразу ставим
     
    curl_setopt
    ($ch,CURLOPT_PROXYTYPE,CURLPROXY_HTTP);
     
    патом делаем проверку
    if(curl_exec) {
          
    прокси рабочие и её тип HTTP
    } else {
          
    curl_setopt($ch,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
          if(
    curl_exec){
          
    проуси рабочие и её тип SOCKS5
    }
    }
    Но этот скрипт иногда выдавал не рабочие HTTP прокси за рабочие.

    Начал искать проблему, оказалась что если выставлено:
    curl_setopt($ch,CURLOPT_PROXYTYPE,CURLPROXY_HTTP);
    А прокси на самом деле SOCKS то функция curl_exec() выдаёт true, а веренее она выводит вот такую строку: [‘|яяяя.

    Я хз почему, php.net весь перечитал.

    Вот этот код демонстрирует это проблему.
    PHP:
    <?php
     
    $ch 
    curl_init();
    curl_setopt($ch,CURLOPT_URL,'http://php.net/');
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT3);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_PROXY,'67.185.120.108:1455');
    curl_setopt($ch,CURLOPT_PROXYTYPE,CURLPROXY_HTTP);
     
    echo 
    curl_error($ch);
    for(
    $i=0;$i<15;$i++){
    $ne curl_exec($ch);
    var_dump($ne);
    }
    ?>
    примерно в 20% запусков выводит:

    Большая просьба запустите приведённый пример, у себя кто нибудь.
     
  2. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.266
    Чуток по гуглил и нарыл. Проверил работает.

    Может натолкнет на мысль))

    Это парсер
    PHP:
    <html>
    <head></head>
    <body>
    <?php
    $html 
    file_get_contents('http://www.checker.freeproxy.ru/checker/last_checked_proxies.php');
    preg_match_all('/<script> <!--\s+'
                  
    'name = \'(.+)\';\s+'
                  
    'port1 = (\d+);\s+'
                  
    'port2 = (\d+);\s+'
                  
    'port3 = (\d+);\s+'
                  
    'port4 = (\d+);\s+'
                  
    'port5 = (\d+);\s+'
                  
    'port6 = (\d+);\s+'
                  
    'port7 = (\d+);\s+'
                  
    'port8 = (\d+);\s+'
                  
    'port9 = (\d+);\s+'
                  
    'port10 = (\d+);\s+'
                  
    '(\w+) = port(\d+) \+ \((\d+)-(\d+)\) \/ (\d+);\s+'
                  
    'document\.write\(name \+ \':\' \+ \w+\);\s+'
                  
    '\/\/ -->/i'$html$matches);
    $proxys_count count($matches[0]) - 1;
    for ( 
    $pr 0$pr <= $proxys_count $pr++ ) {
        
    $ports = array ();
        for ( 
    $i $i <= 10 $i++ ) {
            
    $ports[$i] = $matches[( $i )][$pr];
        }
        
    $port $ports[$matches[13][$pr]] + ( $matches[14][$pr]  - $matches[15][$pr] ) / $matches[16][$pr];
        echo 
    $matches[1][$pr] . ':' $port '<br />';
    }
    ?>
    </body></html>

    Это черекер
    PHP:
    <html>
    <head></head>
    <body>
        <?php
        $proxies 
    file ("proxies.txt"); //читает из файла
        
    $mc curl_multi_init ();
        for (
    $thread_no 0$thread_no<count ($proxies); $thread_no++)
        {
        
    $c [$thread_no] = curl_init ();
        
    curl_setopt ($c [$thread_no], CURLOPT_URL"http://google.com");
        
    curl_setopt ($c [$thread_no], CURLOPT_HEADER0);
        
    curl_setopt ($c [$thread_no], CURLOPT_RETURNTRANSFER1);
        
    curl_setopt ($c [$thread_no], CURLOPT_CONNECTTIMEOUT5);
        
    curl_setopt ($c [$thread_no], CURLOPT_TIMEOUT10);
        
    curl_setopt ($c [$thread_no], CURLOPT_PROXYtrim ($proxies [$thread_no]));
        
    curl_setopt ($c [$thread_no], CURLOPT_PROXYTYPE0);
        
    curl_multi_add_handle ($mc$c [$thread_no]);
        }
       
        do {
        while ((
    $execrun curl_multi_exec ($mc$running)) == CURLM_CALL_MULTI_PERFORM);
        if (
    $execrun != CURLM_OK) break;
        while (
    $done curl_multi_info_read ($mc))
        {
        
    $info curl_getinfo ($done ['handle']);
        if (
    $info ['http_code'] == 301) {
        echo 
    trim ($proxies [array_search ($done['handle'], $c)])."\r\n";
        }
        
    curl_multi_remove_handle ($mc$done ['handle']);
        }
        } while (
    $running);
        
    curl_multi_close ($mc);
        
    ?>
    </body></html>
    Если скопировать спарсенные прокси и вставить в proxies.txt - чекает на ура
     
    Бобр Добр нравится это.
  3. Бобр Добр

    Бобр Добр

    Регистр.:
    17 янв 2010
    Сообщения:
    242
    Симпатии:
    37
    Zlobniy Babko

    спасибо за парсер с чекером, но этот чекер не пойдёт тут нет определение типа прокси, а мне это очень нужно, так как паршу(во слово:) ) я прокси с разных ресурсов. Не всегда бывает, что если заявлено, что проси SOCKS5 то они такими и будут, бывает что в листах с соксами проскакивают НТТР
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Ну и что? вы коннектитесь по неверному протоколу, сервер выдаёт какие то данные, которые курл при чтении определяет как нормальный ответ. Вообще определять успех прокси в корне неверно по удаче curl_exec, только по ответу сервера. мне часто попадались прокси, очень быстрые, по пингу и скорости загрузки. Но потом оказывалось что это прокси любой запрос перенаправляли на свой сайт\показывали страницу ошибки доступа и т.п