有時在批量抓取網站頁面內容時,是需要處于登錄狀態的,否則無法獲取。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.bdpcbsoa36qm