首先声明:此测试,本人亲测成功,可用!
目地:了解curl命令的使用,以及用途,功能的强大
有时在批量抓取网站页面内容时,是需要处于登录状态的,否则无法获取。curl这个强大的工具可以完成这个工作。之前最好也先了解一下http POST方法,网站登录大都是用这个办法。
这里是以百度为例(下面是我个人的测试):
1、先保存用户变量- [root@cbh4 /]# ACCOUNT=qasxc5 (这里的qasxc5是我的百度用户名)
- [root@cbh4 /]# PASS=cnblackhat (这里的cnblackhat换成你的百度用户密码)
- [root@cbh4 /]# echo $ACCOUNT
[color=rgb(51, 51, 51) !important]复制代码
2、访问百度,取得cookie,保存到cookies. 查看文件可知cookie名为BAIDUID- [root@cbh4 /]# curl -c cookies www.baidu.com
- 以上命令回车会出现一大堆代码信息,不要去理会,与此同时,在你的执行目录下会生成一个文件名为:cookies
[color=rgb(51, 51, 51) !important]复制代码
以下是cookies的内容:
3、带着cookie访问这个地址,得到$TOKEN$- [root@cbh4 /]# TOKEN=$(curl -b cookies -sS "https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&class=login&tt=$(date +%s)&logintype=dialogLogin" | tr "'" '"' | json_pp -t dumper -json_opt pretty | grep token | cut -d\' -f4)
- [root@cbh4 /]# echo $?
- 0
- 执行以上命令,执行之后,检测命令执行成功,返回状态是0
[color=rgb(51, 51, 51) !important]复制代码
以上你运行第一条命令你可能会遇到错误:-bash: json_pp command not found
json_pp依赖perl安装包,你下载个perl安装包安装即可,yum直接安装不行,已测过。
perl安装包下载地址(版本是5.16.3):
perl安装步骤:- [root@cbh4 perl-5.16.3]# ./configure.gnu
- [root@cbh4 perl-5.16.3]# make
- [root@cbh4 perl-5.16.3]# make test
- [root@cbh4 perl-5.16.3]# make install
[color=rgb(51, 51, 51) !important]复制代码
安装完之后,在执行前面那条命令就不会报错了。
4、带着cookie , $TOKEN$对这个地址访问- [root@cbh4 /]# curl -b cookies -c cookies https://passport.baidu.com/v2/api/?logincheck&token=$TOKEN[ DISCUZ_CODE_4 ]amp;tpl=mn&apiver=v3&tt=$(date +%s)&username=$ACCOUNT&isphone=false
- [1] 20919
- [2] 20920
- [3] 20921
- [4] 20922
- [5] 20923
- [6] 20924
- [root@cbh4 /]# ({"errno":0,"codestring":null,"index":null})
- [1] Done curl -b cookies -c cookies https://passport.baidu.com/v2/api/?logincheck
- [2] Done token=$TOKEN$
- [3] Done tpl=mn
- [4] Done apiver=v3
- [5]- Done tt=$(date +%s)
- [6]+ Done username=$ACCOUNT
- [root@cbh4 /]#
[color=rgb(51, 51, 51) !important]复制代码
返回下面内容:
({"errno":0,"codestring":null,"index":null})
(#curl -b 和 -c 参数同时使用表示当前目录下的cookies文件读取 cookie 数据,如果接收新的到的 cookie,就写到同一个文件里去
5、使用用户信息登陆百度网盘:- [root@cbh4 /]# 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=$ACCOUNT&password=$PASS&verifycode=&mem_pass=on&ppui_logintime=57495&callback=parent.bd__pcbs__ax1ysj" | grep -F err_no
[color=rgb(51, 51, 51) !important]复制代码
会返回以下信息:
我这里错误码显示为0,表示成功,可能是别的值
6、登陆成功之后就可以调用网盘 API了,验证是否成功
6.1 获取容量:- <span style="line-height: 1.5;">[root@cbh4 /]#</span><span style="line-height: 1.5;"> </span>curl -b cookies -c cookies 'http://pan.baidu.com/api/quota'
[color=rgb(51, 51, 51) !important]复制代码
返回如下信息:
信息解释:
used:1200946201297 (容量使用了多少)
total:2209223802880 (总共容量为多大)
6.2 列出根目录下的文件信息:- <span style="line-height: 1.5;">[root@cbh4 /]#</span><span style="line-height: 1.5;"> </span>curl -b cookies -c cookies 'http://pan.baidu.com/api/list' | json_pp
[color=rgb(51, 51, 51) !important]复制代码
以下是我网盘里面的内容(如下,内容比较多,就不一一列举了):
6.3 当然也可以针对指定目录列出内容:- <span style="line-height: 1.5;">[root@cbh4 /]#</span><span style="line-height: 1.5;"> </span>curl -b cookies -c cookies 'http://pan.baidu.com/api/list?dir=/黑帽远控入门教程' | json_pp
[color=rgb(51, 51, 51) !important]复制代码
以下是我根目录下面的目录:比如这里的“黑帽远控入门教程”目录,内容如下:
6.4 这里也可以新建目录- <span style="line-height: 1.5;">[root@cbh4 /]#</span><span style="line-height: 1.5;"> </span>curl -b cookies -c cookies 'http://pan.baidu.com/api/create' -F path=/黑帽官网bbs.cnblackhat.com -F isdir=1 -F size= -F block_list='[]' -F method=post
[color=rgb(51, 51, 51) !important]复制代码
返回如下信息(以下涉及到字符编码问题,中文在平台上不显示,中文已被替换,但在下面检查的时候,是存在的):
这里我新建的目录是“黑帽官网bbs.cnblackhat.com”
到浏览器上查看一下,目录成功创建与否:
附注:第二步中取得TOKEN时,要解析返回的json数据,可以不用json_pp, 也可以用别的工具,网上可以搜到不少,作者原文用的是jshon 第四步登录中的用户信息,各字段如下(参考原作): staticpage:http://www.baidu.com/cache/user/html/v3Jump.html // baidu登录后跳转的地址
charset:UTF-8 // 编码字符集
token:$TOKEN$
tpl:mn
apiver:v3 //apiver 的值是固定的 API的版本号
tt:当前时间
codestring:留空
isPhone:false //如果用手机号码登录则ture 否则为 false
safeflg:0
u:http://www.baidu.com/
quick_user:0
usernamelogin:1
splogin:rate
username:用户名
password:密码明文
verifycode: //验证码,如果没要求验证码,就为空
mem_pass:on //记住密码
ppui_logintime:5000 //是一些登录用时间的,给个7000~10000的随机数就好了
callback:parent.bdpcbsoa36qm
|