gpt4 book ai didi

python - 使用 Python 从个人 OneDrive 下载文件

转载 作者:行者123 更新时间:2023-12-01 07:11:50 24 4
gpt4 key购买 nike

我有一个在 AWS EC2 Ubuntu 计算机上定期运行的 Python 脚本。

此脚本从某些文件中读取数据,有时会更改其中的数据。

我想从 OneDrive 下载这些文件,用它们做我自己的事情,然后将它们上传回 OneDrive。

我希望此操作自动完成,无需用户批准任何登录或凭据。我可以执行一次(即在第一次运行时批准登录),但其余部分必须自动运行,而无需再次请求批准(当然,除非权限发生变化)。

最好的方法是什么?

我一直在阅读有关 Microsoft Graph API 的文档,但我在身份验证部分遇到了困难。我在 Azure AAD 中创建了一个应用程序,授予示例权限(用于测试)并创建了一个 secret 凭据。

最佳答案

我成功做到了。我不确定这是否是最好的方法,但它现在有效。它每小时自动运行一次,我不需要碰它。

我关注了https://learn.microsoft.com/en-gb/azure/active-directory/develop/v2-oauth2-auth-code-flow上的信息

这就是我所做的。

Azure 门户

  • 创建一个应用程序。 Azure Active Directory -> 应用程序注册 -> 来自个人帐户的应用程序
  • 支持的帐户类型中,选择具有个人 Microsoft 帐户的帐户类型。
  • 重定向 URI 中,选择公共(public)客户端/ native 。我们稍后会添加具体的 URI。
  • 在应用程序详细信息的概述部分中,记下应用程序(客户端)ID。我们稍后会需要这个。
  • 身份验证部分中,点击添加平台并选择桌面 + 设备。您可以使用自己的,我选择了建议之一:https://login.microsoftonline.com/common/oauth2/nativeclient
  • API 权限部分中,您必须添加您的应用将使用的所有权限。我添加了User.ReadFiles.ReadWriteoffline_accessoffline_access 是为了能够获取刷新 token ,这对于在不要求用户登录的情况下保持应用运行至关重要。
  • 我没有创建任何证书 secret

网页

看起来第一次获得 token 我们必须使用浏览器或模拟类似的东西。

必须有一种编程方式来做到这一点,但我不知道如何做到这一点。我也考虑过使用 Selenium 来实现这一点,但由于这只是一次,而且我的应用程序每小时都会请求 token (保持 token 新鲜),所以我放弃了这个想法。

如果我们添加新的权限,我们拥有的 token 将变得无效,我们必须再次执行此手动部分。

  • 打开浏览器并访问下面的 URL。使用在 Azure 门户中设置的范围重定向 URI

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=your_app_client_id&response_type=code&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&response_mode=query&scope=User.Read%20offline_access%20Files.ReadWrite

该 URL 会将您重定向至您设置的重定向 URI,并带有代码=某物在网址中。复制那个东西

端点:https://login.microsoftonline.com/common/oauth2/v2.0/token

表单网址:grant_type=authorization_code&client_id=your_app_client_id&code=use_the_code_returned_on_previous_step

这将返回一个访问 token 和一个刷新 token 。将刷新 token 存储在某处。我将其保存在文件中。

Python

# Build the POST parameters
params = {
'grant_type': 'refresh_token',
'client_id': your_app_client_id,
'refresh_token': refresh_token_that_you_got_in_the_previous_step
}

response = requests.post('https://login.microsoftonline.com/common/oauth2/v2.0/token', data=params)

access_token = response.json()['access_token']
new_refresh_token = response.json()['refresh_token']

# ^ Save somewhere the new refresh token.
# I just overwrite the file with the new one.
# This new one will be used next time.

header = {'Authorization': 'Bearer ' + access_token}

# Download the file
response = requests.get('https://graph.microsoft.com/v1.0/me/drive/root:' +
PATH_TO_FILE + '/' + FILE_NAME + ':/content', headers=header)

# Save the file in the disk
with open(file_name, 'wb') as file:
file.write(response.content)

所以基本上,我的刷新 token 始终更新。

我使用该刷新 token 调用 token 端点,API 为我提供了一个在当前 session 期间使用的访问 token 和一个新的刷新 token 。

我在下次运行程序时使用这个新的刷新 token ,依此类推。

关于python - 使用 Python 从个人 OneDrive 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com