5 月 102015
 

******后面会添加一种新的方法

******5月份百度云迁移造成了老的不能用,后来又测试一个新的方法放在最后!

参考url:http://www.haiyun.me/archives/859.html

最近百度网盘将空间升级到了永久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=@haiyun.me.tar.gz" "https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&\
access_token=<access_token>&path=/apps/pcsupload/haiyun.me.tar.gz"

下载文件:

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

删除文件:

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

复制文件:

curl -k -L "https://c.pcs.baidu.com/rest/2.0/pcs/file?method=copy&access_token=<access_token>\
&from=/apps/pcsupload/haiyun.me.tar.gz&to=/apps/pcsupload/www.haiyun.me.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

说明:

1:必须要开通PCS API:

image

2:知道上传的路径

image

3:大文件上传方法:

功能

与分片文件上传的upload方法配合使用,可实现超大文件(>2G)上传,同时也可用于断点续传的场景。

HTTP请求方式

POST

URL

 https://pcs.baidu.com/rest/2.0/pcs/file

请求参数

参数名称
类型
是否必需
描述

method
string

固定值,createsuperfile。

请求示例:

POST https://pcs.baidu.com/rest/2.0/file?method=createsuperfile&path=%2fapps%2fyunform%2f6ddddd.JPG&access_token=1.9fb09e8cce44c0d000e6787138924a26.86400.1331273905.2600617452-188383

官方的一个百度云盘的shell tool工具,貌似是不错,但是不知道为啥用不了,有兴趣的朋友可以试试哈。

http://developer.baidu.com/wiki/index.php?title=docs/cplat/stor/sdk#Shell-Tool

###########linux的 c客户端如下

参考url:http://blog.hackroad.com/operations-engineer/linux_server/7133.html

安装步骤:

yum -y  upgrade libcurl libcurl-devel

yum -y install gcc unzip make imake autoconf curl-devel

cd /root/shell/

wget -c http://blog.cnlabs.net/wp-content/uploads/2013/08/Baidu_PCS.zip

(我的网盘也有)

unzip -o Baidu_PCS.zip

cd Baidu_PCS

# 修改下 baidu_pcs.c
如图baidupcstools
ID和KEY 修改为你的开发中心应用ID和密匙

make #编译下 不用make install 就一个文件

会生成一个 baidu_pcs的执行文件
这个就是客户端了

授权 获得 auth token
=======================================
cd /opt/
./baidu_pcs info
会提示一个授权链接 和授权码 COPY URL 后复制到浏览器打开
使用你的账户和密码登录 然后填入授权码  (现在都是2微码,用手机授权下即可)
提示成功 就代表获得了auth token 1个月有效

Step4 配置和上传 下载测试
=======================================
现在使用 ./baidu_pcs info
可以打印出你的空间配额了
如图 可以显示使用了100多G 总共1.12T
image

上传测试 把文件上传到百度网盘里
image

在去网盘看看 有没成功上传

image

PS 如果出现ERROR: 获取信息失败111-Access token expired

如果用这个软件重新编译还是报错,后来从源码发现,他会缓存已存储的token,需要删除之后,重新填写token,然后再重新编译即可。

缓存文件是:.baidu_pcs_token
[root@blog ~]# ll /root/.baidu_pcs_token
-rw——- 1 root root 73 10月 11 15:12 /root/.baidu_pcs_token

 

PS 还有 我这里只有linux-api的目录。 其实这是服务在开通PCS时必须要指定目录。

我下面给出了演示。

image

image

 

所以一个服务项目下面只有一个!

########后来遇到个 Access token 一个月就过期的问题,每次要重新验证,后来网上发现有2中方式可以解决,一个是通过refresh_token来一直获取,另一个办法是快速获取,文档上说一直用不会过期,先试试:

在浏览器地址栏输入如下内容 其中”{你的API KEY}”替换成你的API Key

https://openapi.baidu.com /oauth/2.0/authorize?response_type=token&client_id={你的API KEY}& redirect_uri=oob&scope=netdisk

打开之后会跳转到另外一个地址

http://openapi.baidu.com/oauth/2.0/login_success#expires_in=2592000&access_token={access_token}&session_secret={session_secret}&session_key={session_key}&scope=basic+netdisk

其中access_token后面一段是我们需要的,保存下来即可

使用期限是30天,但如果这个access_token一直在使用的话 是不会过期的,可以放心使用

另一种方式我也测试了通过refresh_token来获取,

参考百度的官方文档:

获取access_token:http://developer.baidu.com/wiki/index.php?title=docs/oauth/application

通过refresh_token 获取方式:http://developer.baidu.com/wiki/index.php?title=%E4%BD%BF%E7%94%A8Refresh_Token%E8%8E%B7%E5%8F%96Access_Token

下面我来说说步骤:

首先获取User Code和Device Code

1:curl -k -L -d “client_id=<api_key>&response_type=device_code&scope=basic,netdisk” “https://openapi.baidu.com/oauth/2.0/device/code”

获取 user_code 和 device_code

2:访问 https://openapi.baidu.com/device/  输入user_code授权

3:

curl -k -L -d “grant_type=device_token&code=<device_code>&client_id=<api_key>&client_secret=<api_secret>”  “https://openapi.baidu.com/oauth/2.0/token”

获取 refresh_token 和 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 中的   Device Code 其实就是之前获取的device_code

4:通过refresh_token  多次获取 access_token

curl -k -L -d “grant_type=refresh_token&refresh_token=<refresh_token>&client_id=<api_key>&&client_secret=<api_secret>”   “https://openapi.baidu.com/oauth/2.0/token”
这里就是scope 不需要设置。 这样就可以多次获取access_token,10年有效期,够用了!

然后整理个脚本就能无限期使用私有云了。

以下是官网的参考:

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

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。

对于从百度开放平台申请到允许永久授权权限的应用,无论其采用Authorization Code、Reource Owner Password Credentials、Client Credentials中的哪一个去获取Access Token,都会拿到一个有效期为1个月的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"
}

###########2015年5月份的时候发现老是报

image

后来发现一个新的方法可以使用 bpcs_uploader

参考:http://oott123.github.io/bpcs_uploader/

由于客户端杀毒软件报有毒我就不上传了。(软件应该没问题,只是因为有php shell  所以360杀了 git的url是https://github.com/oott123/bpcs_uploader

我测试发现他是新建一个项目。

image

后来我想原来的软件挺好用的,我把taken换过去,应该可以使用了。测试发现是可以的了。

譬如脚本:/root/install/oott123-bpcs_uploader-3a75324/bpcs_uploader.php upload test316.txt blog/test316.txt

image

原因可能就是数据迁移,将我原来的项目给关掉了。如果新建应该就可以了,可惜百度搞得很混乱,也不知道哪里管理。目前这种方式还有效,只是把远端的目录换掉即可。有时间的话 我再找找原来的项目管理的路径 看能不能把原来的也修好。

后来发现重新获得token  又好了!

后来测试发现,没有一直有效的access_token,不过通过bpcs_uploader 获取,通过 ./bpcs_uploader.php  info 获取新的access_token,

譬如

[root@localhost oott123-bpcs_uploader-3a75324]# cat _bpcs_files_/config/access_token
26.1e4089c7d97cee88f0b1a4bc7511d.2592000.1441178511.3557441906-561

即可。

附件:oott123-bpcs_uploader-v0.1.0-beta-5-g3a75324

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny