论坛首页 Java企业应用论坛

HTTPClient模拟登陆开心网001

浏览 19179 次
精华帖 (3) :: 良好帖 (3) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-13   最后修改:2010-04-16
网站登陆分类

不考虑HTTPS,网站通过浏览器登陆大约可以分为如下几类
  • 密码明文传输,用户在浏览器输入用户名密码,然后用明文传输到网站。人人网就是这种做法。
  • 使用HTTP协议Authentication机制,一般网站使用的少。
  • 使用JS对用户输入的密码进行处理,网络上不用传输明文密码了。开心001采用的这种做法。
另外: 有些网站也提供接口,让用户可以编写客户端来访问网站,例如amazon s3。



开心001的登陆开发实践

和人人一样,我在做开心001登陆开始的时候也是使用badboy录制登陆过程,用jmeter重放。发现登陆时并没有直接发送密码明文,而是用如下两个参数代替:
引用
encypt
rpasswd

猜测开心可能使用了一个encyptKey(encypt)对用户输入的密码进行处理,生成一个rpasswd。通过firebug追踪登陆过程,证实了这个猜想:如果用户没有登陆,每次访问登陆页面时,服务器会发一个encyptKey到客户端,返回在网页里(保存成javascript变量的形式),用户输入密码并提交后,会运行一段js代码,这段代码会使用encyptKey对密码进行处理,生成rpasswd参数发送给服务器进行校验。由于每次访问登陆页面服务器返回的验证码不同,这就使得你在某次录制产生的参数下次就不能登陆。

发现这个问题后,尝试了如下解决方法:
  • HTTPClient是否能够模拟点击按钮,也就是说用HTTPClient完全模拟用户登陆全过程。遗憾的是,HTTPClient并不支持这个功能。
  • 是否有其它工具。HTTPUnit可以用了模拟用户点击,但是下载尝试以后,发现HTTPUnit并不好用,这条路没有尝试成功。
  • 在java中实现开心001网页里js要实现的功能,也就是:首先分析出encyptKey,然后用这个encyptKey加上自己实现js功能部分产生rpasswd,再发送到服务器验证。但是开心001关于验证的js100多行,涉及大量位运算,在java里无bug的实现还是需要相当工作量的。
  • 经过仔细考虑,想到: 如果在java里面可以调用js,那么直接调用js的功能产生rpasswd不就可以了吗? 很快就找到rhino这个工具,实践中这个工具非常好用,让人再一次感到了做java程序员的快乐

最终的登陆流程

  • 登陆页面,找到登陆页面中关于验证这块的js代码,并保存放到java可以访问的地方
  • 访问登陆页面,从页面中分割出encyptKey
  • 使用rhino访问前面保存的js,使用encyptKey产生服务器需要的参数rpasswd
  • 向服务器发送参数进行验证

源码参考附件,运行前加一下开心的账号和密码。


验证码问题 (补充)
上一个帖子里,很多人问到验证码问题,关于验证码,个人简单看法如下:
  • 很多大网站为了提高用户体验在用户第一次登陆时不要求用户输入验证码。只有在用户密码输入错误后,才会要求输入验证码。
  • 如果验证码是服务器端产生的,除了分析图片,也没有更好的方法,如果验证码是客户端产生的,比如: 使用js产生的,可以使用rhino来模拟得到这个验证码。
  • 一般来说,登陆后,大部分网页都可以访问,大部分操作都可以模拟。但是有些操作,比如说发文章,通常要求输入验证码,就比较难做到自动化。如果你发现哪个网站写文章不要去输入验证码,你就去写个机器人去刷屏吧,就象javaeye的问答频道一样


注: Foxswily提供了一个更好的工具HTMLUnit,直接模拟点击网页,我没有实践过,建议大家可以试一下。
http://www.iteye.com/topic/644353

有人提到Selenium,这个我以前没有用过,看起来不错,有空可以试一下。
   发表时间:2010-04-14  
顶~~~~期待新作~~不只是登录 还加点  发帖哈~
0 请登录后投票
   发表时间:2010-04-14  
gstarwd 写道
顶~~~~期待新作~~不只是登录 还加点  发帖哈~

有的网站发帖虽然没有注册码~~但是也是 有限制的哦~~那就更难处理了 是不
0 请登录后投票
   发表时间:2010-04-14  
gstarwd 写道
gstarwd 写道
顶~~~~期待新作~~不只是登录 还加点  发帖哈~

有的网站发帖虽然没有注册码~~但是也是 有限制的哦~~那就更难处理了 是不


恩,这种限制可能类似“字数限制”或是“一段时间发帖数”限制,比较BT就是关于“和谐”的限制,比如说javaeye居然不让输入“绿-坝”, 不过这些都可以在实践中根据不同情况来处理吧。
0 请登录后投票
   发表时间:2010-04-14   最后修改:2010-04-14
~~呵呵  期待一下你的续集
0 请登录后投票
   发表时间:2010-04-14  
哈哈 你又发这个了 呵呵 支持你 在多写点功能
0 请登录后投票
   发表时间:2010-04-14  
问问,有没有工具能够监测c/s客户端的登录过程

ps:我现在玩的是三国策6,一直不知道怎么做个自动登陆器,badboy好像只对网页有效
0 请登录后投票
   发表时间:2010-04-14  
whaosoft 写道
哈哈 你又发这个了 呵呵 支持你 在多写点功能


呵呵,基本上没有什么续集了。对豆瓣的API有点兴趣,不过没时间搞了。
0 请登录后投票
   发表时间:2010-04-14  
fengsky491 写道
问问,有没有工具能够监测c/s客户端的登录过程

ps:我现在玩的是三国策6,一直不知道怎么做个自动登陆器,badboy好像只对网页有效


不好意思,没搞过。 
0 请登录后投票
   发表时间:2010-04-14  
有更简单的实现
htmlunit  http://htmlunit.sourceforge.net/
可以模拟点击按钮等等,属于在httpclient更高一层的应用,本意用于测试,实际用来模拟登录效果异常的好。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics