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

PHP中cURL调用OneDrive Personal API连接被拒问题求助

问题

近几周无法在PHP中通过cURL访问OneDrive Personal API,但相同URL在浏览器中可正常访问。示例API URL:https://api.onedrive.com/v1.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL2YvcyFBaEEwRHgzcmxhUTRwWnB6N0h6RkZvQkxmR1Ywb1E=/root?expand=children

此前正常使用的cURL代码:

function url_get_contents($url, $debug = false, $headers = false, $post = false) {

    $follow_redirects = true;

    $cookiefile = './cookie.txt';
    $cookiejar = './cookiejar.txt';

    $useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';

    // initialise the CURL library
    $ch = curl_init();

    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: fr,en-us,en;q=0.5";
    $header[] = "Pragma: "; //browsers keep this blank. 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);

    // specify the URL to be retrieved
    
    if ($post) {
        $args = substr($url, strpos($url, '?') + 1);
        $url = substr($url, 0, strpos($url, '?'));
        $fields = explode('&', $args);
        curl_setopt($ch, CURLOPT_POST, count($fields));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
    }
    curl_setopt($ch, CURLOPT_URL, $url);

    // we want to get the contents of the URL and store it in a variable
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // specify the useragent: this is a required courtesy to site owners
    curl_setopt($ch, CURLOPT_USERAGENT, random_user_agent());
    // ignore SSL errors
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/bot.html');
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);

    curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);



    // return headers as requested
    if ($headers == true) {
        curl_setopt($ch, CURLOPT_HEADER, 1);
    }

    // only return headers
    if ($headers == 'headers only') {
        curl_setopt($ch, CURLOPT_NOBODY, 1);
    }

    // follow redirects - note this is disabled by default in most PHP installs from 4.4.4 up
    if ($follow_redirects == true) {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    }

    $content = curl_exec($ch);


    $hex = bin2hex($content);
    if (substr($hex, 0, 6) == '1f8b08') //GZip
        $content = gzdecode($content);


    // if debugging, return an array with CURL's debug info and the URL contents
    $info = curl_getinfo($ch);

    if ($debug == true) {
        $result['contents'] = $content;
        $result['info'] = $info;
        $result['info']['error'] = curl_error($ch);

        if (!$info['http_code'])
            $result['contents'] = fgc($url, $header);
    }



    // otherwise just return the contents as a variable
    else {
        $result = $content;

        if (!$info['http_code'])
            $result = fgc($url, $header);
    }


    // free resources
    curl_close($ch);
    
    @unlink($cookiejar);

    // send back the data
    return $result;
}

调试模式下错误信息:Failed to connect to api.onedrive.com port 443: Connection refused

解决思路

  • 检查服务器网络连通性
    直接在服务器命令行测试基础连接,确认是代码问题还是网络限制:

    curl -v https://api.onedrive.com/v1.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL2YvcyFBaEEwRHgzcmxhUTRwWnB6N0h6RkZvQkxmR1Ywb1E=/root?expand=children
    

    或测试端口连通性:

    telnet api.onedrive.com 443
    

    如果命令行也无法连接,说明服务器防火墙、安全组或运营商拦截了443端口,需联系管理员排查。

  • 强制指定TLS版本
    OneDrive API要求使用TLS 1.2及以上版本,部分旧版cURL默认可能不支持。在代码中添加:

    curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
    

    同时建议启用SSL证书验证(长期禁用有安全风险),可指定CA证书路径:

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
    
  • 修正User-Agent配置
    代码中定义了$useragent但实际调用random_user_agent(),该函数返回的UA可能被OneDrive识别为异常请求。替换为现代浏览器UA:

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
    
  • 简化请求头与异常配置
    代码中包含的Keep-Alive、旧版浏览器头以及谷歌机器人Referer可能触发反爬机制,简化请求头并移除异常配置:

    $header = [
        "Accept: application/json, text/plain, */*",
        "Accept-Language: en-US,en;q=0.5"
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    // 移除谷歌机器人Referer
    // curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com/bot.html');
    
  • 验证API链接权限
    即使浏览器能访问,也可能是共享链接权限过期或OneDrive共享策略变更。重新生成共享链接,确认链接的访问权限设置为“任何人可查看”,同时检查是否需要OAuth认证(部分场景下共享链接也需身份验证)。


内容的提问来源于stack exchange,提问作者Aurelien Stride

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:25:04