百度网盘api 接口 Linux 使用百度网盘API上传备份文件

最近网盘大战中,百度网盘将空间升级到了永久1TB,鉴于百度的实力用做数据备份空间不错,不过百度网盘没有Linux下的客户端,上传管理文件需通过百度开放云平台访问PCS资源的系列接口。
    1.首先加入百度开发者:http://developer.baidu.com/dev#/create
    2.任意创建一个应用获取API Key并开通PCS API权限,开放API > API管理 > API列表 > API服务 > PCS API > 开启
    3.通过刚刚新建应用的API Key获取device code和user_code 

curl -k -L -d "client_id=<api_id>&response_type=device_code&scope=basic,netdisk" \
"https://openapi.baidu.com/oauth/2.0/device/code"
  

4.在浏览器打开https://openapi.baidu.com/device输入获取到的user_code并连接,然后通过device code获取refresh_token和access_token: 

curl -k -L -d "grant_type=device_token&code=<code>&client_id=<api_id>&client_secret=<api_secret>" \
"https://openapi.baidu.com/oauth/2.0/token" 

5.此时通过access_token就可对网盘文件进行操作了,获取到access_token的有效期为30天,过期后通过refresh_token重新获取access_token
curl -k -L -d "grant_type=refresh_token&refresh_token=<refresh_token>&client_id=\
<api_id>&client_secret=<api_secret>" 

获取网盘配额: 

curl -k -L "https://pcs.baidu.com/rest/2.0/pcs/quota?method=\
info&access_token=<access_token>"
  

上传文件:

curl -k -L -F "file=@getvm.net.tar.gz" "https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&\
access_token=<access_token>&path=/apps/pcsupload/test.tar.gz"


下载文件: 
curl -k -O "https://d.pcs.baidu.com/rest/2.0/pcs/file?method=download&access_token=<access_token>&\
path=/apps/pcsupload/test.tar.gz"
  

删除文件: 

curl -k -L "https://pcs.baidu.com/rest/2.0/pcs/file?method=delete&access_token=<access_token>\
&path=/apps/pcsupload/test.tar.gz"  


复制文件: 

curl -k -L "https://c.pcs.baidu.com/rest/2.0/pcs/file?method=copy&access_token=<access_token>\
&from=/apps/pcsupload/test.tar.gz&to=/apps/pcsupload/test2.tar.gz"
  

列出目录内文件:

curl -k -L "https://pcs.baidu.com/rest/2.0/pcs/file?method=list&access_token=<access_token>\
&path=/apps/pcsupload/"

  

更多操作请参考百度官方资料:http://developer.baidu.com/wiki/index.php?title=docs/pcs/rest/file_data_apis_list


授权应用场景


开发者需要根据各自的应用场景,选择适用的OAuth2.0授权流程: 

  • 网站或者站外Web应用,请参考:Authorization Code流程; 
  • 桌面和无线客户端应用,请参考:Authorization Code流程,无server端的也可以使用Implicit Grant流程,无线客户端可以直接使用官方SDK,通过WebView方式使用授权页;
  • 针对云平台的API授权,只是针对开发者,参考:百度OAuth2.0对外提供的开发者授权方式Developer Credentials。

以下介绍了三种应用场景方便开发者熟悉授权流程。

Server端使用百度OAuth2.0授权调用开放API流程

Authorization Code又称Web Server Flow,适用于所有有Server端配合的应用。有效期一个月的Access Token+有效期十年的Refresh Token。

(A) get code <= http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=TG3X5KahFVkmik87Rf46gLMU&redirect_uri=oob&scope=netdisk%20basic&display=page

(B) get access code <= https://openapi.baidu.com/oauth/2.0/token?client_id=TG3X5KahFVkmik87Rf46gLMU&client_secret=F9WIzAVVvEjVP9nuQV1AaoO8NpgIi5UA&grant_type=authorization_code&code=7d4dd5aef9f6b36adfc8556b51cc1d93&redirect_uri=oob

1. 引导用户到如下地址进行授权:

http://openapi.baidu.com/oauth/2.0/authorize?
	response_type=code&
	client_id=YOUR_CLIENT_ID&
	redirect_uri=YOUR_REGISTERED_REDIRECT_URI&
	scope=email&
	display=popup

2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE 。
3. 换取Access Token。

https://openapi.baidu.com/oauth/2.0/token?
	grant_type=authorization_code&
	code=CODE&
	client_id=YOUR_CLIENT_ID&
	client_secret=YOUR_CLIENT_SECRET&
	redirect_uri=YOUR_REGISTERED_REDIRECT_URI

返回值

{
    "access_token": "1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328",
    "expires_in": 86400,
    "refresh_token": "2.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
    "scope": "basic email",
    "session_key": "ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn",
    "session_secret": "248APxvxjCZ0VEC43EYrvxqaK4oZExMB",
}

4. 使用获得的OAuth2.0 Access Token调用API 

移动端使用百度OAuth2.0授权调用开放API流程

Implicit Grant又称User-Agent Flow,适用于所有无Server端配合的应用(桌面客户端需要内嵌浏览器)。有效期一个月的Access Token。
https://openapi.baidu.com/oauth/2.0/authorize?response_type=token&client_id=TG3X5KahFVkmik87Rf46gLMU&redirect_uri=oob&scope=netdisk&display=page

1. 引导用户到如下地址进行授权:

http://openapi.baidu.com/oauth/2.0/authorize?
	response_type=token&
	client_id=YOUR_CLIENT_ID&
	redirect_uri=YOUR_REGISTERED_REDIRECT_URI&
	scope=email&
	display=popup&
	state=xxx

2. 如果用户同意授权,页面跳转至 YOUR_REGISTERED_REDIRECT_URI 在Fragment中追加如下参数。

YOUR_REGISTERED_REDIRECT_URI#access_token=1.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-2346678-124328&expires_in=86400&scope=basic%20email&session_key=ANXxSNjwQDugf8615OnqeikRMu2bKaXCdlLxn&session_secret=248APxvxjCZ0VEC43EYrvxqaK4oZExMB&state=xxx

3. 截获OAuth2.0 Access Token调用API。 

设备使用百度OAuth2.0授权调用开放API流程

Device适用于一些输入受限的设备上(如只有数码液晶显示屏的打印机、电视机等)。有效期一个月的Access Token+有效期十年的Refresh Token。

(A) get user_code <= curl -k -L -d "client_id=TG3X5KahFVkmik87Rf46gLMU&response_type=device_code&scope=basic,netdisk" "https://openapi.baidu.com/oauth/2.0/device/code"

(B) get access code <= http://openapi.baidu.com/device?code=itpj3wd9&display=page&redirect_uri=&force_login=

1. 获取User Code和Device Code :

  https://openapi.baidu.com/oauth/2.0/device/code?
    client_id=YOUR_CLIENT_ID&
    response_type=device_code& 
    scope=basic,netdisk

2. 授权服务会返回一段JSON文本,其中包含一个二维码图片地址。

{
	"device_code":"a82hjs723h72h3a82hjs723h72h3vb",
	"user_code":"8sjiae3p", 
	"verification_url":"https:\/\/openapi.baidu.com\/oauth\/2\.0\/device", 
	"qrcode_url":"http:\/\/openapi.baidu.com\/device\/qrcode\/6c6a8afee394f99e55eb25858\/2c885vjk",
	"expires_in":1800, 
	"interval":5
}

3. 引导用户通过其他终端去百度填写User Code并授权。 

 用户可使用手持智能终端扫描上一步中的二维码图片(qrcode_url字段) ,或者在浏览器中直接访问设备展现的授权网址https://openapi.baidu.com/device

4.通过Device Code获取Access Token。

https://openapi.baidu.com/oauth/2.0/token?
	grant_type=device_token&
	code=Device Code&
	client_id=YOUR_CLIENT_ID&
	client_secret=YOUR_CLIENT_SECRET

5. 使用获得的OAuth2.0 Access Token调用API。 



获取Access Token

总体介绍

OAuth2.0(开放授权)是一个开放标准,用户授权后,第三方应用无需获取用户的用户名和密码就可以访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表)。

Access Token:用户身份验证和授权的凭证。第三方应用在调用百度开放API之前,首先需要获取Access Token。

目前,百度OAuth2.0支持五种获取Access Token的流程和一种刷新获取AccessToken方式,第三方可根据需求选取合适的方式:

百度授权的Access Token是有有效期的,这样会影响用户的体验和增加开发者的工作。所以平台提供了一种方式可以保证授权有效期为永久。

  • 实现方式:返回给第三方一个月有效期的Access Token + 十年有效期的Refresh Token。
  • 实现原理:Refresh Token的作用就是在Token有效期截止前,刷新以获取新的Access Token。
获取途径 授权流程 介绍 有效期
新获取Authorization Code又称Web Server Flow,适用于所有有Server端配合的应用。有效期一个月的Access Token+有效期十年的Refresh Token。
Implicit Grant又称User-Agent Flow,适用于所有无Server端配合的应用(桌面客户端需要内嵌浏览器)。有效期一个月的Access Token。
Client Credentials即采用应用公钥、密钥获取Access Token,适用于任何带server类型应用。 
通过此授权方式获取Access Token仅可访问平台授权类的接口。
有效期一个月的Access Token+有效期十年的Refresh Token。
Device适用于一些输入受限的设备上(如只有数码液晶显示屏的打印机、电视机等)。有效期一个月的Access Token+有效期十年的Refresh Token。
刷新Refresh TokenAccess Token刷新方式,适用于所有有Server端配合的应用 。十年刷新期限。


Client Credentials授权

简介

        采用Client Credentials方式,即应用公钥、密钥方式获取Access Token,适用于任何类型应用,但通过它所获取的Access Token只能用于访问与用户无关的Open API,并且需要开发者提前向百度开放平台申请,成功对接后方能使用。其流程示意图如下:

oauth%2Fclient_credentials.gif

        对于应用而言,其流程只有一步,即直接获取Access Token。

获取Access Token

请求数据包格式

        使用Client Credentials获取Access Token需要应用在其服务端发送请求(推荐用POST方法)到百度OAuth2.0授权服务的“https://openapi.baidu.com/oauth/2.0/token”地址上,并带上以下参数:

  • grant_type:必须参数,固定为“client_credentials”;
  • client_id:必须参数,应用的API Key;
  • client_secret:必须参数,应用的Secret Key;
  • scope:非必须参数。以空格分隔的权限列表,采用本方式获取Access Token时只能申请跟用户数据无关的数据访问权限。关于权限的具体信息请参考“权限列表”。

        例如:

https://openapi.baidu.com/oauth/2.0/token?
    grant_type=client_credentials&
    client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
    client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&

响应数据包格式

响应数据包格式

        若参数无误,服务器将返回一段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.385d55f8615fdfd9edb7c4b5ebdc3e39.604800.1293440400-2346678-124328",
    "scope": "public",
    "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": "invalid_grant",
    "error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}

开发者需要注意的事项

  • 默认情况下,Access Token的有效期为一个月,如果Access Token过期可以重新获取。
  • 获取Access Token时所返回的session_key和session_secret参数不是OAuth2.0协议标准规定的返回参数,而是百度OAuth2.0服务扩展加入的,目的是使得开发者可以基于http调用百度的Open API,因为基于https调用Open API虽然更为简单,但毕竟响应速度更差(比基于http的要差一倍时间左右)。

Refresh Token

简介

        对于从百度开放平台申请到允许永久授权权限的应用,无论其采用Authorization Code、Reource Owner Password Credentials、Client Credentials中的哪一个去获取Access Token,都会拿到一个有效期为个月的Access Token和有效期为10年的Refresh Token对于这些应用,只要用户在10年内登陆应用,应用就可以使用Refresh Token刷新以获得新的Access Token(新的Refresh Token也会同时下发),从而达到只要用户不连续10年未登陆过你的应用就不需要重新登陆的目的。


获取Access 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;
  • 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": "invalid_grant",
    "error_description": "Invalid authorization code: ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn"
}

权限列表

用户授权相关的权限描述
basic用户基本权限,可以获取用户的基本信息
super_msg往用户的百度首页上发送消息提醒,相关API任何应用都能使用,但要想将消息提醒在百度首页显示,需要第三方在注册应用时额外填写相关信息
netdisk获取用户在个人云存储中存放的数据
平台授权相关的权限描述
public可以访问公共的Open API
hao123可以访问Hao123 提供的Open API接口

该权限需要申请开通,请将具体的理由和用途发邮件给tuangou@baidu.com

        每一个Access Token代表“一个用户”或“百度开放平台”授予“一个应用”的“一系列数据访问操作权限”。这“一系列数据访问操作权限”中包含默认访问权限,以及在获取Access Token过程中传递的“scope”参数所表示的扩展权限。在调用API时,百度Open API服务会检验请求中的Access Token或Session Key是否包含本API需要的权限。

        应用在请求获取Access Token时所传递的“scope”参数中可以不包含basic权限(即默认权限),一旦用户或平台同意授权,则basic权限会自动授予。百度目前开放的Open API还为数不多,目前唯一定义的扩展权限就super_msg访问权限,应用需要这个权限时需要在获取Access Token时指定scope=super_msg,如:

https://openapi.baidu.com/oauth/2.0/authorize?
	response_type=code&
	client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
	redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect&
	scope=super_msg&
	display=popup

获取Access Token示例

下面操作步骤以Android SDK为例介绍如何在您的应用程序中获取Access Token。

1. 开发者预先配置好Android开发环境。
请参考http://developer.android.com/index.html
请您下载Android SDK:BaiduPCS_SDK_Android_2.0.zip

2. 从下载包中的BaiduPCS_SDK_Android_2.0\lib目录中得到所有的Jar包:

Baidu_OAuth_SDK_Android_G-2.0.0.0.jar
Baidu_PCS_SDK_Android-2.0.0.0.jar
httpmime-4.2.jar

3. 在Eclipse创建一个Android应用程序。

4. 修改AndroidManifest.xml,增加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>//Android4.2操作系统需要此权限,其它版本系统无限制。

5. 修改layout/main.xml,向其中添加button widget:

<Button
android:id="@+id/getAccessToken"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="62dp"
android:text="Get Access Token" />

6. 进入项目libs目录,然后将下载的包中的PcsAndroidDemo/libs中的Baidu_OAuth_SDK_Android_G-2.0.0.0.jar包拷贝到此libs目录,然后并将其加入Android程序的Build Path中。

pcs_100.jpg

7. 修改工程中默认的MainActivity.java。
1) Import 库

importcom.baidu.oauth.BaiduOAuth;
importcom.baidu.oauth.BaiduOAuth.BaiduOAuthResponse;
importcom.baidu.oauth.BaiduOAuth.OAuthListener;
importandroid.widget.Button;
importandroid.widget.Toast;
importandroid.view.View;
importandroid.view.View.OnClickListener;

2) 设定用户API key

private final String mbApiKey = "BbekPBG0sgL4CDUWfBrF0mFv";//请替换申请客户端应用时获取的Api Key串

3) 添加按钮响应事件。

private Button getAccessToken;//添加响应按钮

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getAccessToken = (Button) this.findViewById(R.id.getAccessToken);//响应按钮类

    getAccessToken.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
        BaiduOAuthoauthClient = new BaiduOAuth();
        oauthClient.startOAuth(MainActivity.this, mbApiKey, new String[]{"basic"},new BaiduOAuth.OAuthListener() {
                @Override
                public void onException(String msg) {
                    Toast.makeText(getApplicationContext(), "Login failed " + msg, Toast.LENGTH_SHORT).show();
                }
                @Override
                public void onComplete(BaiduOAuthResponse response) {
                    if(null != response){
                        String accessToken = response.getAccessToken();
                        Toast.makeText(getApplicationContext(), "Token: " + accessToken + "    User name:" + response.getUserName(), Toast.LENGTH_SHORT).show();
                    }
                }
                @Override
                public void onCancel() {
                    Toast.makeText(getApplicationContext(), "Login cancelled", Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
}

8. 运行Android程序,登录并进行授权:

pcs_101.jpg

输入已有的百度用户名和密码,单击登录。

注意:

右上方蓝色字体“pcstest_oauth”是用户申请第三方应用时指定的应用名(和上面替换的API key有对应关系)。

如果用户第一次登录第三方应用,会出现授权页面,用户需要单击“授权”:

pcs_102.jpg

9. 授权成功后,在Android模拟器toast消息框里面我们就能看见获取的access token信息和用户名。使用此Access Token,第三方开发者就可以使用PCS API了。

pcs_103.jpg

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值