精华
用superagent和phantom玩自动登录
今天跟大家聊聊自动登录
一、材料准备
- nodejs
- superagent
- phantom
- async 明天更
二、自动登录的原理
既然是网络应用,一定是要发数据包的(废话)
打开你的浏览器,进入请求的相关页面(一般是F12),ie低版本是要开始捕获
,chrome在network
里就可以了,输入你的目标网址,就可以获得请求了,用wireshark的不要举手
由于是自动登录,所以建议从打开网页开始抓,到登录成功结束,一般第一个请求就是登录认证
一对request
和response
经常是如下的样子
(吐槽oracle工程师,login能tmd写成logon)
这时候应该有一个疑问,这些参数一般我们需要哪些参数呢?(必须有)
一般我们关注的有这几个点:
- Request URL
- Request Method
- Cookie
- Referer
三、ok开始撸代码吧
先扔一个demo,由于我准备用async做多个,所以参数提出来了,见谅咯
我的代码丑的话,希望你提出来,或者调教我
1、step 0 拼头
var request = require('superagent');
var originip = "http://10.6.10.104:19000";
var referAddr = "http://10.6.10.104:19000/workspace/index.jsp";
var header = {
Accept: "*/*",
Origin: originip,
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4',
Referer:referAddr,
"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8",
'Accept-Encoding': 'gzip, deflate',
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
}
//自己分析一下cookie的信息,是不是必须的,可以先不带cookie试试,不行再加参数
2、step 1 准备好你的URL
var origin = "http://10.6.10.104:19000/workspace/";
var url = {
login : origin + "browse/logon",
index : origin + "index.jsp"
}
3、step 2 写个对象
var autoTask = function(account){
this.account = account;
this.cookie = {
value: null,
expires: null
};
//并不需要expires,之后我会说为啥
}
autoTask.prototype.getcookie = function(){
return this.cookie;
};
autoTask.prototype.init = function(cb){
var that = this;
that._login(function(result){
cb(result);
});
};
//关键代码,这里在发送请求,具体参数拼接需要根据目标网站进行设置
autoTask.prototype. _login = function(cb){
var that = this;
request
.post(url.login)
.set(header)
.type("form")
.send({
sso_username:"username",
sso_password:"password",
action:"returnXML",
LOCALE_LANGUAGE:"zh"
})
.redirects(0)
.end(function(err,result){
var cookie = result.headers['set-cookie'];
that.cookie = {
value: cookie,
};
cb(that.cookie);
});
};
4、step 3 截个图
phantom的介绍:稍后补,现在懒得写
//这段是在用phantomjs截图,看到cnode的大神推荐后发现,这货效果很好啊!!可以有点慢,我的一套流程执行完了需要10秒左右,虽然有5秒是在等待
autoTask.prototype.ScreenCapture = function(cookieStr,cb){
var capturePic = require('./pictureIt');
var cookieinfo = cookieStr;
var url = "http://10.6.10.104:19000/workspace/index.jsp";
capturePic.ScreenCapture(url,cookieinfo,function(result){
var fs = require("fs");
var nowdate = new Date();
var newPath = "./public/system/"+nowdate.getFullYear()+(nowdate.getMonth()+1)+nowdate.getDate()+"system.png"
fs.rename("./system.png",newPath,function(err){
if(err){
console.log(err);
cb("fail on write file");
}else{
fs.unlink("./system.png",function(err2){
if(err){
console.log(err2);
cb("fail on delete temp file");
}else{
cb(result);
}
});
}
});
});
}
exports.autoLogin = function(){
return new autoTask;
};
5、step 4 如何截图?
function capture(url,cookieinfo,cb){
var phantom = require('phantom');
var header = {
"Cookie":cookieinfo
};
phantom.create(function (ph) {
ph.createPage(function (page) {
page.setHeaders(header);//带上参数们,起飞~
page.open(url, function () {
setTimeout(function(){
page.render('system.png');
ph.exit();
cb("sucess");
},5000);
});
});
}, {
dnodeOpts: {
weak: false
}
});
}
exports.ScreenCapture = capture;
6、go
大家不要学我,我偷懒直接写到string里传给phantomjs了
var express = require('express');
var router = express.Router();
var task = require('../autologin/task');
/* GET users listing. */
router.get('/', function(req, res, next) {
var obj = task.autoLogin();
obj.init(function(result){
var str = "";
str += obj.cookie.value[0].split(';')[0] + "; ";
str += "timeZone=-480; ";
str += obj.cookie.value[2].split(';')[0] + "; ";
str += obj.cookie.value[3].split(';')[0] + "; ";
str += obj.cookie.value[4].split(';')[0] + "";
obj.ScreenCapture(str,function(result){
res.send(result);
});
})
});
module.exports = router;
7、遇到的坑
- 安装phantomjs的时候,需要用gyp编译,所以python27一定要有咯
- 提示的时候说要用c艹的库,建议装个
vs2010express
- phantom的
render
死活没法传形参的图片名