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;
?>
$_POST['1']
Odpowiedzi:
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_PROXYUSERPWD
na wypadek, gdyby któryś z twoich serwerów proxy wymagał nazwy użytkownika i hasła. UstawiamCURLOPT_RETURNTRANSFER
1, aby dane wróciły do$curl_scraped_page
zmiennej.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_HTTPPROXYTUNNEL
iCURLOPT_CUSTOMREQUEST
jak 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
cURL
co dzień.źródło
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;
źródło
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; }
źródło
/etc/ssl/certs
na przykład w systemie Debian / Ubuntu)