使用Python从个人OneDrive下载文件

问题描述 投票:1回答:1

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

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

我想从OneDrive下载这些文件,对它们进行处理,然后将它们上传回OneDrive。

我希望自动完成此操作,而无需用户批准任何登录名或凭据。我可以这样做一次(即在第一次运行时批准登录),但是其余的必须自动运行,而无需再次请求批准(当然,除非更改权限)。

最佳方法是什么?

我一直在阅读Microsoft Graph API上的文档,但在身份验证部分苦苦挣扎。我已经在Azure AAD中创建了一个应用程序,授予了示例权限(以进行测试)并创建了一个秘密凭据。

python microsoft-graph onedrive
1个回答
0
投票

我设法做到了。我不确定这是否是最好的方法,但是现在可以使用了。它每小时自动运行一次,我不需要触摸它。

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

这就是我所做的。

Azure Portal

  • 创建一个应用程序。 Azure Active Directory->应用程序注册->个人帐户中的应用程序
  • 支持的帐户类型中,选择具有个人Microsoft帐户的帐户。
  • 重定向URI中,选择公共客户端/本机。稍后我们将添加特定的URI。
  • 在应用程序详细信息的概述部分中,记下应用程序(客户端)ID。我们稍后将需要它。
  • 认证部分中,单击添加平台并选择桌面+设备。您可以使用自己的,我选择了建议的一种:https://login.microsoftonline.com/common/oauth2/nativeclient
  • API权限]部分中,您必须添加应用程序将使用的所有权限。我添加了User.ReadFiles.ReadWriteoffline_accessoffline_access将能够获得refresh token,这对于保持应用程序运行而不要求用户登录至关重要。
  • 我没有创建任何证书
  • 秘密

    Web

看起来像是第一次获得令牌,我们必须使用浏览器或类似的东西。

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

如果添加新的权限,我们拥有的令牌将失效,我们必须再次执行本手册。

该URL将重定向

您重定向到您设置的重定向URI,并在URL中使用code = something。复制somethinghttps://login.microsoftonline.com/common/oauth2/v2.0/token

Form URL

:grant_type = authorization_code&client_id = your_app_client_id&code = use_the_code_returned_on_previous_step

这将返回访问令牌和刷新令牌。将刷新令牌存储在某处。我正在将其保存在文件中。

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)

所以基本上,我的刷新令牌总是更新的。

[我使用该刷新令牌调用令牌端点,并且该API为我提供了在当前会话期间使用的访问令牌和新的刷新令牌。

[我下次运行程序时使用此新的刷新令牌,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.