nodejs模拟登录网站出错,请大神帮忙解决,成功后支付宝请喝咖啡!
发布于 8 年前 作者 fxjs 5680 次浏览 来自 问答

代码如下:

var request = require("superagent");
// 登录信息
var userinfo = {
    email: "1026344755@qq.com",
    password: "123456",
    validateCode: undefined,
    chk: '844c02'
}

// 获取sessionID
var LogonHeader = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, sdch",
    "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4,zh-TW;q=0.2,gl;q=0.2",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36"
}

// 设置头
var headers = {
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4,zh-TW;q=0.2,gl;q=0.2",
    "Content-Type": "application/json;charset=UTF-8",
    "Origin": "http://www.xiguaji.com",
    "Referer": "http://www.xiguaji.com/Login",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36"
}

// 目标地址
var origin = 'http://www.xiguaji.com',
    urls = {
        logon: origin + "/Login",
        login: origin + '/Login/Login',
        checkIn: origin + '/MArticle/Explore/?partial=1&tagIds=35,33,27,26,1443,1500,97,28,29,32,34,30,31,36,1434,128,37&pubHours=12&articleType=0'
    };

// 创建一个类
function AutoCheckIn() {
    this.cookie = {
        value: null
    };
    this.init();
}

// 扩展类的原型方法
AutoCheckIn.prototype = {
    constructor: AutoCheckIn,
    init: function() {
        var that = this;
        that._login();
    },

    // 进入login页面取得session
    _logon: function(cb) {
        var that = this;
        request
            .get(urls.logon)
            .set(LogonHeader)
            .end(function(err, doc) {
                if (err) return err;
                var cookie = doc.headers["set-cookie"];
                // 打印获取到的cookie 为什么这里显示多了个httpOnly呢 浏览器抓包是没有httpOnly的啊 疑惑①
                console.log("获取session cookie", cookie);
                that.cookie = {
                    value: cookie
                };
                cb(that.cookie);
            });
    },

    // 带上上面的session和header头post登录页面/Login/Login 取不到正确的cookie啊
    _login: function(cb) {
        var that = this;
        that._logon(function(cookie) {
            request
                .post(urls.login)
                .set(headers)
                .set('Cookie', cookie.value)
                .send(userinfo)
                .redirects(0) // 防止页面重定向
                .end(function(err, doc) {
                    if (err) return err;
                    var cookie = doc.headers["set-cookie"];
                    // 这里出来的cookie不对了 请大神赐教 疑惑②
                    console.log("登录cookie:", cookie);

                })
        })
    }
};

var xgjAccount = new AutoCheckIn();

// 错误的cookie如下
//获取session cookie [ 'ASP.NET_SessionId=d5fh4k005odhq4ceghi11spt; path=/; HttpOnly',
//    'ASP.NET_SessionId=d5fh4k005odhq4ceghi11spt; path=/; HttpOnly',
//    'XIGUA=UserId=103dad732c906557; path=/',
//    'XIGUASTATE=XIGUASTATEID=ff6337736dce4301868ac7be722231be; expires=Fri, 31-Dec-9999 23:59:59 GMT; path=/' ]
//登录cookie: [ 'XIGUASTATE=XIGUASTATEID=31d85d3af41b4e038038a9ad6dc36412; expires=Fri, 31-Dec-9999 23:59:59 GMT; path=/' ]


// 浏览器抓到的正确的cookie
//Cookie:ASP.NET_SessionId=qdakoik4jr1exrfwhfiee0u0; XIGUASTATE=XIGUASTATEID=213a7adbd2004d77a585ca9c9aec240b; Hm_lvt_72aa476a79cf5b994d99ee60fe6359aa=1458009506,1458009794,1458011440,1458011456; Hm_lpvt_72aa476a79cf5b994d99ee60fe6359aa=1458021618; XIGUA=UserId=4696d935bfbcae04&checksum=f15e138f2e88

请问如何才能正确登录这个网站呢?谢谢。 ** 会的加我qq吧,1026344755#qq.com,注,nodejs大神 **

10 回复

好悲催,竟无人作答,若有大神帮忙实现,支付宝请喝咖啡的哦。谢啦

好好排下版吧代码好难看

@chemdemo 临时看了下makrdown语法 已重排版

一个是字符串的cookie 一个是数组的cookie,传的时候要把数组转成字符串。另外如果就是实现登录,把浏览器抓的cookie拷贝过来,不要这样取了

@ralcen 浏览器关闭 这个 cookie session就失效了, 我拿浏览器登录过的session cookie, 这样登录不上啊

superagent不是很清楚,相比手动管理cookie

request中设置jar: true就好

看这里看这里

  1. 可以直接用 superagent.agent 来设置 cookie 信息
  2. 登录参数 chk 由模版生成,会和 cookieSession 校验,需要动态设置
'use strict';

// 调用 superagent.agent 不用手动处理 set-cookie
const agent = require('superagent').agent();

agent
  // 第一次调用,获取登录参数 chk,需动态获取
  .get('http://www.xiguaji.com/Login')
  .end((err, res) => {
    agent
      // 第二次调用,进行账号密码校验
      .post('http://www.xiguaji.com/Login/Login')
      // 设置 xhr 请求,绕过格式校验
      .set('Content-Type', 'application/json; charset=utf-8')
      .send({ 
        email: 'banana@qq.com', 
        password: '123456', 
        chk:parseChk(res), 
        validateCode: ''
      })
      .end((err, res) => {
        // 成功验密
        console.log('--------------->', JSON.parse(res.text));
      });
  });

function parseChk(res) {
  const text = res.text;
  const r = /chk:'(\w*)',/.exec(text)[1];
  return r ;
}

没有能登录的账号,应该能跑通啦 untitled1.png

.end((err, res) => {
            // 成功验密
            //console.log(res);
            console.log('--------------->', JSON.parse(res.text));
            
            agent
				// 访问一个后台页面
                .get('http://www.xiguaji.com/Member')
                .end((err,res) => {
                    console.log('memeber-->', res.text);
                });
        });
---------------> { Status: true, RedirectUrl: '/Member' }

@elrrrrrrr 太感谢你了 跑通了, 只是get后台里的页面 每次都要重新登录获取一下新的session吗 ,可不可以保存这个cookie session呢? 兄弟把支付宝发我,请喝咖啡 !

成功登录以后,在回调里继续用 agent 访问后面的页面就可以啦 cookieSession 已经有登录态啦

谢谢老板 -3-  untitled1.png

@elrrrrrrr 董兄 查收支付宝 大杯拿铁“咖啡”已送上

回到顶部