Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

这篇具有很好参考价值的文章主要介绍了Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在CSDN、掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文!


本文主要讲解的是自己注册了一个 E5 开发者账号,希望可以将 E5 的 OneDrive 作为网站的文件存储。如果你是希望用户登录自己的 Microsoft 账号后你获取他们自己账号的 OneDrive 文件,那么本文仅作实现参考。

这大概是本人写起来最累的一篇文章,因为我是在研究完这个东西、网站都上线了半年后才开始的。写这篇文章的初衷是真的不希望看到大家被微软晦涩难懂的文档劝退,因此内容可能不全面或出现错误,但保证可用。

事实上,Cloudreve 的添加存储策略页面也在很大程度上帮助了我的研究

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

特别说明的是,整个过程虽然理论上可以流畅完成,但如果遇到问题可以尝试给自己的网络施一点魔法。

创建应用

首先打开这个网页,登录自己将用于存储文件的Microsoft账号(应为你的E5中某个启用了OneDrive的账号,而非个人账号):

https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview

如果是世纪互联版本,则链接为
https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview
世纪互联账号未测试,不保证本文方法可用

登录后打开的页面应该是这样的,如果不是请重新点击上面的链接

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

选择左侧的“应用注册”,然后选择“新注册”:

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

在新打开的页面中,名称随意,受支持的帐户类型选择第三个 任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户和个人 Microsoft 帐户(例如,Skype、Xbox) ,**重定向URI(可选)**选择 Web,值填写 http://localhost/

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

点击“注册”按钮,加载完成后就进入了我们刚刚注册的应用程序主页。我们把应用程序(客户端) ID复制出来保存好。

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

点击“证书和密码”,再选择“新客户端密码”,截止期限根据自己需求选择(目前微软不提供永久有效的选项了,为防止频繁更新建议直接选到最长24个月),说明随意

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

然后我们就可以看到创建好的值和机密ID啦,请务必保存好,关闭页面后就无法再看到“值”了。

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

至此,我们的应用注册过程完成,现在手中获得了该应用程序的客户端ID以及客户端密码(刚刚那一步看到的“值”)

获取鉴权 Token

官方文档:https://learn.microsoft.com/zh-cn/onedrive/developer/rest-api/getting-started/graph-oauth?view=odsp-graph-online

官方已经说明了,这一个步骤有令牌流和代码流两种方式。前者虽然流程上更简单,但是获取到的 access_token 有效期仅8小时,到期后需要重新手动登录 Microsoft 账户才能继续调用 API(不考虑你想用爬虫操作Microsoft Login),这显然不适合我们的脚本。

构造并在浏览器中访问这个链接:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
client_id={client_id}
&scope={scope}
&response_type=code
&redirect_uri=http://localhost/

其中,client_id 就是我们上一步获取的客户端ID,scope 指作用域,OneDrive官方的详细介绍在这里

建议和我一样填写 files.readwrite.all offline_access!如果不一样,我不保证你后面的步骤顺利。

于是我构造出来的URI便是(client_id 中省略了最后一部分)

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=2dde8638-6489-4fc2-bfec-xxxxxxxxxxxx&scope=files.readwrite.all%20offline_access&response_type=code&redirect_uri=http://localhost/

在浏览器中访问之后,打开的是一个经典的 Microsoft 账号登录界面,正常登录我们要用来存储文件的账号即可

Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片

授权后会跳转到 localhost,此时这个网页应该会因为不存在打不开,不过没关系,我们只需要把地址栏中的内容复制出来,结构应该长这样:

http://localhost/
?code=xxxxx
&session_state=xxxxx#

此处我们记录 code 值,并构造这样的一个访问:

POST https://login.microsoftonline.com/common/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id={client_id}&redirect_uri=http://localhost/&client_secret={client_secret}
&code={code}&grant_type=authorization_code

对应的 Python 代码:

from requests import *

r = post('https://login.microsoftonline.com/common/oauth2/v2.0/token',
         data={
             'client_id': '{client_id}',
             'redirect_uri': 'http://localhost/',
             'client_secret': '{client_secret}',
             'code': '{code}',
             'grant_type': 'authorization_code'
         })

print(r.text)

其中需要替换的三个值我们在前面都已经得到了,不再赘述。

如果一群正常,你将会得到一个格式类似于下面这样的 JSON:

{
    "token_type":"bearer",
    "expires_in": 5126,
    "ext_expires_in": 5126, 
    "scope":"wl.basic onedrive.readwrite",
    "access_token":"EwCo...AA==",
    "refresh_token":"eyJh...9323"
}

也可能略有不同,没关系,最重要的 access_tokenrefresh_token 有就行。

到这一步,我们就可以拿着 access_token 愉快地去调 API 了。但是如你所见,这个令牌是有有效期的,如果过期了之后,需要我们拿着 refresh_token 去兑换新的令牌

所以 refresh_token 是需要程序保存起来以便未来使用的,并且为了程序效率同时防止不必要的麻烦,建议把获取到每个 access_token 的时间也保存,并在每次发送请求前通过时间信息检测一下该令牌是否过期,不要等到 API 报错再去重新申请令牌

兑换新的 access_token 的请求格式如下

POST https://login.microsoftonline.com/common/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id={client_id}&redirect_uri=http://localhost/&client_secret={client_secret}
&refresh_token={refresh_token}&grant_type=refresh_token

其响应格式还是一个和上面类似的 JSON,包含新的 access_tokenrefresh_token

上传文件

从此处开始,正常情况下,需要 access_token 的请求都应由服务端发出以保证安全。

OneDrive 提供两种上传模式,第一种是直接使用 access_token 鉴权并上传,这种方式不适合给用户使用且最大仅支持4MB文件,所以不再赘述,有需要可以自己去看。

此处我们介绍第二种,即先使用 access_token 获取一个上传会话,然后客户端拿到这个上传会话后可以直接免鉴权上传。

构造如下的请求:

POST https://graph.microsoft.com/v1.0/me/drive/root:{path}:/createUploadSession
Authorization: Bearer {access_token}
Content-Type: application/json

{
    "item": {
        "@microsoft.graph.conflictBehavior": "rename"
    }
}

此处需要替换 pathaccess_token 两个参数,后者老生常谈了,前者就是我们文件在 OneDrive 上的存储路径,注意一下最前面需要有一个斜杠,后面不用,例如 /test.txt

更多可以在 body 中指定的参数详见官方文档,此处我们指定的 "@microsoft.graph.conflictBehavior": "rename" 是指如果存在同名文件则为新上传的文件重命名。

示例 Python:

path = '/test.txt'
access_token = 'xxxxxx'

r = post(
    f'https://graph.microsoft.com/v1.0/me/drive/root:{path}:/createUploadSession',
    headers={
        'Authorization': 'Bearer ' + access_token,
        'Content-Type': 'application/json'
    },
    data=json.dumps({
        'item': {
            '@microsoft.graph.conflictBehavior': 'rename',
        },
    }),
)
print(r.json())

正常情况下你会收到这样的返回:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession",
    "expirationDateTime": "2023-03-25T07:41:03.482Z",
    "nextExpectedRanges": [
        "0-"
    ],
    "uploadUrl": "https://yxzl-my.sharepoint.com/..."
}

接下来的东西应该看官方文档就能懂了,大家自行阅读一下。刚刚在JSON中获取到的 uploadUrl 就是文档中所说的 在 createUploadSession 响应中收到的 uploadUrl 值

为了防止大家眼大露神,把文档中很重要的一句话贴过来:

注意:如果应用将一个文件拆分为多个字节范围,则每个字节范围的大小必须是 320 KiB(327,680 个字节)的倍数。 如果使用的片断大小不能被 320 KiB 整除,会导致在提交某些文件时出错。

此处给出 Python 客户端上传文件的代码示例:

from requests import *

file = open('D:/Desktop/1.txt', 'rb').read()

length = len(file)

r = put(
    'https://yxzl-my.sharepoint.com/...',
    data=file,
    headers={
        'Content-Length': f'{length}',
        'Content-Range': f'bytes 0-{length - 1}/{length}'
    })

print(r)
print(r.text)

JavaScript Axios 的上传示例:

import { Axios } from "axios";

const uploadFile = async (file, uploadUrl) => {
    /*
    file: 要上传的文件对象
    uploadUrl: 获取的上传会话
    */
    const size = file.size; // 文件大小
    const piece = 1024 * 1024 * 10; // 分片大小
    let start = 0; // 当前分片的起始字节
    let end = Math.min(piece, size); // 当前分片的结束字节
    let cnt = Math.ceil(size / piece); // 分片数

    while (start < size - 1) {
        await Axios.put(uploadUrl, this.uploadFile.slice(start, end), {
            headers: {
                "Content-Range": `bytes ${start}-${end - 1}/${size}`,
            },
        });
        cnt--;
        if (cnt === 0) {
            alert("上传成功");
            return;
        }
        start = end;
        end = Math.min(start + piece, size);
    }
};

上传成功的返回如下(如果分片则是最后一个分片的返回),不过一点用也没有

{
    "@odata.context": "https://yxzl-my.sharepoint.com/.../$metadata#items/$entity",
    "@content.downloadUrl": "https://yxzl-my.sharepoint.com/.../download.aspx?UniqueId=...",
    "createdBy": {
        "application": {
            "id": "...",
            "displayName": "OneDriveTest"
        },
        "user": {
            "email": "yixiangzhilv@yxzl.onmicrosoft.com",
            "id": "...",
            "displayName": "王 子涵"
        }
    },
    "createdDateTime": "2023-03-25T07:26:03Z",
    "eTag": "\"{F51D59DC-4D2F-466F-9CF0-E9895FF154C2},3\"",
    "id": "...",
    "lastModifiedBy": {
        "application": ...,
        "user": ...
    },
    "lastModifiedDateTime": "2023-03-25T07:39:52Z",
    "name": "a.txt",
    "parentReference": {
        "driveType": "business",
        "driveId": "b!...",
        "id": "...",
        "path": "/drive/root:"
    },
    "webUrl": "https://yxzl-my.sharepoint.com/.../a.txt",
    "cTag": "\"c:{F51D59DC-4D2F-466F-9CF0-E9895FF154C2},2\"",
    "file": {
        "hashes": {
            "quickXorHash": "..."
        },
        "irmEffectivelyEnabled": false,
        "irmEnabled": false,
        "mimeType": "text/plain"
    },
    "fileSystemInfo": {
        "createdDateTime": "2023-03-25T07:26:03Z",
        "lastModifiedDateTime": "2023-03-25T07:39:52Z"
    },
    "size": 150
}

你要说他有用的话,可能那个 donwloadUrl 稍微有点,但是那玩意有效期也不长

获取文件下载链接

这个就很简单了,此处介绍的方法是先获取一个文件的详细信息,再通过返回的 @microsoft.graph.downloadUrl 来下载。

构造请求:

GET https://graph.microsoft.com/v1.0/me/drive/items/root:{path}:',
Authorization: Bearer {access_token}

此处的 path 和上面创建上传会话的时候使用的应一致(前面都要有斜杠),access_token 不必再说了。

这个请求返回的是一个巨长的 JSON,把这个文件几乎所有的信息全给你了,但是我们只需要获取到 @microsoft.graph.downloadUrl 这一项即可。其值是一个 URL,访问这个 URL 可以免鉴权下载文件,但是有效期只有一小时。

参考链接:文章来源地址https://www.toymoban.com/news/detail-439679.html

  • 获取文件或文件夹 - OneDrive API - OneDrive dev center | Microsoft Learn
  • DriveItem - OneDrive API - OneDrive dev center | Microsoft Learn(这个是有关返回的 JSON 各项值的说明)

到了这里,关于Office E5 OneDrive API使用指南:注册+密钥获取+获取临时上传链接+分片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IDEA的BitoAI插件的简单使用指南(包括安装和注册)

    注:插件声称使用的是GPT-4模型算法,并且多平台支持,包括vscode、pycharm等,这里只演示idea的安装和使用 1.安装 直接在idea的插件商城中搜索即可 2.注册 使用bito插件需要使用邮箱注册,注册非常简单,只需要输入邮箱,然后填写验证码即可。 3.使用 有两种用法。 用法一:首

    2024年02月04日
    浏览(34)
  • API测试之Postman使用完全指南

    Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流。 Postman 工具有 Chrome 扩展和独立客户端,推荐安装独立客户端。 Postman 有个 workspace 的概念,workspace 分 personal 和 team 类型。Personal workspace 只能自己查看的 API,

    2024年02月04日
    浏览(31)
  • 完整指南:如何使用 Stable Diffusion API

    Stable Diffusion 是一个先进的深度学习模型,用于创造和修改图像。这个模型能够基于文本描述来生成图像,让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API,通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界前,需要把握以下基本概念: API(

    2024年04月09日
    浏览(41)
  • JS小知识,Intersection Observer API 使用指南

    使用Intersection Observer API在JavaScript中实现懒加载,无限滚动等功能,而不需要使用复杂的逻辑或导致性能问题。 Intersection Observer API 用于异步观察元素与浏览器视口的交集变化。它使得检测元素的可见性,或者两个元素的相对可见性变得容易,而不会使网站变得缓慢并降低用

    2024年02月03日
    浏览(24)
  • SQLite数据库使用指南以及相关API编程

    SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎,被嵌入到所有移动设备和大部分计算机中,并且伴随着无数日常使用的应用程序一起提供。 SQLite的文件格式具有稳定性、跨平台性以及向后

    2024年03月20日
    浏览(40)
  • Postman:API测试之Postman使用完全指南

    Postman 是一个可扩展的 API 开发和测试协同平台工具,可以快速集成到 CI/CD 管道中。旨在简化测试和开发中的 API 工作流。 Postman 工具有 Chrome 扩展和独立客户端,推荐安装独立客户端。 Postman 有个 workspace 的概念, workspace 分 personal 和 team 类型。 Personal workspace 只能自己查看的

    2024年02月04日
    浏览(42)
  • docker版jxTMS使用指南:数据源之API

    本文讲解4.2版jxTMS的数据源的API,整个系列的文章请查看:docker版jxTMS使用指南:4.2版升级内容 docker版本的使用,请参考docker版jxTMS使用指南 4.0版jxTMS的说明,请查看:4.0版升级内容 使用数据源前需导入: 其构造函数为: informDual其实就是一种通知机制,是接收端向数据源的

    2024年02月12日
    浏览(30)
  • 淘宝API接口:提高电商运营效率与用户体验的利器(淘宝API接口使用指南)

    淘宝API接口:提高电商运营效率与用户体验的利器 随着电商行业的快速发展,淘宝作为国内最大的电商平台之一,不断探索和创新,以满足不断变化的用户需求和商家需求。其中,淘宝API接口便是其创新的一个重要方面。本文将深入探讨淘宝API接口的作用、功能、优势以及使

    2024年02月10日
    浏览(31)
  • 接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调

    2024年02月15日
    浏览(42)
  • 2023版Postman接口测试使用全指南(原来使用 Postman测试API接口如此简单)

    下面是一篇详细介绍postman接口测试的文章,如果文章内容不太明白的话, 我建议看看视频版本,更加清洗,更加直观! 最详细的postman接口测试实战教程_哔哩哔哩_bilibili 最详细的postman接口测试实战教程共计129条视频,包括:1、Postman之接口测试灵魂考问、2、Postman之接口返

    2024年02月14日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包