You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP libcurl连接Socks5代理认证失败问题求助

解决PHP 5.4 + cURL 7.19 SOCKS5代理认证失败问题

首先,问题的核心在于你使用的cURL 7.19版本过于老旧——这个版本对SOCKS5代理的用户名密码认证支持存在缺陷,而PowerShell中调用的cURL应该是较新的版本,所以能正常工作。以下是针对你的代码的具体修复方案:

方案1:显式指定代理认证方式并调整代理类型

老版本cURL可能不会自动检测SOCKS5的认证方式,需要手动指定;同时改用CURLPROXY_SOCKS5_HOSTNAME(部分老版本中该选项对认证的兼容性更好):

$proxy = '<hostname>:<port>';
$proxy_auth = '<username>:<password>';
$url = 'https://api.telegram.org/bot<botID>/sendMessage?'.'chat_id='.$chat_id.'&parse_mode='.$parse_mode.'&text='.'test';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 改用SOCKS5_HOSTNAME类型
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_auth);
// 显式指定基础认证方式
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, true);

$curl_scraped_page = curl_exec($ch);
$error = curl_error($ch);
echo $error;
echo $curl_scraped_page;
curl_close($ch);

方案2:直接在代理地址中嵌入认证信息

部分老版本cURL不支持单独设置CURLOPT_PROXYUSERPWD,可以尝试把用户名密码直接拼到代理URL里:

// 把认证信息嵌入代理地址
$proxy = 'socks5://<username>:<password>@<hostname>:<port>';
$url = 'https://api.telegram.org/bot<botID>/sendMessage?'.'chat_id='.$chat_id.'&parse_mode='.$parse_mode.'&text='.'test';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
// 不需要再设置CURLOPT_PROXYUSERPWD
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, true);

$curl_scraped_page = curl_exec($ch);
$error = curl_error($ch);
echo $error;
echo $curl_scraped_page;
curl_close($ch);

方案3:升级cURL或PHP版本(推荐)

cURL 7.19是2009年的版本,存在大量已知的兼容性和安全性问题。如果条件允许,建议升级PHP到5.6+(至少),同时配套升级cURL到7.40以上版本,这样能从根本上解决这类老版本的兼容性问题,也能获得更好的安全性和功能支持。

额外排查点

  • 确认代理服务器是否支持SOCKS5明文认证:有些代理可能只支持GSSAPI等其他认证方式,而老版本cURL对这些方式的支持有限;
  • 检查用户名密码是否包含特殊字符(比如@:),如果有需要先进行URL编码(用urlencode()处理用户名和密码)。

内容的提问来源于stack exchange,提问作者Semyon Ustinov

火山引擎 最新活动