如何通过代理使用CURL?

回答 4 浏览 38.5万 2011-03-06

我想把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;
?> 
user586011 提问于2011-03-06
您在第12行中缺少一个分号Pekka 2011-03-06
另外,你需要将$url = '$_POST[1]'改为$url = $_POST[1] - 否则,$url将是一个字符串,而不是你想要的URL。yoavmatchulsky 2011-03-06
另外,$_POST数组中的键是一个字符串,而不是一个整数,所以你想让它显示为$_POST['1']fiiv 2011-03-06
pelican-cement.com上的表单有名为 "firstname "和 "lastname "的输入,但没有名为 "1 "的输入。John Flatness 2011-03-06
@user586011:请将你的解决方案作为答案添加到下面,并接受它。不要把解决方案放到问题中,这样做效果不好。hakre 2012-07-12
4 个回答
#1楼
得票数 239

这是一个已经删除了你的bug的工作版本。

$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一起工作。

GravyCode 提问于2012-02-12
Bud Damyanov 修改于2014-12-03
很高兴知道你每天都在用CURL工作。我试着设置了一个袜子代理,它在我的本地机器上工作,但在我的linux专用服务器上却不工作。有什么想法吗?coding_idiot 2013-01-31
@coding_idiot 大多数虚拟主机出于安全考虑,都会屏蔽80或443以外的端口。sousdev 2013-09-27
虽然我已经解决了这个问题。我相信其他人会从中受益。coding_idiot 2013-09-27
@GravyCode:如果我们从一些服务中获得代理,在这种情况下,我是否需要传递用户名/密码?Pragnesh Chauhan 2014-03-12
我怎样才能知道代理端口是否被网络主机封锁了呢?user1788736 2015-08-16
#2楼
得票数 40

我已经解释了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;
Somnath Muluk 提问于2015-12-07
这些评论很有帮助,但其他人应该注意,额外的选项实际上并不是必须的Nate 2016-03-04
#3楼
得票数 0
root@APPLICATIOSERVER:/var/www/html# php connectiontest.php
61e23468-949e-4103-8e08-9db09249e8s1 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 10.172.123.1:80 root@APPLICATIOSERVER:/var/www/html#

在php脚本文件中声明代理设置的问题已经得到了解决。

$proxy = '10.172.123.1:80';
curl_setopt($cSession, CURLOPT_PROXY, $proxy); // PROXY details with port
Namasivayam Chinnapillai 提问于2020-12-10
#4楼
得票数 -2

这是一个经过测试的函数,我在我的项目中使用了它,并有详细的自我解释说明。


有很多时候,80以外的端口被服务器防火墙阻挡,所以代码在本地主机上看起来工作正常,但在服务器上却不正常。

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 提问于2013-10-21
这对我有帮助: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https.villamejia 2016-12-22
@villamejia 不过要注意,使用CURLOPT_SSL_VERIFYPEER = false。这意味着cURL在连接到https服务器时不会做任何证书检查,从而使连接容易受到可能的中间人攻击--因此数据安全不再得到保证。最好使用CURLOPT_CAPATH来给出一个包含一系列有效的根认证机构的目录(例如,在Debian/Ubuntu上的/etc/ssl/certs)。Ale 2018-09-29