Come usare CURL tramite un proxy?


128

Sto cercando di impostare curl per utilizzare un server proxy. L'URL è fornito da un modulo HTML, che non è stato un problema. Senza il proxy funziona benissimo. Ho trovato codice su questo e altri siti, ma non funzionano. Qualsiasi aiuto nella ricerca della soluzione corretta sarebbe molto apprezzato. Sento che il muggito è vicino, ma che mi manca qualcosa. Grazie.

Il codice qui sotto che ho adattato da qui http://www.webmasterworld.com/forum88/10572.htm ma restituisce un messaggio di errore su un T_VARIABLE mancante sulla riga 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);
?>

Il muggito proviene dal ricciolo attraverso il proxy non restituisce alcun contenuto

<?

$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;
?>

è attualmente in diretta su pelican-cement.com ma non funziona.

AGGIORNAMENTO: Grazie per tutto il tuo aiuto, ho apportato le modifiche di cui sopra. Ora restituisce solo una schermata vuota.

<?

$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
Manca un punto e virgola sulla linea 12
Pekka,

inoltre, è necessario modificare $ url = '$ _POST [1]' in $ url = $ _POST [1] - altrimenti $ url sarà una stringa anziché l'URL desiderato
yoavmatchulsky

Inoltre, la chiave nell'array $ _POST è una stringa e non un numero intero, quindi vorresti che lo dicesse$_POST['1']
fiiv

2
Il modulo su pelican-cement.com ha input chiamati "firstname" e "lastname", ma nessuno chiamato "1".
John Flatness

2
@ user586011: aggiungi la soluzione come risposta di seguito e accettala. Non mettere la soluzione nella domanda, che non funziona bene.
Hakre,

Risposte:


221

Ecco una versione funzionante con i tuoi bug rimossi.

$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;

Ho aggiunto CURLOPT_PROXYUSERPWDnel caso in cui uno dei tuoi proxy richieda un nome utente e una password. Ho impostato CURLOPT_RETURNTRANSFERsu 1, in modo che i dati vengano restituiti alla $curl_scraped_pagevariabile.

Ho rimosso un secondo extra curl_exec($ch);che impedirebbe la restituzione della variabile. Ho consolidato il tuo IP proxy e la tua porta in un'unica impostazione.

Ho anche rimosso CURLOPT_HTTPPROXYTUNNELe CURLOPT_CUSTOMREQUESTcome era l'impostazione predefinita.

Se non desideri che vengano restituite le intestazioni, commenta CURLOPT_HEADER.

Per disabilitare il proxy è sufficiente impostarlo su null.

curl_setopt($ch, CURLOPT_PROXY, null);

Per qualsiasi domanda sentiti libero di fare, lavoro cURLogni giorno.


bello sapere che lavori tutti i giorni con CURL. Ho provato a impostare un proxy socks e funziona sul mio computer locale ma non funziona sul mio server dedicato Linux. Qualche idea ?
coding_idiot

@coding_idiot La maggior parte degli host web blocca le porte che non sono 80 o 443 per motivi di sicurezza.
sousdev,

L'ho già risolto però. Sono sicuro che altri ne trarranno beneficio.
coding_idiot,

@GravyCode: se riceviamo proxy da alcuni servizi in quel caso, devo passare username / password?
Pragnesh Chauhan,

1
Come dovrei sapere se la porta proxy è bloccata dal webhost?
user1788736

35

Ho spiegato l'uso di varie opzioni CURL richieste per 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
Questi commenti sono utili, ma altri dovrebbero notare che le opzioni aggiuntive non sono effettivamente richieste .
Nate

-1

Ecco una funzione ben collaudata che ho usato per i miei progetti con commenti autoesplicativi dettagliati


Ci sono molte volte in cui le porte diverse da 80 sono bloccate dal firewall del server, quindi il codice sembra funzionare correttamente su localhost ma non sul server

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
Questo mi ha aiutato: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // false per https
villamejia il

1
@villamejia Attenzione, però, nell'uso di CURLOPT_SSL_VERIFYPEER = false. Ciò significa che cURL non eseguirà alcun controllo del certificato durante la connessione al server https, rendendo così la connessione vulnerabile a un possibile attacco man-in-the-middle - pertanto la sicurezza dei dati non è più garantita. Meglio usare CURLOPT_CAPATH per dare una directory contenente una serie di autorità di certificazione radice valide ( /etc/ssl/certssu Debian / Ubuntu, ad esempio)
Ale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.