nodejs模拟登录网站出错,请大神帮忙解决,成功后支付宝请喝咖啡!
代码如下:
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就好
看这里看这里
- 可以直接用 superagent.agent 来设置 cookie 信息
- 登录参数 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 ;
}
没有能登录的账号,应该能跑通啦
.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- 
@elrrrrrrr 董兄 查收支付宝 大杯拿铁“咖啡”已送上