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

Бобр Добр

Профессор
Регистрация
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_CONNECTTIMEOUT, 3);
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% запусков выводит:
string '�[‘|яяяя' (length=8)


Большая просьба запустите приведённый пример, у себя кто нибудь.
 
  • Заблокирован
  • #2
Чуток по гуглил и нарыл. Проверил работает.

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

Это парсер
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 = 1 ; $i <= 10 ; $i++ ) {
        $ports[$i] = $matches[( $i + 1 )][$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_HEADER, 0);
    curl_setopt ($c [$thread_no], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($c [$thread_no], CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt ($c [$thread_no], CURLOPT_TIMEOUT, 10);
    curl_setopt ($c [$thread_no], CURLOPT_PROXY, trim ($proxies [$thread_no]));
    curl_setopt ($c [$thread_no], CURLOPT_PROXYTYPE, 0);
    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 - чекает на ура
 
Для просмотра ссылки Войди или Зарегистрируйся

спасибо за парсер с чекером, но этот чекер не пойдёт тут нет определение типа прокси, а мне это очень нужно, так как паршу(во слово:) ) я прокси с разных ресурсов. Не всегда бывает, что если заявлено, что проси SOCKS5 то они такими и будут, бывает что в листах с соксами проскакивают НТТР
 
А прокси на самом деле SOCKS то функция curl_exec() выдаёт true, а веренее она выводит вот такую строку: [‘|яяяя.

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