« # »

Función de descarga mediante PHP anonimamente con proxys automáticos

Por fin algo de código :)

He desarrollado una función que descarga una URL mediante un proxy con PHP y cURL. Lo bueno (y a la vez lo malo) de la función, es que descarga un listado de IPs (las IPs de los proxys y sus puertos) de una página y va realizando peticiones proxy a proxy hasta que da con uno que funcione, lo malo vendría por la lentitud de la ejecución de la misma, por lo que está pensada para utilizar con CRONJOBS o scripts que no requieran de velocidad de ejecución. Se podría añadir una caché para los proxys de forma que los vaya utilizando hasta que no quede ninguno con vida, pero eso ya sería complicar un poco más la historia y ahora mismo no tengo tiempo para ello.

PHP:
  1. function curl_proxy($url,$proxys){
  2.     $index_proxy = 0;
  3.     $end = false;
  4.     do{
  5.         $proxy = $proxys[$index_proxy];
  6.        
  7.         $ip = $proxy[0];
  8.         $port = $proxy[1];
  9.        
  10.     //  echo "Try: $ip : $port <br>\n";
  11.        
  12.         $ch = curl_init();
  13.         curl_setopt($ch, CURLOPT_URL,$url);
  14.         curl_setopt($ch, CURLOPT_HEADER, TRUE);
  15.        
  16.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  17.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
  18.         curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
  19.         curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
  20.         curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  21.        
  22.         curl_setopt($ch, CURLOPT_PROXY, "http://$ip:$port");
  23.        
  24.         $info = curl_exec($ch);
  25.         curl_close($ch);
  26.  
  27.         if($index_proxy>=count($proxys)){
  28.             $end = true;
  29.         }
  30.         $index_proxy++;
  31.     }while($info === false || $end === true);
  32.  
  33.     return explode("\r\n\r\n",$info);
  34. }
  35. function obte_llistat_proxys(){
  36.     $proxys = file_get_contents('http://www.samair.ru/proxy/time-01.htm');
  37.     preg_match_all('%<td>([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}):(\d*?)</td><td>(.*?)</td>%s', $proxys, $result, PREG_PATTERN_ORDER);
  38.     $ps = $result[0];
  39.     $ip = $result[1];
  40.     $po = $result[2];
  41.     $ti = $result[3];
  42.    
  43.     $t = count($ps);
  44.    
  45.     $sortida = array();
  46.     for($i=0;$i<$t;$i++){
  47.         $sortida[] = array($ip[$i],$po[$i],$ti[$i]);
  48.     }
  49.     return $sortida;
  50. }
  51.  
  52. print_r(curl_proxy('http://004.es/test/contador.php',obte_llistat_proxys()));

Ah si, he utilizado DOS funciones en lugar de una, la que te devuelve el listado de IPs y la que hace la petición cURL usando el listado de IPs y puertos devueltos por la otra función.

Espero que le vaya bien a alguien. Saludos peñita!

Comentarios

Deja un comentario

(*: Datos necesarios para dejar un comentario)

Get Adobe Flash playerPlugin by wpburn.com wordpress themes