Node.js:實現知乎(www.zhihu.com)模擬登錄,獲取用戶關注主題

     

 

      前一段時間,在瞎看看 Node.js,便研究經過 Node.js 實現知乎模擬登錄。相信,有不少網站有登錄權限設置,如若用戶未登錄,將會跳轉至首頁提醒用戶登錄,沒法瀏覽部分頁面。node

     如如果 b/s 架構,確定是離不開 http(s) 協議,而 http(s) 協議又爲無狀態,爲了實現狀態保存,出現了 cookie/session,所以,登錄後,保存用戶登錄狀態,無非不就是利用 cookie/session 實現以上功能。cookie 與 session 有所不一樣,其中 cookie 保存在客戶端,而 session 則保存在服務器端,不過,session 其中的 sessionid 將會保存中 cookie 中。api

      終上所述,實現模擬登錄,獲取用戶關注主題,將分爲如下幾步。數組

首先,進行模擬登錄,不過,在登錄過程當中,要將提交至服務器參數填充完整(通常包括用戶名、密碼、隨機數等)。瀏覽器

在登錄成功後,服務器將會經過 Set-Cookie 指令向客戶端寫入 Cookie 。以後,通常網站即會進行跳轉至登錄前頁面
(因此,須要在頁面跳轉前獲取 Cookie 值進行保存)。服務器

向目標 URL 發送請求,此時,該目標 URL 在請求報文頭中的 cookie 信息加入前一步獲取的登錄 cookie 信息。cookie

 

    而實現以上功能,確定離不開 Chrome F12 開發者工具分析,而在 Node.js 中,則利用到了 Superagent、Cheerio 模塊,其中 Superagent 可模擬瀏覽器請求,而 Cheerio 模塊則相似於服務器端 jQuery ,常常 DOM 操做增刪查改的同窗,確定不會陌生,同時,其 API 也與瀏覽器端的 jQuery 類庫極其類似。session

 

      一 首先,分析權限頁面所需 Cookie 信息,打開 Chrome F12 開發者工具,選擇 Sources --- Cookies ,可查看頁面 Cookie 信息,可點擊 Cookie 值進行刪除操做,後再刷新頁面,看是否會跳轉至登錄頁面。經過重重排除可知,該頁面須要名爲 z_co 的 cookie 信息,方可打開目標權限頁面,從而,在模擬登錄,保存 set-cookie 指令中名爲 z_c0 的 cookie 信息。架構

 

     

     二  接下來,一樣採用 F12 開發者工具分析,在登錄過程,Post 請求中傳遞的參數信息,包括 _xsrf、email、password、remeber_me 四個參數,除 _xsrf 外,至關於都爲已知參數。再經過 ctrl+shift+f 全局搜索 _xsrf 可知,其值爲一個隱藏 input type='hidden' 標籤 value 屬性,對 Dom 參數及值進行修改,於是,可進一步分析此參數,能否隨意填寫。app

 

      

 

    經過,對於登錄頁面 Dom 結構分析,可明顯示發現 id 爲 _xsrf 標籤信息,然後,本人嘗試修改其 value 值,然後點擊提交,發現其在 JS 中應該有作相關處理,而並不是本人修改後的值。而該值獲取,亦可採起最爲簡捷的 Superagent 模塊獲取頁面所有字符串,以後,便可採用 cheerio 獲取 id 爲_xsrf 標籤,從而獲取其值。工具

 

 

// 引入 superagent、cheerio
var superagent= require("superagent");
var cheerio=require("cheerio");

// 登錄 url 、目標 url
var url={
url:"http://www.zhihu.com/",
login_url:"http://www.zhihu.com/login/email",
target_url:"https://www.zhihu.com/collections"
};


// 瀏覽器請求報文頭部部分信息
var browserMsg={
"User-Agent":"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36",
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'
};



var cookie;


// post 參數信息,其中,還差先前分析的 _xsrf 信息
var loginMsg=
{
password:"xxxx ",
remember_me:true,
email:"xxxxx"
};


// 獲取 _xrsf 值
function getXrsf(){

superagent.get(url.url).end(function(err,res){
if(!err){
var $=cheerio.load(res.text);
loginMsg._xsrf=$('[name=_xsrf]').attr('value');
}else
console.dir(err);

});
}


// 發送登錄請求,獲取 cookie 信息
function getLoginCookie() {
// 首先,需在 set 方法中設置請求報文中參數,以性器官免服務器端有針對非瀏覽器請求作相關處理
// send 方法中設置 post 請求中需提交的參數
// redirects 方法調用,其中參數爲 0 ,爲了不在用戶登錄成功後,引發的頁面從新刷新,從而沒法獲取 cookie
superagent.post(url.login_url).set(browserMsg).send(loginMsg).redirects(0).end(function (err, response) {
if (!err) {
cookie = response.headers["set-cookie"];
console.dir(cookie);
} else

console.dir(err);
});
}

// 根據 cookie ,獲取 target 頁面關注信息
// 經過分析可知,僅取出 z_c0 的 cookie 便可,而 getLoginCookie 方法返回爲一個 cookie 數組,稍作處理便可
function getFollower(){
superagent.get(url.target_url).set("Cookie",cookie).set(browserMsg).end(function(err,response){
if (err) {
console.log(err);
} else {

var $ = cheerio.load(response.text);

// 此處,一樣利用 F12 開發者工具,分析頁面 Dom 結構,利用 cheerio 模塊匹配元素
var array = $('#zh-favlist-following-wrap .zm-item');
console.log(" 收藏夾標題 " + " " + " 收藏人數");
if (array && array.length > 0) {
array.each(function () {
console.log($(this).find('.zm-item-title>a').text() + " " + ($(this).find('.zg-num').text() ? $(this).find('.zg-num').text() : "0"));
//$(this).find('.zm-item-title>a').text();
//$(this).find('.zg-num').text();

});
}

}
});


}
  

 

        最近,身體一每天比一天差了,樓主養分跟不上了。(Node.js 新手,代碼太渣,勿噴!!!)關於 Superagent、cheerio 模塊使用可查看 api 文檔。

參考資料:

           https://cnodejs.org/topic/5203a71844e76d216a727d2e

           https://cnodejs.org/topic/5378720ed6e2d16149fa16bd

相關文章
相關標籤/搜索