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


         

          前一段时间,在瞎看看 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_c0 的 cookie 信息。

         

         二  接下来,同样采用 F12 开发者工具分析,在登陆过程,Post 请求中传递的参数信息,包括 _xsrf、email、password、remeber_me 四个参数,除 _xsrf 外,相当于都为已知参数。再通过 ctrl+shift+f 全局搜索 _xsrf 可知,其值为一个隐藏 input type='hidden' 标签 value 属性,对 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 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

     

  • 相关阅读:
    苹果CMS
    rel=nofollow 是什么意思
    如何获得select被选中option的value和text和......
    使用phpexcel导出到xls文件的时候出现乱码解决
    Infinispan's GridFileSystem基于内存的网格文件系统,互联网营销 狼人:
    云计算的可伸缩性迫使App服务无状态化,互联网营销 狼人:
    那些你知道的和不知道的搜索引擎,互联网营销 狼人:
    IPv6的未来,互联网营销 狼人:
    互联网上五个最高级的搜索引擎,互联网营销 狼人:
    剖析IE浏览器子系统的性能权重,互联网营销 狼人:
  • 原文地址:https://www.cnblogs.com/Lumia1020/p/5329945.html
Copyright © 2020-2023  润新知