如何用Python读取OneDrive文档文件夹的.txt文件?调用Graph API遇500错误
问题诊断与解决方案
你遇到的Unable to retrieve user's mysite URL错误,核心原因是你使用的客户端凭证(Client Credentials)授权模式没有用户上下文,而/me这个端点必须绑定到具体用户身份才能生效。
为什么会出错?
客户端凭证流是让应用以自身身份访问资源,而非代表某个用户。/me是一个快捷端点,用来指代当前请求关联的用户,但在客户端凭证模式下,请求是应用直接发起的,不存在“当前用户”的概念——Graph API无法识别要访问哪个用户的OneDrive,自然会抛出无法获取用户站点URL的错误。
修复步骤
1. 替换/me为具体用户标识
把GET请求的URL中的/me替换为目标用户的ID或用户主体名称(UPN,比如user@yourdomain.com):
# 替换为实际的用户ID或UPN target_user = "your-target-user-id-or-upn" response = requests.get(f'https://graph.microsoft.com/v1.0/users/{target_user}/drive/root:/Documents/WildRydes.txt', headers=header)
2. 确认应用权限配置正确
确保你的应用已经申请了应用权限(不是委托权限)里的Files.Read.All或Files.ReadWrite.All,并且已经获得租户管理员的同意——客户端凭证模式仅支持应用权限,委托权限在这里无法生效。
3. 若需访问当前登录用户的OneDrive(可选)
如果你的场景是要访问某个登录用户自己的OneDrive,客户端凭证流并不适用,应该改用授权码流(Authorization Code Flow)。这种模式需要用户登录授权,之后就能正常使用/me端点访问用户的OneDrive了。
修正后的完整代码示例
import requests, sys, os, json # 替换为你的实际租户ID、客户端ID、客户端密钥 tenant_id = "your-tenant-id" clientID = "your-client-id" clientSecret = "your-client-secret" target_user = "target-user-id-or-upn" # 获取令牌 params = { 'client_id': clientID, 'scope': 'https://graph.microsoft.com/.default', 'client_secret': clientSecret, 'grant_type': 'client_credentials' } response = requests.post(f'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token', data=params) jresp = response.json() access_token = jresp['access_token'] # 获取文件(使用具体用户标识) header = {'Authorization': 'Bearer ' + access_token} response = requests.get(f'https://graph.microsoft.com/v1.0/users/{target_user}/drive/root:/Documents/WildRydes.txt', headers=header) print(response) print(response.text) print(response.content) sys.exit()
内容的提问来源于stack exchange,提问作者Sebastien Michaud
相关产品推荐
相关产品推荐

