¿Cómo usar CURL a través de un proxy?


128

Estoy buscando configurar curl para usar un servidor proxy. La url es proporcionada por un formulario html, que no ha sido un problema. Sin el proxy funciona bien. He encontrado código en este y otros sitios, pero no funcionan. Cualquier ayuda para encontrar la solución correcta sería muy apreciada. Siento que los bramidos están cerca, pero que me falta algo. Gracias.

El siguiente código que adapté desde aquí http://www.webmasterworld.com/forum88/10572.htm pero devuelve un mensaje de error acerca de una T_VARIABLE faltante en la línea 12.

<?

$url = '$_POST[1]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1)
curl_exec ($ch); 
$curl_info = curl_getinfo($ch);
curl_close($ch);
echo '<br />';
print_r($curl_info);
?>

El siguiente es de curl a través de proxy no devuelve contenido

<?

$proxy = "66.96.200.39:80";
$proxy = explode(':', $proxy);
$url = "$_POST[1]";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;
?>

actualmente está en vivo en pelican-cement.com pero tampoco funciona.

ACTUALIZACIÓN: Gracias por toda su ayuda, hice los cambios anteriores. Ahora solo devuelve una pantalla en blanco.

<?

$url = $_POST['1'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($ch, CURLOPT_PROXY, '66.96.200.39:80');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_exec ($ch); 
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;
?> 

3
Te falta un punto y coma en la línea 12
Pekka

También, es necesario cambiar $ url = '$ _POST [1]' a $ url = $ _POST [1] - de lo contrario, $ url será una cadena en lugar de la URL que desea
yoavmatchulsky

Además, la clave en la matriz $ _POST es una cadena, no un número entero, por lo que querrá que diga$_POST['1']
fiiv

2
El formulario en pelican-cement.com tiene entradas llamadas "nombre" y "apellido", pero ninguna llamada "1".
John Flatness

2
@ user586011: Agregue su solución como respuesta a continuación y acéptela. No ponga la solución en la pregunta, eso no funciona bien.
hakre

Respuestas:


221

Aquí hay una versión que funciona con sus errores eliminados.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
//$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

He agregado CURLOPT_PROXYUSERPWDen caso de que cualquiera de sus servidores proxy requiera un nombre de usuario y contraseña. Lo configuré CURLOPT_RETURNTRANSFERen 1, para que los datos vuelvan a la $curl_scraped_pagevariable.

Eliminé un segundo extra curl_exec($ch);que detendría la devolución de la variable. Consolidé su proxy IP y puerto en una configuración.

También eliminé CURLOPT_HTTPPROXYTUNNELy CURLOPT_CUSTOMREQUESTcomo era el predeterminado.

Si no desea que se devuelvan los encabezados, comente CURLOPT_HEADER.

Para deshabilitar el proxy, simplemente configúrelo como nulo.

curl_setopt($ch, CURLOPT_PROXY, null);

Cualquier pregunta no dude en preguntar, trabajo con cURLtodos los días.


Es bueno saber que trabajas con CURL todos los días. Intenté configurar un proxy de calcetines y funciona en mi máquina local, pero no funciona en mi servidor dedicado de Linux. Alguna idea ?
coding_idiot

@coding_idiot La mayoría de los servidores web bloquean los puertos que no son 80 o 443 por razones de seguridad.
sousdev

Aunque ya lo resolví. Estoy seguro de que otros se beneficiarán de esto.
coding_idiot

@GravyCode: si obtenemos proxy de algunos servicios en ese caso, ¿debo pasar el nombre de usuario / contraseña?
Pragnesh Chauhan

1
¿Cómo debo saber si el servidor proxy bloquea el puerto proxy?
user1788736

35

He explicado el uso de varias opciones de CURL requeridas para CURL PROXY.

$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888';
$proxyauth = 'user:password';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);         // URL for CURL call
curl_setopt($ch, CURLOPT_PROXY, $proxy);     // PROXY details with port
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);   // Use if proxy have username and password
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // If expected to call with specific PROXY type
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  // If url has redirects then go to the final redirected URL.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  // Do not outputting it out directly on screen.
curl_setopt($ch, CURLOPT_HEADER, 1);   // If you want Header information of response else make 0
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

echo $curl_scraped_page;

3
Estos comentarios son útiles, pero otros deben tener en cuenta que las opciones adicionales no son realmente necesarias .
Nate

-1

Aquí hay una función bien probada que utilicé para mis proyectos con comentarios explicativos detallados


Hay muchas ocasiones en que los puertos que no sean 80 están bloqueados por el firewall del servidor, por lo que el código parece funcionar bien en localhost pero no en el servidor

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}

1
Esto me ayudó: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // falso para https
villamejia

1
@villamejia Tenga cuidado, sin embargo, al usar CURLOPT_SSL_VERIFYPEER = false. Esto significa que cURL no realizará ninguna verificación de certificado cuando se conecte al servidor https, lo que hace que la conexión sea vulnerable a un posible ataque de intermediario, por lo tanto, la seguridad de los datos ya no está garantizada. Mejor use CURLOPT_CAPATH para dar un directorio que contenga un conjunto de autoridades de certificación raíz válidas ( /etc/ssl/certsen Debian / Ubuntu, por ejemplo)
Ale
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.