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了,驗證是否成功
獲取容量:
$curl -b cookies -c cookies 'http://pan.baidu.com/api/quota'
返回:{“errno”:0,“used”:0,“total”:5368709120,“request_id”:4959306489643694116}
列出根目錄下的檔案資訊:
$ 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
可看到返回中有這幾行:
"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