1. 程式人生 > >phantomJS利用cookie實現自動登入

phantomJS利用cookie實現自動登入

phantomjs是一個基於webkit核心的無頭瀏覽器。即沒有UI介面的一個瀏覽器,只是其內的點選、翻頁等人為相關操作需要程式設計實現。PhantomJS提供JavaScript API介面,即通過編寫js程式可以直接與webkit核心互動,在此之上可以結合Java語言等,通過Java語言呼叫js等相關操作。

cookie可以用來進行自動登入,原理大致是:第一次登入成功後,伺服器會生成和該使用者對應的token存於快取或其他庫中,下次當用戶開啟該網站後,會在請求中攜帶該站點的cookie資訊,其中cookie的value伺服器拿到後,會進行使用者的比對,如果匹配成功,使用者就可以置為已登入狀態,這樣就省去了每次輸入使用者名稱密碼的繁瑣。

cookie必須有name,value等屬性,下邊順帶會提到。


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 */
});
從API中,我們可以知道幾個必填專案,name、value、path屬性。

百度的自動登入並截圖實驗

我們知道百度的首頁,在不登陸的時候,右上方沒有自己的使用者名稱資訊,而且頁面也沒有新聞等的板塊。

我們可以先用自己的使用者名稱登入一次,在除錯中看到我們的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截圖可以看到已經處於登入的狀態了。大家有問題可以留言交流。