Как использовать 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);
?>

Ниже приведено сообщение от curl через прокси, которое не возвращает контент.

<?

$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;
?> 
user586011
источник
3
В строке 12 отсутствует точка с запятой
Pekka
Кроме того, вам нужно изменить $ url = '$ _POST [1]' на $ url = $ _POST [1] - в противном случае $ url будет строкой вместо
нужного
Кроме того , ключ в массиве $ _POST это строка не является целым числом , так что вы бы хотели сказать$_POST['1']
fiiv
2
В форме на сайте pelican-cement.com есть поля с именами «имя» и «Фамилия», но ни один из них не имеет имени «1».
Джон Флэтнесс
2
@ user586011: Добавьте свое решение в качестве ответа ниже и примите его. Не ставьте решение в вопросе, это не работает.
hakre

Ответы:

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_RETURNTRANSFERзначение 1, чтобы данные возвращались в $curl_scraped_pageпеременную.

Я удалил второй лишний, curl_exec($ch);который останавливал возвращение переменной. Я объединил ваш IP-адрес и порт прокси в одну настройку.

Я тоже удалил CURLOPT_HTTPPROXYTUNNELи так CURLOPT_CUSTOMREQUESTкак это было по умолчанию.

Если вы не хотите, чтобы заголовки возвращались, закомментируйте CURLOPT_HEADER.

Чтобы отключить прокси, просто установите для него значение null.

curl_setopt($ch, CURLOPT_PROXY, null);

Не стесняйтесь задавать любые вопросы, я работаю cURLкаждый день.

GravyCode
источник
приятно знать, что вы работаете с CURL каждый день. Я попытался установить прокси-сервер socks, и он работает на моем локальном компьютере, но не работает на моем выделенном сервере Linux. Любая идея ?
coding_idiot
@coding_idiot Большинство веб-хостов блокируют порты, отличные от 80 или 443, по соображениям безопасности.
sousdev
Но я уже решил это. Я уверен, что это принесет пользу другим.
coding_idiot
@GravyCode: если мы получим прокси от некоторых служб, в этом случае мне нужно будет передавать имя пользователя / пароль?
Pragnesh Chauhan
1
Как мне узнать, заблокирован ли порт прокси веб-хостом?
user1788736
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
Эти комментарии полезны, но другие должны отметить, что дополнительные параметры на самом деле не требуются .
Nate
-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;
}
hammad1238
источник
1
Мне это помогло: curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); // false для https
villamejia
1
@villamejia Остерегайтесь использования CURLOPT_SSL_VERIFYPEER = false. Это означает, что cURL не будет выполнять никаких проверок сертификатов при подключении к https-серверу, что делает соединение уязвимым для возможной атаки типа «злоумышленник в середине», поэтому безопасность данных больше не гарантируется. Лучше использовать CURLOPT_CAPATH, чтобы предоставить каталог, содержащий набор действительных корневых центров сертификации (например, /etc/ssl/certsв Debian / Ubuntu)
Ale