精华 用superagent和phantom玩自动登录
发布于 8 年前 作者 CarlosRen 7668 次浏览 来自 分享

今天跟大家聊聊自动登录

一、材料准备

  • nodejs
  • superagent
  • phantom
  • async 明天更

二、自动登录的原理

既然是网络应用,一定是要发数据包的(废话)

打开你的浏览器,进入请求的相关页面(一般是F12),ie低版本是要开始捕获,chrome在network里就可以了,输入你的目标网址,就可以获得请求了,用wireshark的不要举手

由于是自动登录,所以建议从打开网页开始抓,到登录成功结束,一般第一个请求就是登录认证

一对requestresponse经常是如下的样子

(吐槽oracle工程师,login能tmd写成logon)

这时候应该有一个疑问,这些参数一般我们需要哪些参数呢?(必须有)

2.jpg

一般我们关注的有这几个点:

  • 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死活没法传形参的图片名

1.png

2 回复

截图干嘛??

logon 写错了?

回到顶部