Jak używać CURL przez proxy?

128

Chcę ustawić curl, aby używać serwera proxy. Adres URL jest dostarczany przez formularz html, co nie stanowiło problemu. Bez proxy działa dobrze. Znalazłem kod na tej i innych stronach, ale nie działają. Każda pomoc w znalezieniu właściwego rozwiązania byłaby bardzo mile widziana. Czuję, że poniżej są blisko, ale czegoś mi brakuje. Dziękuję Ci.

Poniższy kod zaadaptowałem stąd http://www.webmasterworld.com/forum88/10572.htm, ale zwraca komunikat o błędzie o brakującej T_VARIABLE w linii 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);
?>

Poniższy wykres od curl do proxy nie zwraca żadnej treści

<?

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

jest obecnie na żywo na pelican-cement.com, ale też nie działa.

AKTUALIZACJA: Dziękuję za wszelką pomoc, dokonałem powyższych zmian. Teraz zwraca tylko pusty ekran.

<?

$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;
?> 
user586011
źródło
3
Brakuje średnika w linii 12
Pekka
musisz również zmienić $ url = '$ _POST [1]' na $ url = $ _POST [1] - w przeciwnym razie $ url będzie ciągiem znaków zamiast
żądanego
Ponadto klucz w tablicy $ _POST jest ciągiem znaków, a nie liczbą całkowitą, więc chciałbyś, aby to powiedział$_POST['1']
fiiv
2
Formularz na pelican-cement.com zawiera dane wejściowe o nazwach „imię” i „nazwisko”, ale żadne z nich nie ma nazwy „1”.
John Flatness,
2
@ user586011: Dodaj swoje rozwiązanie jako odpowiedź poniżej i zaakceptuj je. Nie stawiaj rozwiązania pytania, to nie działa dobrze.
hakre

Odpowiedzi:

222

Oto działająca wersja z usuniętymi błędami.

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

Dodałem CURLOPT_PROXYUSERPWDna wypadek, gdyby któryś z twoich serwerów proxy wymagał nazwy użytkownika i hasła. Ustawiam CURLOPT_RETURNTRANSFER1, aby dane wróciły do $curl_scraped_pagezmiennej.

Usunąłem drugi dodatek, curl_exec($ch);który zatrzymywałby zwracanie zmiennej. Skonsolidowałem Twój adres IP serwera proxy i port w jednym ustawieniu.

Usunąłem też CURLOPT_HTTPPROXYTUNNELi CURLOPT_CUSTOMREQUESTjak to było domyślne.

Jeśli nie chcesz, aby nagłówki zostały zwrócone, skomentuj CURLOPT_HEADER.

Aby wyłączyć serwer proxy, po prostu ustaw go na null.

curl_setopt($ch, CURLOPT_PROXY, null);

Wszelkie pytania zapraszam do zadawania, pracuję na cURLco dzień.

GravyCode
źródło
miło wiedzieć, że codziennie pracujesz z CURL. Próbowałem ustawić proxy socks i działa na moim komputerze lokalnym, ale nie działa na moim serwerze dedykowanym linux. Dowolny pomysł ?
coding_idiot
@coding_idiot Większość hostów internetowych blokuje porty inne niż 80 lub 443 ze względów bezpieczeństwa.
sousdev
Jednak już to rozwiązałem. Jestem pewien, że inni na tym skorzystają.
coding_idiot,
@GravyCode: jeśli otrzymamy proxy z niektórych usług, czy w takim przypadku muszę podać nazwę użytkownika / hasło?
Pragnesh Chauhan
1
Skąd mam wiedzieć, czy port proxy jest blokowany przez hosta?
user1788736
35

Wyjaśniłem użycie różnych opcji CURL wymaganych dla 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;
Somnath Muluk
źródło
3
Te komentarze są pomocne, ale inni powinni zauważyć, że dodatkowe opcje nie są w rzeczywistości wymagane .
Nate
-2

Oto dobrze przetestowana funkcja, której użyłem w moich projektach, ze szczegółowymi komentarzami, które nie wymagają wyjaśnienia


Wiele razy porty inne niż 80 są blokowane przez zaporę serwera, więc kod wydaje się działać poprawnie na hoście lokalnym, ale nie na serwerze

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;
}
hammad1238
źródło
1
Pomogło mi to: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // false dla https
villamejia
1
@villamejia Uważaj jednak, używając CURLOPT_SSL_VERIFYPEER = false. Oznacza to, że cURL nie sprawdzi żadnego certyfikatu podczas łączenia się z serwerem https, przez co połączenie będzie podatne na ewentualny atak typu man-in-the-middle - dlatego bezpieczeństwo danych nie jest już gwarantowane. Lepiej użyj CURLOPT_CAPATH, aby podać katalog zawierający zestaw ważnych głównych urzędów certyfikacji ( /etc/ssl/certsna przykład w systemie Debian / Ubuntu)
Ale