模拟登录网页

关键词:JS跨域,PHP Curl
作者:BIce 创建时间:2014-02-15 20:57:26

 

最近上班碰到一个用户体验不好的系统。我需要每天登陆系统执行一些简单的操作,十分频繁。但是每次访问都要输入用户名密码,极其讨厌。最让人不爽的是,此登录页面明明有个“记住密码”选项,但是经过源码分析之后,发现这个功能只有在用户是有管理权限是才可用,否则你怎么点也不好使,而且就算有管理权限,也只有7天的Cookie,超时就要重输,让人无语。顺便说一句,这个登录页没有验证码。

在本人强迫症的压力之下,只能考虑一下怎么样能不让我这个懒人总是每次输密码。经过一番思索,找到了一些可行的方案:

1.    修改本地Cookie时限

最直接的想法,此页面是通过读取本地Cookie来获取保存的用户名和密码的,既然现在的问题是Cookie的存在时间有所限制,那么能不能通过修改本地Cookie改掉这个限制呢?

 

传送门 Cookie各种知识:http://www.jb51.net/article/33717.htm

 

2.    使用JS代码跨域调用其登录接口

经过查看源码,发现源网页是采用AJAX方式,Post JSON数据的方式传递登录数据的(用的JQuery ^_^

楼主就想,是不是可以使用JS跨域AJAX请求的方法来向服务器发送数据,模拟登录,然后一个华丽的window.location.href=登录后页面来解决这个问题呢?

经过楼主研究,发现JS跨域一般有两个方法,一是

使用JQuery的JSONP方式来进行跨域调用

传送门:JSONP 知识:

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

(注:完整的JSONP方式需要能控制两个域的代码才行,且JSON格式与JSONP不同,需要进行一定格式的修改,但是我们只是模拟登陆一下,不考虑复杂逻辑的话就不用管它啦)

 

楼主的JS代码如下:

function Login(){

var queryStr="username=XXX&password=YYY";

//调用jQuery Ajax

$.ajax({

async:false,

url: "XXX/login",

type: "POST",

dataType: 'jsonp',

jsonp: 'jsoncallback',

data: queryStr,

timeout: 5000,

success: function (json) {

//alert("登陆成功");

},

error: function(xhr,status,error){

                   //alert("登陆失败");

}

});        

}

window.onload=function(){

//Login();

postDomain();

setTimeout(function(){

          window.location.href="XXX/index";

},500)

}

         然后新建一个html页面,包含此代码,需要时直接用浏览器打开此html页面就可以登录到系统中了。

         随后楼主用自己之前的网站实验了一下,发现可以达到目的,但用实际系统进行测试时发现竟然不行。这着实让楼主郁闷了一下下,后来经过检验,发现了原因:

         JQueryJSONP方式是采用AJAX Get的方式,而目标系统的页面只接受Post数据,(Get返回的是另一个页面。。晕。)

楼主只能放弃这个想法,想个别的方法了。

 

刚才说过JS跨域除了JSONP还有别的方法,楼主找到的就是这一种:

动态生成iframe,利用其中的form来完成提交动作

JS代码如下:

function postDomain(){

var username='XXX'

var password='YYY'

var form == "<form action=XXX/login' method='post'>"

                                    +"<input type='hidden' name='username' value='"+username+"'>"

                                    +"<input type='hidden' name='password' value='"+password+"'>"

                                    +"</form>";

$("#isso").remove();

$('body').append("<iframe id="isso" name="isso" style="display:none"&rt;</iframe&rt")

//延迟执行

setTimeout(function () {

$("#isso").contents().find('body').html(form);//创建表单

$("#isso").contents().find('form').submit();//提交表单

}, 10);

}

window.onload=function(){

//Login();

postDomain();

setTimeout(function(){

window.location.href="XXX/index";

},500)

}

 

此方法的使用方式与上一个类似,在使用了这个方法之后楼主觉得应该没问题了,但是试验的时候发现还是不行!

经过再次研究,楼主发现问题所在:iframe 中利用 form提交的Post方式采用的不是AJAX方式的提交,而这个让我无语的服务器不接受普通的Post请求,接受到Post之后直接给我重定向到另外一个缺省页面了。

 

到这时! 楼主觉得终于要祭出自己的杀手锏了 !!

 

 

3.    使用Selenium IDE自动化登录

楼主也是干过测试的人,自动化测试当然也了解过一些,Selenium当然是用过的了。安个Firefox,然后下个Selenium IDE插件(Selenium IDE也有IE对应版本)。使用脚本录制功能,自己登录一次;然后稍微修改一下代码,比如加个忙等,去除不需要的代码等等就可以用了。

下次用的时候,调出Selenium IDE,一键就可以看到你想看的页面了,省的输密码和找相关位置了。

 

楼主终于成功啦!

 

4.    使用PHP Curl模拟异步请求

当然,上面三个方法都是有硬伤的,比如不能应对有验证码的页面。当有这种页面或者有更复杂的需求的时候,我们还可以使用程序来进行HTTP请求的模拟,如PHP Curl,这种方法是比较有效、治本的方法。相应的,此方法的缺点是需要编写的代码比上面方法的多,并且需要对返回数据进行处理,给用户展现,不能使用现成的浏览器。

传送门:

PHP Curl知识http://www.nowamagic.net/librarys/veda/detail/124

PHP Curl登录新浪微博http://www.oschina.net/code/snippet_133429_13188

 

解决方案如下:首先使用PHP Curl将登录用户名和密码以POST的方法完成登录;然后使用登录成功的Cookie请求需要访问的页面;随后对页面数据进行处理,选取出我们关心的数据,并以合适格式展现出来。(测试环境有限,此方式还没有代码实现,等楼主闲下来时试试)。

 

5.    其他

楼主在搜索方法的过程中,还看到了有一些其他的方法,比如说:利用Flash解决JS跨域AJAX Post的方法:http://www.kuqin.com/webpagedesign/20090310/38918.html

 

最后,好久不写代码了,人都不适应了,嗯以后要找周末的时间锻炼一下编码技术啊。

 

留言功能已取消,如需沟通,请邮件联系博主sunswk@sina.com,谢谢:)