想使用百度网盘API实现一个自动同步传输触发执行任务的应用, 记录下使用过程 。
查看官方文档
首先注册百度网盘账号,完成实名认证等, 地址: https://pan.baidu.com/union/doc
创建应用
创建应用后可获取appid, ak, sk , signkey 信息 .
使用方式
- 可用官方文档直接HTTP调用 (推荐)
- 使用第三方编写的接口(封装好了python)
第三方库
似乎不怎么可用, 可以尝试下 .
- https://github.com/ly0/baidupcsapi
- https://github.com/mozillazg/baidu-pcs-python-sdk
- https://github.com/solos/baidupan
获取AccessToken
获取Auth Code
http://developer.baidu.com/wiki/index.php?title=docs/oauth/authorization
使用以下地址在浏览器中访问,即可得到用户的资源(网盘)的Code
https://openapi.baidu.com/oauth/2.0/authorize?
response_type=code&
client_id=<应用key>
redirect_uri=oob&
scope=netdisk&
display=popup打开页面授权后, 复制Code , 然后根据Code 获取 AccessToken , 其中oob是百度提供的可显示的跳转网页。
url = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=<Auth code>&client_id=<app key>&client_secret=<app secret>&redirect_uri=oob'
r = requests.get(url)
j = r.json()
获取 AccessToken (非资源类)
百度的API使用OAuth2.0协议管理授权, 对于所有API应用需要使用AccessToken 来鉴权,因此先获取AccessToken .
根据应用不同有多种方式, 可参考:http://developer.baidu.com/wiki/index.php?title=docs/oauth
对于自定义的应用,则可直接使用client_credential的方式一次性获取access token . 请求代码如下:
import requests
url = 'https://openapi.baidu.com/oauth/2.0/token'
payload = {
'grant_type':'client_credentials',
'client_id':'app_key',
'client_secret':'app_key_secret',
}
response = requests.request("POST", url, headers=headers, data = payload)
响应类似:
//成功的情况
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
"scope": "public",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}
//错误的情况:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}
若参数无误,服务器将返回一段JSON文本,包含以下参数:
access_token:要获取的Access Token;
expires_in:Access Token的有效期,以秒为单位;请参考“Access Token生命周期”
refresh_token:用于刷新Access Token 的 Refresh Token,所有应用都会返回该参数;(10年的有效期)
scope:Access Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限),关于权限的具体信息参考“权限列表”一节;
session_key:基于http调用Open API时所需要的Session Key,其有效期与Access Token一致;
session_secret:基于http调用Open API时计算参数签名用的签名密钥。
过期时自动续期
注意access_token 有过期时间, 在过期前应当刷新换取更新的token.
使用Refresh Token刷新以获得新的Access Token,需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的https://openapi.baidu.com/oauth/2.0/token地址上,并带上以下参数:
grant_type:必须参数,固定为“refresh_token”;
refresh_token:必须参数,用于刷新Access Token用的Refresh Token。注意一个Refresh Token只能被用来刷新一次;
client_id:必须参数,应用的API Key;
client_secret:必须参数,应用的Secret Key;
scope:非必须参数。以空格分隔的权限列表,若不传递此参数,代表请求的数据访问操作权限与上次获取Access Token时一致。通过Refresh Token刷新Access Token时所要求的scope权限范围必须小于等于上次获取Access Token时授予的权限范围。关于权限的具体信息请参考“权限列表”。
例如:
https://openapi.baidu.com/oauth/2.0/token?
grant_type=refresh_token&
refresh_token=2.e8b7dbabc28f731035f771b8d15063f23.5184000.1292922000-2346678-124328&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
scope=email
响应数据包格式
若参数无误,服务器将返回一段JSON文本,包含以下参数:
access_token:要获取的Access Token;
expires_in:Access Token的有效期,以秒为单位;请参考“Access Token生命周期”
refresh_token:用于刷新Access Token 的 Refresh Token,并不是所有应用都会返回该参数;(10年的有效期)
scope:Access Token最终的访问范围,即用户实际授予的权限列表(用户在授权页面时,有可能会取消掉某些请求的权限),关于权限的具体信息参考“权限列表”;
session_key:基于http调用Open API时所需要的Session Key,其有效期与Access Token一致;
session_secret:基于http调用Open API时计算参数签名用的签名密钥。
例如:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
"expires_in": 86400,
"refresh_token": "2.af3d55f8615fdfd9edb7c4b5ebdc3e32.604800.1293440400-2346678-124328",
"scope": "basic email",
"session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
"session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}若请求错误,服务器将返回一段JSON文本,包含以下参数:
error:错误码;关于错误码的详细信息请参考“百度OAuth2.0错误响应”一节。
error_description:错误描述信息,用来帮助理解和解决发生的错误。
例如:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "expired_token",
"error_description": "refresh token has been used"
}
使用API示例
可参考: https://pan.baidu.com/union/doc/okumlx17r
以下载未例.
请求示例
curl示例
curl -L -X GET 'https://d.pcs.baidu.com/file/1261d72d03471f7b7b805fd60e024b8d?fid=2082810368-250528-414244021542671&rt=pr&sign=FDtAERV-DCb740ccc5511e5e8fedcff06b081203-Rnos3iOhNnMF1pS44AUWwor%2BJw8%3D&expires=8h&chkbd=0&chkv=2&dp-logid=4111511902857508725&dp-callid=0&dstime=1596179809&r=802381259&access_token=12.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328' \
-H 'User-Agent: pan.baidu.com' python 示例
import requests
url = "https://d.pcs.baidu.com/file/1261d72d03471f7b7b805fd60e024b8d?fid=2082810368-250528-414244021542671&rt=pr&sign=FDtAERV-DCb740ccc5511e5e8fedcff06b08120 Rnos3iOhNnMF1pS44AUWwor%2BJw8%3D&expires=8h&chkbd=0&chkv=2&dp-logid=4111511902857508725&dp-callid=0&dstime=1596179809&r=802381259&access_token=12.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328"
payload = {}
files = {}
headers = {
'User-Agent': 'pan.baidu.com'
}
response = requests.request("GET", url, headers=headers, data = payload, files = files)
print(response.text.encode('utf8'))