注册新应用

登录 Azure 门户,打开 Azure Active Directory,在“管理”菜单下,选择“应用注册”>“新注册” 。输入应用程序的名称,在“受支持的帐户类型”中选择“任何组织目录(任何 Azure AD 目录 – 多租户)中的帐户”,平台选择 Web,重定向 URI 输入 http://localhost,点击“注册”,完成初始应用注册并添加客户端密码,记下应用程序 ID 和刚才生成的客户端密码。

获取访问令牌

可以通过下面的 Python 程序获取访问令牌 access_token

from urllib.parse import urlencode
import requests
import json


# 从 Azure AD 应用程序获取以下信息
client_id = YOU_CLIENT_ID
client_secret = YOUR_CLIENT_SECRET
redirect_uri = REDIRECT_URL
scope = 'openid offline_access Files.ReadWrite.All'
authorize_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
token_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'

def get_access_url():
    # 构造授权 URL
    params = {
        'client_id': client_id,
        'response_type': 'code',
        'redirect_uri': redirect_uri,
        'scope': scope
    }

    auth_url = authorize_url + '?' + urlencode(params)
    return auth_url


def get_access_token():
    auth_code = input('请输入授权码: ')
    # 交换授权码以获取访问令牌和刷新令牌
    payload = {
        'client_id': client_id,
        'client_secret': client_secret,
        'code': auth_code,
        'grant_type': 'authorization_code',
        'redirect_uri': redirect_uri
    }
    response = requests.post(token_url, data=payload)
    if response.status_code == 200:
        print(f'访问令牌获取成功,access_token:{response.json()["access_token"]}')
        with open('data.json', 'w') as f:
            json.dump(response.json(), f)
    else:
        print(f'访问令牌获取失败,错误代码:{response.status_code}')
        print(f'错误详细信息:{response.text}')


# 引导用户打开授权 URL 并登录以授权应用程序
url = get_access_url()
print(f'请前往以下 URL 授权应用程序:\n{url}')
get_access_token()

在此代码中,CLIENT_IDCLIENT_SECRETREDIRECT_URI 变量需要替换为刚才注册的应用程序的相关信息。SCOPE 变量确定应用程序可以访问的权限。

登录成功后自动转跳到我们指定的重定向 URL http://localhost/?code=0.AVYA8mv…&session_state=22d1...#,这个 URL兑换访问令牌 access_token 的的授权码,等号 = 之后符号 & 之前的一长串字符串就是授权码,把授权码粘贴到程序中继续运行即可获得访问令牌 access_token 和刷新令牌 refresh_token

刷新访问令牌

假设我们已经获得了访问令牌 access_token 和刷新令牌 refresh_token,可以通过调用以下程序刷新访问令牌。

import requests
import json


# 使用 refresh token 获取新的 access_token
client_id = YOU_CLIENT_ID
client_secret = YOUR_CLIENT_SECRET
token_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'

def get_new_access_token():
    # 从文件中获取 refresh_token
    with open('data.json', 'r') as f:
        token_data = json.load(f)
    refresh_token = token_data['refresh_token']

    # 使用 refresh_token 获取新的 access_token
    payload = {
        'client_id': client_id,
        'client_secret': client_secret,
        'refresh_token': refresh_token,
        'grant_type': 'refresh_token'
    }

    try:
        response = requests.post(token_url, data=payload)
        if response.status_code == 200:
            with open('data.json', 'w') as f:
                json.dump(response.json(), f)
            return response.json()['access_token']

        else:
            print(f'令牌刷新失败,错误代码:{response.status_code}')

    except Exception as e:
        print(e)
上传文件到 OneDrive
import requests

filename = 'test_file'
folder = '/backups/'
api_url = f'https://graph.microsoft.com/v1.0/me/drive/root:/path/to/file{folder}{filename}:/content'


def upload_file():
    new_access_token = get_new_access_token()
    # 读取文件内容
    with open(filename, 'rb') as f:
        file_contents = f.read()

    try:
        # 上传文件到 OneDrive for Business
        response = requests.put(api_url, headers={
            'Authorization': f'Bearer {new_access_token}', 'Content-Type': 'application/octet-stream'},
                                data=file_contents)

        # 检查上传是否成功
        if response.status_code == 201:
            print(f'文件上传成功!{response.text}')
        else:
            print(f'文件上传失败,错误代码:{response.status_code}, {response.text}')
    except Exception as e:
        print(e)


upload_file()

程序中 URTL 中的 /me/drive/root:/path/to/file 表示相对于 OneDrive 根文件夹的路径,并且必须存在,否则报错,folder 若不存在则会自动创建。例如上述程序执行成功后,所上传的文件在 Onedrive 的路径为/path/to/file/backups/test_file

分类: Python

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注

CAPTCHA ImageChange Image