本文来自依云's Blog,转载请注明。
本文只介绍流程,因此是以最方便试错的 shell 脚本为示例的。也就是一系列简单的 HTTP 请求,用什么语言都一样。
要实践本文中的例子,首先要确保系统上已经安装了如下软件:
- curl: 命令行 HTTP 调试首选工具
- jshon: 命令行 JSON 解析器。使用简单的栈式语法
- json_pp: 这个命令行工具是 perl 自带的,把 JSON 数据格式化显示用的
首先把用户信息存到变量里去:
$ BDUSER=你的百度登陆名 $ PASS=你的百度登陆密码
访问一次百度,取得一个名为BAIDUID
的 cookie。我们在此,以及以下所有 curl 命令中,都会使用-b
和-c
选项告诉 curl 从当前目录下的「cookies」文件读取 cookie 数据,把接收到的 cookie 写到同一个文件里去。
$ curl -b cookies -c cookies http://www.baidu.com/ -sS -o /dev/null
获取 token:
$ TOKEN=$(curl -b cookies -c cookies -sS "https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&class=login&tt=$(date +%s860)&logintype=dialogLogin" | tr "'" '"' | jshon -e data -e token -u) $ curl -b cookies -c cookies "https://passport.baidu.com/v2/api/?logincheck&token=$TOKEN&tpl=mn&apiver=v3&tt=$(date +%s)&username=$BDUSER&isphone=false" {"errInfo":{ "no": "0" }, "data": { "codeString" : "", "vcodetype" : "" }}
使用用户信息登陆:
$ curl -b cookies -c cookies --compressed -sS 'https://passport.baidu.com/v2/api/?login' -H 'Content-Type: application/x-www-form-urlencoded' --data "staticpage=http%3A%2F%2Fpan.baidu.com%2Fres%2Fstatic%2Fthirdparty%2Fpass_v3_jump.html&charset=utf-8&token=$TOKEN&tpl=mn&apiver=v3&tt=$(date +%s083)&codestring=&safeflg=0&u=http%3A%2F%2Fpan.baidu.com%2F&isPhone=false&quick_user=0&logintype=basicLogin&username=$BDUSER&password=$PASS&verifycode=&mem_pass=on&ppui_logintime=57495&callback=parent.bd__pcbs__ax1ysj" | grep -F 'err_no=400032' > /dev/null
如果这条命令返回(即$?
的值)为 0 则成功,否则失败。这是因为百度的登陆之后的页面会进行跳转,如果登陆成功那么跳转 URL 里包含err_no=400032
,否则err_no
是别的什么值。这个判断条件可能会变化,比如去年年底是err_no=40032
时表示成功。
登陆成功之后就可以调用网盘 API 了。这部分比登陆的请求要好看许多。
先来获取一下网盘容量,也好确认我们确实登陆成功了:
$ curl -b cookies -c cookies 'http://pan.baidu.com/api/quota' {"errno":0,"total":510341939200,"used":0}
这些请求直接在网页版里开着 Firebug 看就可以了。比如:
列根目录下的文件信息:
$ curl -b cookies -c cookies 'http://pan.baidu.com/api/list' | json_pp $ curl -b cookies -c cookies 'http://pan.baidu.com/api/list?dir=/test' | json_pp
建立目录:
$ curl -b cookies -c cookies 'http://pan.baidu.com/api/create' -F path=/测试curl -F isdir=1 -F size= -F block_list='[]' -F method=post
参考资料
Mar 26, 2014 10:43:18 PM
我平时用 python -m json.tool 一样的效果 hoho
对了 你用什么评论回复提醒啊,经过看到你在我 blog 评论我才装了个 Send email only on Reply to My Comment :-)
Mar 26, 2014 11:00:35 PM
Python 那个命令太长啦,不过它会对键名排序,对比 JSON 文件时特别好用。
我这博客是 is-programmer.com 的站长用 RoR 写的啦,代码在 Github 上有,叫 Chito。
Mar 27, 2014 09:42:40 AM
哦 对,看见下面的 WP Theme 我就下意识地以为是 WP 搭建的了……
Apr 06, 2014 09:28:31 PM
json 的命令行解析美化感覺 jq 更iYiL好用
Apr 06, 2014 09:37:01 PM
jq 是个 minilanguage 啊,何苦呢。jshon 搞不定就直接调用 Python 好了嘛。
Apr 06, 2014 10:17:42 PM
比如 `jq .` 就是美化……`jq .data.token` 真是神器
Apr 06, 2014 11:01:28 PM
json_pp 是绝大多数系统上都会自带的吧。
jq 相应于 jshon 的 -u 的操作怎么做?
Jul 27, 2014 09:21:19 PM
仙子老大,使用用户信息登录那一步,为什么复制粘贴到终端上可以正确返回,放到脚本中再执行就返回错误吗呢?前面几步我都分别调试了,就这一步不行 :)
Jul 27, 2014 09:28:36 PM
大概是脚本写错了吧……你对比一下脚本发送的数据和 curl 发送的数据呢?(curl 可以用 -v 选项来显示与服务器的交互信息)
Jul 27, 2014 09:49:26 PM
我都改成差不多直接全复制到脚本了,还是不行 :( ~~~ 执行脚本是返回err_no=100023,单独执行返回0
Jul 27, 2014 09:50:53 PM
那个tt时间字段有影响吗?
Jul 27, 2014 09:54:59 PM
curl -b cookies -c cookies https://passport.baidu.com/v2/api/?logincheck&token=$TOKEN$&tpl=mn&apiver=v3&tt=$(date +%s)&username=$ACCOUNT&isphone=false
另外单独命令时,上面这个获取TOKEN时,有时可以,有时返回the fisrt two args should be string type:0,1!
Jul 28, 2014 01:47:44 PM
不知道,慢慢尝试吧……
Jul 28, 2014 01:51:03 PM
多谢老大 :) 现在不知道咋整好了,原因我还没明白。可能是用变量时引号的处理不对,单引、双引和不用这三个把我整晕了,原先只知道双引里的会被shell解释,单引的不解释,还有别的啥区别呀......
Jul 28, 2014 06:26:03 PM
哦看出来了,你原来不懂 shell……上边那条命令都打错了的说…………
Jul 29, 2014 08:48:10 AM
:P 啊?,这句又试了一下,可以执行呀,求指点弥筋啊老大
Dec 12, 2015 06:40:32 PM
请问楼主download和upload参数怎么写,TNKs!
Dec 12, 2015 08:49:10 PM
这个你自己在 GitHub 上找一下相关代码吧。我已经很久没关注过百度网盘了。