******后面会添加一种新的方法
******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:
2:知道上传的路径
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
如图
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
![]()
在去网盘看看 有没成功上传
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时必须要指定目录。
我下面给出了演示。
所以一个服务项目下面只有一个!
########后来遇到个 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月份的时候发现老是报
后来发现一个新的方法可以使用 bpcs_uploader
参考:http://oott123.github.io/bpcs_uploader/
由于客户端杀毒软件报有毒我就不上传了。(软件应该没问题,只是因为有php shell 所以360杀了 git的url是https://github.com/oott123/bpcs_uploader)
我测试发现他是新建一个项目。
后来我想原来的软件挺好用的,我把taken换过去,应该可以使用了。测试发现是可以的了。
譬如脚本:/root/install/oott123-bpcs_uploader-3a75324/bpcs_uploader.php upload test316.txt blog/test316.txt
原因可能就是数据迁移,将我原来的项目给关掉了。如果新建应该就可以了,可惜百度搞得很混乱,也不知道哪里管理。目前这种方式还有效,只是把远端的目录换掉即可。有时间的话 我再找找原来的项目管理的路径 看能不能把原来的也修好。
后来发现重新获得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
即可。