百度网盘API

想使用百度网盘API实现一个自动同步传输触发执行任务的应用, 记录下使用过程 。

查看官方文档

首先注册百度网盘账号,完成实名认证等, 地址: https://pan.baidu.com/union/doc

创建应用

创建应用后可获取appid, ak, sk , signkey 信息 .
img

使用方式

  1. 可用官方文档直接HTTP调用 (推荐)
  2. 使用第三方编写的接口(封装好了python)

第三方库

似乎不怎么可用, 可以尝试下 .

  1. https://github.com/ly0/baidupcsapi
  2. https://github.com/mozillazg/baidu-pcs-python-sdk
  3. 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
img

对于自定义的应用,则可直接使用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'))