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

如何用WGET/CURL从OneDrive下载受保护文件至Unix服务器

解决OneDrive受保护文件的Unix服务器下载问题

嘿,我来帮你搞定这个用wget/curl下载受保护OneDrive文件的事儿!首先得掰扯清楚:wget的--password选项为啥没用——这个选项是给HTTP基本认证(Basic Auth)设计的,但OneDrive的密码保护/组织内访问都是基于网页会话或OAuth令牌的验证逻辑,完全不是一个路子,所以直接加这个参数肯定不管用。下面分两种保护场景给你具体方案:

场景1:密码保护的OneDrive共享链接

这种是你给共享链接设了密码,别人得输入密码才能访问。我们需要先通过curl提交密码获取会话cookie,再用这个cookie去下载文件:

  1. 第一步:获取验证后的会话cookie
    先找到密码验证页面的提交地址(可以用浏览器打开共享链接,打开开发者工具看Network标签,输入密码提交后查看POST请求的目标地址),然后用curl提交密码并保存cookie:

    # 替换成你的共享密码和验证页面URL
    curl -c onedrive_cookies.txt -d "password=你的共享密码" "https://onedrive.live.com/.../verify"
    

    要是不确定验证页面地址,也可以让curl自动跟踪重定向,直接访问共享链接并提交密码:

    curl -c onedrive_cookies.txt -L -d "password=你的共享密码" "https://onedrive.live.com/...你的共享链接"
    
  2. 第二步:用cookie下载目标文件
    拿到cookie后,不管用wget还是curl都能顺利下载了:

    • wget版本:
      wget --load-cookies onedrive_cookies.txt -O 你的文件名.xlsx "https://...&download=1"
      
    • curl版本:
      curl -b onedrive_cookies.txt -L -o 你的文件名.xlsx "https://...&download=1"
      

场景2:仅限公司内部人员访问的链接(组织权限)

这种是基于公司Azure AD身份验证的,只有公司账号能访问。需要借助Microsoft Graph API获取访问令牌,再带着令牌去下载文件:

前提准备

得先让公司IT帮你在Azure AD注册一个应用,拿到三个关键信息:租户ID客户端ID客户端密钥,还要给这个应用授权OneDrive文件的读取权限。

  1. 第一步:获取访问令牌
    用curl请求微软的令牌端点,拿到返回JSON里的access_token

    curl -X POST \
      -d "grant_type=client_credentials&client_id=你的客户端ID&client_secret=你的客户端密钥&resource=https://graph.microsoft.com" \
      "https://login.microsoftonline.com/你的租户ID/oauth2/token"
    
  2. 第二步:解析共享链接获取文件ID
    把你的OneDrive共享链接编码后,用Graph API的/shares端点解析出文件的Graph ID:

    # 替换成你的共享链接和刚拿到的access_token
    curl -H "Authorization: Bearer 你的access_token" \
      "https://graph.microsoft.com/v1.0/shares/u!$(echo -n "https://...你的共享链接" | base64 | tr '+/' '-_' | tr -d '=')"
    

    返回的JSON里会有id字段,这就是我们需要的文件ID。

  3. 第三步:用令牌下载文件
    用拿到的文件ID和access_token发起下载请求:

    curl -H "Authorization: Bearer 你的access_token" \
      -L -o 你的文件名.xlsx \
      "https://graph.microsoft.com/v1.0/drives/你的DriveID/items/你的文件ID/content"
    

    (注:Drive ID也可以从第二步的JSON返回结果里找到)

几个实用小提醒

  • 密码保护场景里,要是验证页面的表单参数不是password,可以用浏览器开发者工具查看表单的name属性,替换-d里的参数名
  • 组织权限场景里,要是想自动化脚本,可以用jq工具自动提取JSON里的access_token,不用手动复制
  • 下载完成后记得删除cookie文件(rm onedrive_cookies.txt),避免会话信息泄露

内容的提问来源于stack exchange,提问作者Marek Mezei

火山引擎 最新活动