You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CURL请求中实现多CURLOPT_USERAGENT失败自动切换?

多User-Agent自动切换的CURL请求实现

没问题,我帮你把代码改成支持多用户代理自动切换的版本。核心思路是维护一个用户代理列表,当某个UA请求失败(比如验证不通过、返回错误状态码)时,自动尝试下一个UA,直到请求成功或者所有UA都尝试完毕。

下面是修改后的完整代码:

function file_get_contents_curl($url) {
    // 定义你的多用户代理列表,可以根据需求添加更多真实浏览器UA
    $userAgents = [
        'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/2008073000 Shredder/3.0a2pre ThunderBrowse/3.2.1.8',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0'
    ];

    $ch = curl_init();
    // 设置通用CURL选项(无需每次切换UA重复设置)
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 整体请求超时时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 生产环境建议开启SSL验证

    foreach ($userAgents as $ua) {
        // 切换当前用户代理
        curl_setopt($ch, CURLOPT_USERAGENT, $ua);
        
        $html = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        // 验证请求是否成功:curl执行无错误,且返回正常HTTP状态码
        if ($html !== false && in_array($httpCode, [200, 302])) {
            curl_close($ch);
            return $html;
        }

        // 可选:记录失败日志,方便调试
        error_log("UA '$ua' 请求失败,状态码: $httpCode,错误信息: " . curl_error($ch));
    }

    // 所有UA尝试失败,关闭资源并返回结果
    curl_close($ch);
    error_log("所有User-Agent请求均失败");
    return false;
}

关键细节说明:

  • UA列表扩展:你可以继续添加更多主流浏览器的UA字符串,尽量贴近真实用户的访问环境,降低被拦截的概率。
  • 成功判断逻辑:这里允许200(正常返回)和302(跳转)两种状态码,你可以根据目标网站的验证规则调整判断条件。
  • 超时与安全设置:添加了超时限制避免请求挂起,同时默认开启SSL验证,保障请求安全性。
  • 错误调试:失败时记录详细日志,方便你排查是UA被拦截还是网络问题导致的失败。

使用方式和原函数一致,直接调用file_get_contents_curl($targetUrl)即可。

内容的提问来源于stack exchange,提问作者Hubert Furka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:43:57