ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2895|回复: 23

[原创] 【首发】VBA对接 百度网盘开放平台

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-9 15:00 | 显示全部楼层 |阅读模式
本帖最后由 905738810 于 2022-11-9 16:43 编辑

百度网盘开放平台是什么自行看官方连接
地址:https://pan.baidu.com/union/home?menuKey=union-home

本想在网上白嫖一个现成的,奈何全网搜了半天也没有搜到,只能自己造轮子了。
自己写了一个UBaiDuDisk类,实现了对接百度网盘的,授权,上传,下载,删除,获得文件列表,搜索功能。
详细使用方法在文件里看例程就好了。
附件: UBaiDuDisk.rar (66.36 KB, 下载次数: 74)

这里说一下授权:
1,去在百度开放平台官网申请并创建应用,之后在控制台会看到应用的AppKey和SecretKey,在授权时会用到。

image.png
2,使用UBaiDuDisk类里的.Authorization_Code方法,方法传入参数AppKey,
  1. Sub tes()
  2.     Dim Disk As UBaiDuDisk
  3.     Set Disk = New UBaiDuDisk
  4.     Dim AppKey As String
  5.     AppKey = "写上自己的 AppKey"
  6.     Disk.Authorization_Code AppKey
  7. End Sub
复制代码
运行后会打开一个浏览器窗口,窗口显示一个授权码,复制授权码。

3,使用UBaiDuDisk类里的.Access_Token_Create方法,方法传入参数AppKey,SecretKey,授权码
  1. Sub tes6()
  2.     Dim Disk As UBaiDuDisk
  3.     Set Disk = New UBaiDuDisk
  4.     Dim AppKey As String, SecretKey As String, AuthorizationCode As String
  5.     AppKey = "写上自己的 AppKey"                                '需要填写自己的
  6.     SecretKey = "写上自己的 SecretKey"                          '需要填写自己的
  7.     AuthorizationCode = "写上Disk.Authorization 浏览器返回值"   '需要填写自己的
  8.     Debug.Print Disk.Access_Token_Create(AppKey, SecretKey, AuthorizationCode)
  9. End Sub
复制代码
运行后会在立即窗口打印出Access Token: 和Refresh Token:,这两个密匙都记录到你的本地保留。

4,讲解Access Token: 和Refresh Token作用
Access Token是你的身份密匙,操作网盘就需要Access Token,有效期30天
Refresh Token是用来刷新Access Token,他的有效期是10年,当Access Token过期后可以用Refresh Token创建新的Access Token和Refresh Token
这样就相当于你可以有永久的身份密匙,不必再去使用第2、3步获得密匙。

5,Refresh Token刷新Access Token
使用UBaiDuDisk类里的.Access_Token_Refresh方法,方法传入参数AppKey,SecretKey,Refresh Token
  1. Sub tes7()
  2.     Dim Disk As UBaiDuDisk
  3.     Set Disk = New UBaiDuDisk
  4.     Dim AppKey As String, SecretKey As String, RefreshToken As String
  5.     AppKey = "写上自己的 AppKey"                 '需要填写自己的
  6.     SecretKey = "写上自己的 SecretKey"           '需要填写自己的
  7.     RefreshToken = "写上自己的 Refresh Token"    '需要填写自己的
  8.     Debug.Print Disk.Access_Token_Refresh(AppKey, SecretKey, RefreshToken)
  9. End Sub
复制代码
运行后会在立即窗口打印出新的Access Token: 和Refresh Token:,这两个密匙都记录到你的本地保留。
运行后UBaiDuDisk类里的.access_token和.refresh_token属性也会更新,代码可以读取属性自动更新

6,验证Access Token
在给UBaiDuDisk类里的.access_token属性赋值时会自动验证Access Token是否有效,有效则赋值成功,失效则为""
  1. Sub test8()
  2.     Dim Disk As UBaiDuDisk
  3.     Set Disk = New UBaiDuDisk
  4.     Disk.access_token = access_token
  5.     If Disk.access_token = "" Then
  6.         Debug.Print "失效 用Disk.Access_Token_Refresh 更新"
  7.     Else
  8.         Debug.Print "有效"
  9.     End If
  10. End Sub
复制代码
7,使用百度基础功能 上传,下载...等
先对UBaiDuDisk类里的.access_token属性赋值有效的Access Token
之后就可以正常使用UBaiDuDisk类里的上传,下载...等方法
  1. Sub test1()
  2.     Dim Disk As UBaiDuDisk
  3.     Set Disk = New UBaiDuDisk
  4.     Disk.access_token = "你的 Access Token"
  5.     '上传
  6.     Debug.Print Disk.upload_file("C:\1.mp4", "/apps/qq/1.mp4")
  7.     '网盘容量
  8.     Debug.Print Disk.capacity
  9.     '删除文件
  10.     Debug.Print Disk.delete_file("/apps/qq/1.mp4")
  11.     '下载文件
  12.     Debug.Print Disk.Download_file_easy("/apps/qq/aa.mp4", "C:\abc.mp4")
  13.     '等方法
  14. End Sub
复制代码



评分

7

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-9 15:24 | 显示全部楼层
本帖最后由 905738810 于 2022-11-9 16:45 编辑

这里说一些注意地方
1,路径:/apps
apps下的文件夹名称为申请接入时填写的申请接入的产品名称。如申请接入的产品名称为云存储,那么该文件夹为/apps/云存储,用户看到的文件夹为/我的应用数据/云存储。
如果软件使用的或建议存到/apps路径下。

2,UBaiDuDisk类的获得文件列表功能最大显示条目为1000,如果超过1000那么需要去管网看文档自己改写

3,UBaiDuDisk类的搜索文件功能最大显示条目为500,如果超过500那么需要去管网看文档自己改写

4,下载
建议去在官网上看看文档,分三步,
1)获取文件列表文件列表返回每个文件的fs_id
2)根据文件的fs_id获取文件信息,文件信息里包含了下载地址
3)根据下载地址下载文件
UBaiDuDisk类也可以使用这三部来实现下载文件,这样可以应对场景更多点。
  1. '获得文件fs_id-获得文件下载地址-下载文件
  2. Sub tes3()
  3.     Dim Disk As UBaiDuDisk
  4.     Set Disk = New UBaiDuDisk
  5.     Disk.access_token = access_token
  6.     '根据文件路径获得文件的fs_id,没有文件返回空  file_id(网盘文件地址)
  7.     fs_id = Disk.file_id("/apps/qq/1.txt")
  8.     If fs_id <> "" Then
  9.         '根据文件fsid获得下载链接
  10.         d = Disk.Download_Url(fs_id)
  11.         '根据下载链接下载文件 Download_file(下载url,保存本地路径)
  12.         '返回 true成功
  13.         Debug.Print Disk.Download_file(d, "C:\d.txt")
  14.         'b得到字节数组
  15.         Dim b
  16.         Debug.Print Disk.Download_file(d, , b)
  17.     End If
  18. End Sub
复制代码


UBaiDuDisk类还封装了三合一的.Download_file_easy方法,只需提供网盘的文件路径,保存路径就可以下载
  1. '简易的下载方法 Download_file_easy(网盘文件地址,保存本地路径)
  2. Sub tes4()
  3.     Dim Disk As UBaiDuDisk
  4.     Set Disk = New UBaiDuDisk
  5.     Disk.access_token = access_token
  6.     '返回 true成功
  7.     Debug.Print Disk.Download_file_easy("/apps/qq/aa.mp4", "C:\abc.mp4")
  8.    
  9.     'b得到字节数组
  10.     Dim b
  11.     Debug.Print Disk.Download_file_easy("/apps/qq/aa.mp4", , b)
  12. End Sub
复制代码

5,上传目录限制,官方说明如下
image.png
但是我测试发现官方说明并不准,我可以上传到任意文件夹,获许以后会完善bug,这里说明一下以免有人出现这种产生情况困惑。

6,UBaiDuDisk类的上传
UBaiDuDisk类原本使用了官方的post方法上传,但是post需要多一步构造上传结构,
后来看到有篇文章用put上传,很方便,所以改成了put,由于官方没有put的技术说明,有可能以后会修复也不一定。
如果改post上传构造如下数据流结构:
  1. 请求头:Content-Type: multipart/form-data; boundary=858b48f2a04fc4fd06a2ac236dd25b18
复制代码
  1. 构造上传数据流:
  2. --858b48f2a04fc4fd06a2ac236dd25b18
  3. Content-Disposition: form-data; name="file"; filename="file.mp4"
  4. Content-Type: application/octet-stream
  5. 源数据流

  6. --858b48f2a04fc4fd06a2ac236dd25b18--
复制代码


TA的精华主题

TA的得分主题

发表于 2022-11-12 10:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-11-12 10:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-11-12 10:47 来自手机 | 显示全部楼层
905738810 发表于 2022-11-9 15:24
这里说一些注意地方
1,路径:/apps
apps下的文件夹名称为申请接入时填写的申请接入的产品名称。如申请接 ...

用put上传

put?

我看代码,应该是post啊?

TA的精华主题

TA的得分主题

发表于 2022-11-12 11:24 | 显示全部楼层
看着很牛逼    但是我不知道哪来是做什的?啊  

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-12 14:22 | 显示全部楼层

可能我说的有点笼统,
官方文档是这样规定的,上传需要三步:预上传,分片上传,创建文件。
预上传是上传一些文件信息比如文件md5文件上传路径之类的,
创建文件是告诉百度上传完毕生成文件,
分片上传是上传文件的数据流,我说的put是指在分片上传时上传文件数据流使用put,这里官方用的post
代码大概在445行位置
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-12 15:41 | 显示全部楼层
捞屎人 发表于 2022-11-12 11:24
看着很牛逼    但是我不知道哪来是做什的?啊

可以将你的数据存储到云端,实现多人数据共享,多端查看数据,不在局限于本地。
举例:

1)你开发出的应用数据如果想在多地都同步,就可以将数据存到百度网盘
2)你做的应用想实现,多个人不同地点的人共享excel文件



可能用人会说可以自己买服务器搭建,但是自己搭建的难度大,经费高,重要是百度网盘不花钱,官方说100M以内不限速(我一直是会员没测试过)。
而且直接对接百度网盘不用考虑多人并发问题,这比自己做的强多了,考虑稳定性也不是自己搭建可以比的。



这是我正在做的项目,VBA的类库管理工具,实现类库上传,类库安装,类库搜索...等
市面上那些VBE函数插件都是在本地存储函数,换台电脑就要重新配置。
VBA的类库管理工具最主要是在任何有网络的地方就可以进行上传、安装类库,不用局限于本地。
jdfw.gif

因为我想写这个插件来管理我的类库,所以我先写了这个UBaiDuDisk类,后来觉得对论坛的朋友应该也有用就分享出来了,不过现在来看应该是没啥人有用,发出来贴直接就沉了 0.0



TA的精华主题

TA的得分主题

发表于 2022-11-12 17:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
先收藏,等以后我成长了回来挖宝藏,谢谢分享!

TA的精华主题

TA的得分主题

发表于 2022-11-12 18:07 | 显示全部楼层
本帖最后由 tspliu 于 2022-11-12 19:17 编辑

这个太厉害了,赶紧收藏。
另外问一下大神,我上传的文件如果是空文件,比如txt文件里面没有内容。这里应该如何改动?
0.jpg
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-24 07:01 , Processed in 0.049371 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表