伙伴云客服论坛»论坛 S区 S行业资讯 查看内容

0 评论

0 收藏

分享

python调用百度网盘开放平台接口上传本地文件

本文章是为如何在没有GUI的环境下,使用指令行上传文件到百度网盘提供一个思路,其他操作请自行查询官方文档拓展。
前期工作

    申请成为开发者创建应用

    python调用百度网盘开放平台接口上传本地文件-1.png

记录AppKey和SecreKey,后续开发需要使用
工作流程

    用户翻开应用受权
    将下面链接的YOUR_APP_KEY改成你的AppKey,翻开该链接即可翻开受权页面
https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=YOUR_APP_KEY&redirect_uri=oob&scope=basic,netdisk&display=tv&qrcode=0&force_login=1
    从受权页面得到受权码(CODE)

    python调用百度网盘开放平台接口上传本地文件-2.jpg


    启动脚本并附带受权码
  1. # 使用受权码
  2. python main.py --code your_code
  3. # 使用缓存,每次获取都会缓存一份缓存,access_token 30天过期,refresh_token 10年过期
  4. python main.py
复制代码
例程

批量上传指定目录所有文件到百度网盘
  1. import argparse
  2. import requests
  3. import json
  4. import os
  5. import hashlib
  6. from urllib.parse import urlencode
  7. app_name ='你的应用名称'# apps对应百度云盘我的应用数据文件夹
  8. remote_path_prefix ='/apps/'+ app_name
  9. json_path ='./token.json'# access_token获取地址
  10. access_token_api ='https://openapi.baidu.com/oauth/2.0/token'# 预创建文件接口
  11. precreate_api ='https://pan.baidu.com/rest/2.0/xpan/file?'# 分片上传api
  12. upload_api ='https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?'# 创建文件api
  13. create_api ='https://pan.baidu.com/rest/2.0/xpan/file?'
  14. app_key ='YOUR_APP_KEY'
  15. secret_key ='YOUR_SECRET_KEY'classBaiduPanHelper:def__init__(self, code):
  16.         self.code = code
  17.         self.refresh_token =''
  18.         self.access_token =''# 创建文件defcreate(self, remote_path, size, uploadid, block_list):
  19.         params ={'method':'create','access_token': self.access_token,}
  20.         api = create_api + urlencode(params)
  21.         data ={'path': remote_path,'size': size,'isdir':0,'uploadid': uploadid,'block_list': block_list
  22.         }
  23.         response = requests.post(api, data=data)# 分片上传defupload(self, remote_path, uploadid, partseq, file_path):
  24.         data ={}
  25.         files =[('file',open(file_path,'rb'))]
  26.         params ={'method':'upload','access_token': self.access_token,'path': remote_path,'type':'tmpfile','uploadid': uploadid,'partseq': partseq
  27.         }
  28.         api = upload_api + urlencode(params)
  29.         res = requests.post(api, data=data, files=files)# 预上传defprecreate(self, file_path):
  30.         remote_path = remote_path_prefix
  31.         size = os.path.getsize(file_path)
  32.         arr = file_path.split('/')for item in arr[1::]:
  33.             remote_path = os.path.join(remote_path, item)
  34.         block_list =[]withopen(file_path,'rb')as f:
  35.             data = f.read()
  36.             file_md5 = hashlib.md5(data).hexdigest()
  37.             block_list.append(file_md5)
  38.             f.close()
  39.         block_list = json.dumps(block_list)
  40.         params ={'method':'precreate','access_token': self.access_token,}
  41.         data ={'path': remote_path,'size': size,'isdir':0,'autoinit':1,'block_list': block_list
  42.         }
  43.         api = precreate_api + urlencode(params)
  44.         res = requests.post(api, data=data)
  45.         json_resp = json.loads(res.content)if"path"in json_resp:return json_resp['uploadid'], remote_path, size, block_list
  46.         else:return'', remote_path, size, block_list
  47.     # 获得缓存的tokendefget_cache_token(self):withopen(json_path,'r')as f:
  48.             data = json.load(f)
  49.             self.refresh_token = data['refresh_token']
  50.             self.access_token = data['access_token']print(self.refresh_token)print(self.access_token)
  51.             f.close()# 根据受权码获取tokendefget_access_token(self):
  52.         data ={'grant_type':'authorization_code','code': self.code,'client_id': app_key,'client_secret': secret_key,'redirect_uri':'oob'}
  53.         res = requests.post(access_token_api, data=data)
  54.         json_resp = json.loads(res.content)
  55.         self.refresh_token = json_resp['refresh_token']
  56.         self.access_token = json_resp['access_token']withopen(json_path,'wb')as f:
  57.             f.write(res.content)
  58.             f.close()defupdate_file(self, file_path):# 1. 预上传
  59.         uploadid, remote_path, size, block_list = self.precreate(file_path)# 2. 分片上传(文件切片这里没有做,超级会员单文件最大20G)
  60.         self.upload(remote_path, uploadid,0, file_path)# 3. 创建文件
  61.         self.create(remote_path, size, uploadid, block_list)if __name__ =='__main__':
  62.     parser = argparse.ArgumentParser(description='百度云盘api测试')
  63.     parser.add_argument('--code',type=str, default='',help='受权码')
  64.     args = parser.parse_args()
  65.     bdpan = BaiduPanHelper(args.code)if bdpan.code is'':print('CODE is null')
  66.         bdpan.get_cache_token()else:print('CODE:'+ args.code)
  67.         bdpan.get_access_token()# 批量上传某个目录下的所有文件for root, dirs, files in os.walk('./test'):forfilein files:
  68.             file_path = os.path.join(root,file)
  69.             bdpan.update_file(file_path)print(file_path)
复制代码
上传效果


python调用百度网盘开放平台接口上传本地文件-3.png

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

醉一场红尘
注册会员
主题 15
回复 17
粉丝 0
|网站地图
快速回复 返回顶部 返回列表