如何通过代理使用CURL?


128

我希望将curl设置为使用代理服务器。网址由html表单提供,这不是问题。没有代理,它可以正常工作。我在此站点和其他站点上找到了代码,但是它们不起作用。在寻找正确解决方案方面的任何帮助将不胜感激。我觉得风箱近在咫尺,但我缺少一些东西。谢谢。

我从此处改编的波纹管代码http://www.webmasterworld.com/forum88/10572.htm,但它在第12行返回有关缺少T_VARIABLE的错误消息。

<?

$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['1']
POST

2
pelican-cement.com上的表单具有名为“ firstname”和“ lastname”的输入,但没有一个名为“ 1”的输入。
John Flatness

2
@ user586011:请在下面添加您的解决方案作为答案并接受。请勿将解决方案放入问题中,否则效果不佳。
hakre 2012年

Answers:


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_HTTPPROXYTUNNELCURLOPT_CUSTOMREQUEST因为它是默认设置。

如果您不希望返回标题,请注释掉CURLOPT_HEADER

要禁用代理,只需将其设置为null。

curl_setopt($ch, CURLOPT_PROXY, null);

如有任何疑问,我cURL每天都在工作。


很高兴知道您每天都在使用CURL。我尝试设置一个袜子代理,它可以在我的本地计算机上运行,​​但不能在我的Linux专用服务器上运行。任何想法 ?
2013年

@coding_idiot出于安全原因,大多数Web主机都会阻止端口不是80或443。
sousdev

我已经解决了。我确信其他人将从中受益。
2013年

@GravyCode:如果在这种情况下我们从某些服务获得代理,我是否需要传递用户名/密码?
Pragnesh肖汉

1
我怎么知道代理端口是否被webhost阻止了?
user1788736

35

我已经解释了CURL PROXY所需的各种CURL选项的用法。

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

1
这对我有帮助:curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false); //对于https为false
villamejia

1
@villamejia请注意,但是使用CURLOPT_SSL_VERIFYPEER = false。这意味着cURL在连接到https服务器时不会进行任何证书检查,从而使该连接容易受到中间人的攻击-因此,不再保证数据安全性。最好使用CURLOPT_CAPATH来提供包含一组有效的根证书颁发机构的目录(/etc/ssl/certs例如,在Debian / Ubuntu上)
Ale
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.