有時在批量抓取網站頁面內容時,是需要處于登錄狀態的,否則無法獲取。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
轉載于:https://blog.51cto.com/zlyang/1728256