1. 程式人生 > >linux curl模擬登入網頁

linux curl模擬登入網頁

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