首页 文章

404从Microsoft Graph下载OneDrive内容

提问于
浏览
3

我试图通过microsoft api下载onedrive项目的内容 . 但是,无论我使用哪种方法,我都会收到404回复 . 这是python / requests中问题的再现

import requests
import json

root_url = "https://graph.microsoft.com"
base_path = "/v1.0/<tenant_id>/users/<principal_name>/drive/"

token = "ALONGTOKEN"

headers = {"Authorization": "Bearer %s" % token}

r = requests.get(root_url + base_path + "/root/children", headers=headers)
listing = json.loads(r.text)
target = listing["value"][0]
print("Target node:")
print(json.dumps(target))
print("Target node id:")
print(target["id"])

r = requests.get(root_url + base_path + "items/" + target["id"], headers=headers)
print("Target metadata:")
print(r.text)

resp = json.loads(r.text)
download_url = resp["@microsoft.graph.downloadUrl"]
print("Target download url:")
print(download_url)

r = requests.get(download_url, headers=headers)
print("Download response code:")
print(r.status_code)
print("Download response headers:")
print(r.headers)
print("Download response cookies:")
print(r.cookies)
print("Download response redirect history:")
print(r.history)

输出以下内容:

Target node:
{"parentReference": {"driveId": "drive_id", "path": "/drive/root:", "id": "parent_id"}, "cTag": "\"c:{tag},1\"", "lastModifiedDateTime": "2016-08-24T17:32:45Z", "name": "birds.png", "createdDateTime": "2016-08-24T17:32:45Z", "image": {}, "webUrl": "https://org-my.sharepoint.com/personal/principal_name/Documents/birds.png", "lastModifiedBy": {"user": {"displayName": "User Name", "id": "user_id"}}, "eTag": "\"{etag},1\"", "createdBy": {"user": {"displayName": "User Name", "id": "user_id"}}, "@microsoft.graph.downloadUrl": "https://org-my.sharepoint.com/personal/principal_name/_layouts/15/download.aspx?guestaccesstoken=access_token&docid=did&expiration=2016-09-01T17%3a12%3a14.000Z&userid=uid&authurl=True&NeverAuth=True", "file": {"hashes": {}}, "id": "01L4SXJGJ2LR2PGPKJMVGZPHIADCAYJEFE", "size": 34038}

Target node id:
01L4SXJGJ2LR2PGPKJMVGZPHIADCAYJEFE

Target metadata:
{"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users('principal_name')/drive/items/$entity","@microsoft.graph.downloadUrl":"https://org-my.sharepoint.com/personal/principal_name/_layouts/15/download.aspx?guestaccesstoken=accesstoken&docid=docid&expiration=2016-09-01T17%3a12%3a15.000Z&userid=uid&authurl=True&NeverAuth=True","createdBy":{"user":{"id":"user_id","displayName":"User Name"}},"createdDateTime":"2016-08-24T17:32:45Z","eTag":"\"{etag},1\"","id":"01L4SXJGJ2LR2PGPKJMVGZPHIADCAYJEFE","lastModifiedBy":{"user":{"id":"user_id","displayName":"User Name"}},"lastModifiedDateTime":"2016-08-24T17:32:45Z","name":"birds.png","webUrl":"https://org-my.sharepoint.com/personal/principal_name/Documents/birds.png","cTag":"\"c:{ctag},1\"","file":{"hashes":{}},"image":{},"parentReference":{"driveId":"drive_id","id":"parent_id","path":"/drive/root:"},"size":34038}

Target download url:
https://org-my.sharepoint.com/personal/principal_name/_layouts/15/download.aspx?guestaccesstoken=accesstoken&docid=docid&expiration=2016-09-01T17%3a12%3a15.000Z&userid=uid&authurl=True&NeverAuth=True

Download response code:
404

Download response headers:
{'Content-Length': '13702', 'SPIisLatency': '4', 'X-Content-Type-Options': 'nosniff', 'X-AspNet-Version': '4.0.30319', 'request-id': '288b9f9d-c04a-2000-133b-ebab2f6f332b', 'Strict-Transport-Security': 'max-age=31536000', 'MicrosoftSharePointTeamServices': '16.0.0.5625', 'X-Powered-By': 'ASP.NET', 'SPRequestGuid': '288b9f9d-c04a-2000-133b-ebab2f6f332b', 'Server': 'Microsoft-IIS/8.5', 'X-MS-InvokeApp': '1; RequireReadOnly', 'X-SharePointHealthScore': '0', 'SPRequestDuration': '297', 'SharePointError': '0', 'Cache-Control': 'private', 'Date': 'Thu, 01 Sep 2016 16:12:14 GMT', 'P3P': 'CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"', 'Content-Type': 'text/html; charset=utf-8'}

Download response cookies:
<RequestsCookieJar[]>

Download response redirect history:
[]

也就是说,在链接结果后立即产生404,尽管它应该下载文件字节 . 我已经在java,python,bash / curl和浏览器中重现了这个 . 任何人都可以帮助指出我做错了什么,或者这是微软图api的问题?

编辑:

我还可以使用here描述的/ drive / items / / content endpoints 重现相同的404 . 对此 endpoints 的请求会导致302重定向(如文档中所述),如果遵循该重定向,则会产生与上述相同的404行为 .

EDIT2:

以下是我可以在响应头中找到的所有请求ID,这些请求对Microsoft的调试很有用 .

对于项目对象的200请求:'request-id':'adfa3492-4825-439d-8e59-022f32e78244','client-request-id':'adfa3492-4825-439d-8e59-022f32e78244'

对于下载URL上的404请求:'request-id':'33e09e9d-b0c2-2000-133c-304585c15000','SPRequestGuid':'33e09e9d-b0c2-2000-133c-304585c15000',

此外,从404返回的实际HTML包括相关ID:a8e09e9d-a0bb-2000-133b-ef6fc8ac7015

2 回答

  • 0

    文件下载目前仅支持 delegated 权限(例如File.Read范围),如here所述 . 您的请求是使用 application 权限Files.Read.All和Files.ReadWrite.All,我们're gradually adding support for, but they'尚未完全正常运行且未列出here .

  • 3

    你能检查item_id实际上是一个项目的ID吗?如果你正在处理GET /v1.0/users//drive/items/返回的集合,该集合将返回一个文件夹和项元数据的数组 . 如果您针对某个文件夹尝试了请求,则会按照您的描述获得404 . 这是我可以重复你的问题的唯一方法 . 如果这不是问题,请提供请求/响应跟踪,以便我们可以看到错误详细信息 .

相关问题