linux curl模拟登录网页

原创
2014/07/27 12:19
阅读数 3W

有时在批量抓取网站页面内容时,是需要处于登录状态的,否则无法获取。curl这个强大的工具可以完成这个工作。之前最好也先了解一下http POST方法,网站登录大都是用这个办法。

本文基本上参考这篇文章,来自依云's Blog,是archlinux中文论坛的百合仙子大大写的,他参考的gihub上一个百度网盘资源进行访问的小程序。我只是根据理解改了几个小地方,转载请注明出处


以百度为例
先保存用户变量

$ ACCOUNT=百度帐号
$ PASS=帐号的密码

第一步

访问百度,取得cookie,保存到cookies. 查看文件可知cookie名为BAIDUID

$ curl -c cookies www.baidu.com

(#可以加 -sS 安静模式,不显示进度,其中S表示只显示错误;-o /dev/null 将眼花的输出扔掉)

第二步

带着cookie访问这个地址,得到$TOKEN$

$ 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)

第三步

带着cookie , $TOKEN$对这个地址访问

$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

返回下面内容

{"errInfo":{ "no": "0" }, "data": { "codeString" : "", "vcodetype" : "" }}

要是让输入验证码的话就哭了.......但第一次登录一般没问题
(#curl -b 和 -c 参数同时使用表示当前目录下的cookies文件读取 cookie 数据,如果接收新的到的 cookie,就写到同一个文件里去

第四步

使用用户信息登陆:

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

我这里错误码显示为0,表示成功,可能是别的值

第五步

登陆成功之后就可以调用网盘 API了,验证是否成功

  1. 获取容量:

    $curl -b cookies -c cookies 'http://pan.baidu.com/api/quota' 返回:

    {"errno":0,"used":0,"total":5368709120,"request_id":4959306489643694116}

  2. 列出根目录下的文件信息:

    $ 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

  3. 建立目录:

    $ 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

可看到返回中有这几行:

"path" : "/测试curl",
     "isdir" : 1,
     "size" : 0,
     "fs_id" : 1083516221491878,
     "category" : 6,
     "server_filename" : "测试curl",

附注:

  • 第二步中取得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.bd__pcbs__oa36qm

展开阅读全文
打赏
2
27 收藏
分享
加载中
更多评论
打赏
0 评论
27 收藏
2
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部