Як користуватися CURL через проксі?


128

Я хочу встановити curl для використання проксі-сервера. URL надається у форматі html, що не було проблемою. Без проксі добре працює. Я знайшов код на цьому та інших сайтах, але вони не працюють. Будь-яка допомога у пошуку правильного рішення буде дуже вдячна. Я відчуваю, що внизу поруч, але мені щось не вистачає. Спасибі.

Нижній код я адаптував звідси http://www.webmasterworld.com/forum88/10572.htm, але він повертає повідомлення про помилку про відсутній T_VARIABLE у рядку 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);
?>

Нижче від згортання через проксі, не повертається вміст

<?

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

наразі живе на pelican-cement.com, але також не працює.

ОНОВЛЕННЯ: Дякую за всю вашу допомогу, я внесла зазначені вище зміни. Тепер він повертає лише порожній екран.

<?

$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
Ви пропускаєте крапку з комою на лінії 12
Pekka

також вам потрібно змінити $ url = '$ _POST [1]' на $ url = $ _POST [1] - інакше $ url буде рядком замість потрібної URL-адреси
yoavmatchulsky

Також ключем у масиві $ _POST є рядок, не ціле число, тому ви хочете, щоб він сказав$_POST['1']
fiiv

2
Форма на pelican-cement.com містить входи з назвою "ім'я" та "прізвище", але жодна з назвами "1".
Джон Плоскість

2
@ user586011: Будь ласка, додайте своє рішення як відповідь нижче та прийміть його. Не ставте рішення в питанні, це не добре працює.
хакре

Відповіді:


221

Ось робоча версія з видаленими вадами помилок.

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

Я додав, CURLOPT_PROXYUSERPWDякщо будь-який із ваших проксі-серверів вимагає імені користувача та пароля. Я встановив CURLOPT_RETURNTRANSFER1, так що дані будуть повернуті до $curl_scraped_pageзмінної.

Я видалив другу зайву, curl_exec($ch);яка зупинила б повернення змінної. Я об'єднав ваш проксі-IP і порт в одне налаштування.

Я також видалив CURLOPT_HTTPPROXYTUNNELі CURLOPT_CUSTOMREQUESTяк це було за замовчуванням.

Якщо ви не хочете, щоб заголовки повернулися, коментуйте їх CURLOPT_HEADER.

Для відключення проксі просто встановіть його на нуль.

curl_setopt($ch, CURLOPT_PROXY, null);

Будь-які запитання сміливо задавайте, з якими я працюю cURLщодня.


приємно знати, що ти працюєш із CURL щодня. Я спробував встановити проксі-носок, і він працює на моїй локальній машині, але не працює на моєму спеціальному сервері для Linux. Будь-яка ідея?
coding_idiot

@coding_idiot Більшість хостів веб-сайтів блокують порти, яким немає 80 або 443 з міркувань безпеки.
sousdev

Я вже це вирішив. Я впевнений, що від цього виграють інші.
coding_idiot

@GravyCode: якщо ми отримуємо проксі від деяких служб у такому випадку, чи потрібно мені пройти ім'я користувача / пароль?
Прагнеш Чаухан

1
Як я повинен знати, чи проксі-порт заблокований веб-хостом?
користувач1788736

35

Я пояснив використання різних варіантів CURL, необхідних для 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
Ці коментарі корисні, але інші повинні відзначити, що додаткові варіанти насправді не потрібні .
Нейт

-1

Ось добре перевірена функція, яку я використовував для своїх проектів з детальними поясненнями, що пояснюються самостійно


Існує багато разів, коли порти, крім 80, блокуються брандмауером сервера, тому код, здається, працює нормально на localhost, але не на сервері

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
Це допомогло мені: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
villamejia

1
@villamejia Обережно, використовуючи CURLOPT_SSL_VERIFYPEER = false. Це означає, що CURL не буде перевіряти сертифікати під час підключення до https-сервера, таким чином робить з'єднання вразливим до можливої ​​атаки "посередник" - тому безпека даних вже не гарантується. Краще скористайтеся CURLOPT_CAPATH, щоб дати каталог, що містить набір дійсних кореневих сертифікаційних органів (наприклад, /etc/ssl/certsна Debian / Ubuntu)
Але,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.