phantomJS利用cookie實現自動登入
阿新 • • 發佈:2019-02-05
phantomjs是一個基於webkit核心的無頭瀏覽器。即沒有UI介面的一個瀏覽器,只是其內的點選、翻頁等人為相關操作需要程式設計實現。PhantomJS提供JavaScript API介面,即通過編寫js程式可以直接與webkit核心互動,在此之上可以結合Java語言等,通過Java語言呼叫js等相關操作。
cookie可以用來進行自動登入,原理大致是:第一次登入成功後,伺服器會生成和該使用者對應的token存於快取或其他庫中,下次當用戶開啟該網站後,會在請求中攜帶該站點的cookie資訊,其中cookie的value伺服器拿到後,會進行使用者的比對,如果匹配成功,使用者就可以置為已登入狀態,這樣就省去了每次輸入使用者名稱密碼的繁瑣。
cookie必須有name,value等屬性,下邊順帶會提到。
從API中,我們可以知道幾個必填專案,name、value、path屬性。var webPage = require('webpage'); var page = webPage.create(); phantom.addCookie({ 'name' : 'Valid-Cookie-Name', /* required property */ 'value' : 'Valid-Cookie-Value', /* required property */ 'domain' : 'localhost', 'path' : '/foo', /* required property */ 'httponly' : true, 'secure' : false, 'expires' : (new Date()).getTime() + (1000 * 60 * 60) /* <-- expires in 1 hour */ });
百度的自動登入並截圖實驗
我們知道百度的首頁,在不登陸的時候,右上方沒有自己的使用者名稱資訊,而且頁面也沒有新聞等的板塊。
我們可以先用自己的使用者名稱登入一次,在除錯中看到我們的cookie資訊:
我們可以看到cookie資訊中,有很多key-value對,有一些使用者的其他資訊。我們需要的是 BDUSS 這個 name, 後邊的一串很長的值,就是我們的 value。複製出來,然後編寫js檔案 test.js 如下:
var page = require('webpage').create(); var address = 'http://www.baidu.com';//填寫需要列印的檔案位置 var output = './screen.png';//儲存檔案路徑和名稱 page.viewportSize = { width: 1280, height: 800 };//設定長寬 var flag = phantom.addCookie({ "domain": ".baidu.com", "expires": "Fri, 01 Jan 2038 00:00:00 GMT", "expiry": 2145916800, "httponly": false, "name": "BDUSS", "path": "/", "secure": false, "value": "zlNbXXXXXXXXXXXXXZZR" //這裡省略了,輸入自己的value即可 }); console.log(flag); if(flag){ page.open(address, function (status) { if (status !== 'success') { console.log('Unable to load the address!'); phantom.exit(); } else { window.setTimeout(function () { page.render(output); phantom.exit(); }, 500); } }); }else{ console.log('error!!!'); }
執行完畢後,我們可以看到我們自己的截圖,是自己使用者名稱的登入狀態。截圖如下,(我是在windows筆記本上獲取的cookie,然後放在另一臺linux伺服器上執行的phantomJS指令碼進行自動登入截圖的,其實cookie拿到哪裡都能用,只要注意cookie的過期時間不要過期就行)。
phantosJS截圖可以看到已經處於登入的狀態了。大家有問題可以留言交流。