如何将 SOCKS 5 代理与 cURL 一起使用?

Posted

技术标签:

【中文标题】如何将 SOCKS 5 代理与 cURL 一起使用?【英文标题】:How to use a SOCKS 5 proxy with cURL? 【发布时间】:2012-11-06 20:09:32 【问题描述】:

普通代理(例如:72.41.132.22:3128)适用于 cURL,但是当我使用带有用户名/密码的 SOCKS 5 代理时,它只会在页面上给我“[1”。

有没有办法通过 cURL 使用 SOCKY 5 代理?

$proxy = "cagsan:jw22wdw@108.61.25.223:34792";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 1);
$curl_scraped_page = curl_exec($ch);
curl_close($ch);

【问题讨论】:

【参考方案1】:

您需要告诉 cURL 代理是 SOCKS5 代理,否则 cURL 会假定它是 HTTP 代理:

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

来自docs:

CURLOPT_PROXYTYPE

CURLPROXY_HTTP(默认)或 CURLPROXY_SOCKS5。

【讨论】:

正如@Gido 提到的,您可以跳过此参数并使用带有前缀socks5://CURLOPT_PROXY,一切顺利。 docs【参考方案2】:

从 cURL 7.21.7 开始,您可以使用 CURLOPT_PROXY 并指定 SOCKS 协议:

curl_setopt($ch, CURLOPT_PROXY, 'socks5://bob:marley@localhost:12345');

更多信息在libcurl documentation。

【讨论】:

【参考方案3】:

对于那些希望通过主机名(本地主机?)进行连接的用户,并且它不适用于 CURLPROXY_SOCKS5,您可以尝试使用 CURLPROXY_SOCKS5_HOSTNAME

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

在一些较早的 php 版本中,您必须这样做:

curl_setopt($ch, CURLOPT_PROXYTYPE, 7);

【讨论】:

curl.haxx.se/libcurl/c/CURLOPT_PROXY.html - CURLPROXY_SOCKS5_HOSTNAME 表示主机名解析应该由 socks 服务器执行。 我的 PHP 版本 PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )curl_setopt($ch, CURLOPT_PROXYTYPE, 7); 对我有用,谢谢

以上是关于如何将 SOCKS 5 代理与 cURL 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 urllib2 与 SOCKS 代理一起使用

使用 PHP 时使用 socks5 代理的 cURL 请求失败,但它通过命令行工作

JSch 是不是支持 SOCKS5 代理?

删除 SOCKS 4/5 代理

如何找到代理是 Http 或 Socks

使用带有 git 的 socks 代理进行 http 传输