首页 > Web开发 > 详细

Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题

时间:2016-03-28 18:16:28      阅读:2576      评论:0      收藏:0      [点我收藏+]

     技术分享

 

      前一段时间,在瞎看看 Node.js,便研究通过 Node.js 实现知乎模拟登陆。相信,有很多网站有登陆权限设置,如若用户未登陆,将会跳转至首页提醒用户登陆,无法浏览部分页面。

     如若是 b/s 架构,肯定是离不开 http(s) 协议,而 http(s) 协议又为无状态,为了实现状态保存,而又出现了 cookie/session,因此,登陆后,保存用户登陆状态,无非不就是利用 cookie/session 实现以上功能。cookie 与 session 有所不同,其中 cookie 保存在客户端,而 session 则保存在服务器端,不过,session 其中的 sessionid 将会保存中 cookie 中。

      终上所述,实现模拟登陆,获取用户关注主题,将分为以下几步。


首先,进行模拟登陆,不过,在登陆过程中,要将提交至服务器参数填充完整(一般包括用户名、密码、随机数等)。

在登陆成功后,服务器将会通过 Set-Cookie 指令向客户端写入 Cookie 。之后,一般网站即会进行跳转至登陆前页面
(所以,需要在页面跳转前获取 Cookie 值进行保存)。

向目标 URL 发送请求,此时,该目标 URL 在请求报文头中的 cookie 信息加入前一步获取的登陆 cookie 信息。


    而实现以上功能,肯定离不开 Chrome F12 开发者工具分析,而在 Node.js 中,则利用到了 Superagent、Cheerio 模块,其中 Superagent 可模拟浏览器请求,而 Cheerio 模块则类似于服务器端 jQuery ,经常 DOM 操作增删查改的同学,肯定不会陌生,同时,其 API 也与浏览器端的 jQuery 类库极其相似。

 

      一 首先,分析权限页面所需 Cookie 信息,打开 Chrome F12 开发者工具,选择 Sources --- Cookies ,可查看页面 Cookie 信息,可点击 Cookie 值进行删除操作,后再刷新页面,看是否会跳转至登陆页面,无法查看原有页面。通过排除法可知,该页面需要名为 z_co 的 cookie 信息,方可打开目标权限页面,从而,在模拟登陆,保存 set-cookie 指令中名为 z_co 的 cookie 信息。

 

     技术分享

     二  接下来,同样采用 F12 开发者工具分析,在登陆过程,Post 请求中传递的参数信息。其中 _xsrf、email、password、remeber_me 四个

post 参数,除 _xsrf 外,都为已知参数。通过 ctrl+shift+f 全局搜索 _xsrf 可知,其值为一个隐藏 input type=‘hidden‘ 标签,通过对 Dom 参数及值进行修改,因而,可进一步分析此参数,可否随意填写。

 

      技术分享

 

    通过,对于登陆页面 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 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("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36")
.set(‘Content-Type‘,‘application/x-www-form-urlencoded; charset=UTF-8‘).send(loginMsg).redirects(0).end(function(err,response){ if(!err){ cookie= response.headers["set-cookie"]; }else console.dir(err); } // 根据 cookie ,获取 target 页面关注信息 function getFollower(){ superagent.get(url.target_url).set("Cookie",cookie).
set("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36")
.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

 

Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题

原文:http://www.cnblogs.com/Lumia1020/p/5329945.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!