HttpClient模拟登录流程

不管是抢购火车票还是电商网站上抢购商品,如果在节假日没有抢购工具是很难靠手动抢到的,所以市面上的抢购工具也是层出不穷,但流程都是差不多的,大体上分为2步:

1.模拟用户登录
2.发送订单请求

今天主要介绍一下第一步:模拟用户登录,作为登录我也把它拆分成了这4步:

1.准备登录
2.验证码
3.执行登录请求
4.验证登录是否成功

准备
1.chrome浏览器:因为需要借助chrome强大的开发者工具
2.开源中国的在线工具:密码的加密解密和一些格式化工具方便查看
3.eclipse:开发工具

模拟登录–以下仅供个人学习使用

1.分析请求地址

主要分析验证码的请求,登录的请求,以及为登录提供参数的请求,选定一个网站比如:开源中国,进入它的登录界面:https://www.oschina.net/home/login,这时候打开开发者工具(ctrl+shift+i),如图:
chrome

我们主要关心的是Network这个标签页

验证码的请求:
我们发现有些网站没有验证码比如:开源中国和京东,还有些直接需要验证码比如:华为商城,其实这些没有验证码的网站只是在正常登陆的情况下没有,当出现一些非正常情况会出现验证码,比如连续多次登陆失败,所有我们可以通过这个方式让验证码框出现,如下图:
1

这时候我们想获取验证码的请求就很容易了,点击:换另外一张图片,这时候看Network标签:

2

我们可以开启另外一个浏览器标签页:https://www.oschina.net/action/user/captcha,每次刷新都产生一个新的验证码

登录的请求:
为了方便查看登录请求地址,我们可以写一个错误的密码,方式和上面一样,如下图所示:

3
是以post方式发送的请求,所有我们需要找到Form Data,在Headers标签的最下面就是Form Data数据:

email:******@126.com
pwd:90ba8346f7f1a304a0e53abbf97ebc5051a3837d
verifyCode:
save_login:1

一共4个参数,分别是:用户名,密码,验证码和save_login,这个参数还是比较少的,都是用户自己输入的参数,没有需要我们获得额外的参数;
关于pwd参数,有些网站是加过密的比如:开源中国,这里具体用的什么加密算法,其实我们刚开始并不用去查看网页的JavaScript脚本,找出里面到底用的什么算法,我们可以用穷举法,因为常用的加密算法就那么几种:md5,base64,aes,des,sha1等,所有我们完全可以先大致看一下,很幸运当前使用的加密算法是:sha1

为登录提供参数的请求:
这个请求是根据登录的请求来的,如果我们在Form Data中有一些其他的参数,这时候就需要额外的请求来获取Form Data中的参数,比如在模拟京东登录的时候就有这个需求,一般情况下需要请求的地址就是登录页面https://www.oschina.net/home/login,很多参数都在你进入登录界面的时候发送过来了,但具体参数在什么地方就不确定了,有可能在html代码里面,也可能在脚本里面,也有可能是其他的某个请求,这个就需要根据实际情况,自己做一些分析

2.整理思路写代码

整体思路就是刚刚上面提到的:

1.准备登录
2.验证码
3.执行登录请求
4.验证登录是否成功

代码结构:

/**
* 登陆 分成4个步骤: 1.为登录准备必要的参数 2.获取验证码 3.执行登录 4.验证登录成功
*/
public void login() {
  try {
   readyLogin();

   getAuthCodeImage();
   getInputAuthCode();

   int result = executeLogin();
   if (result == Constants.SUCCESS) {
   testLogin();
  }
  } catch (Exception e) {
   logger.error("登陆异常", e);
  }
}

/**
* 准备登录
*
* @throws Exception
*/
protected abstract void readyLogin() throws Exception;

/**
* 执行登陆
*
* @return 登陆的结果
*/
protected abstract int executeLogin() throws Exception;

/**
* 登陆成功,进行测试
*
* @throws Exception
*/
protected abstract void testLogin() throws Exception;

/**
* 获取验证码图片
*
* @throws Exception
*/
private void getAuthCodeImage() throws Exception {}

/**
* 获取用户输入的验证码
*
* @throws IOException
*/
private void getInputAuthCode() throws Exception {}

/**
* 获取准备登录地址
*
* @return
*/
protected abstract String getReadyLoginUrl();

/**
* 获取验证码图片地址
*
* @return
*/
protected abstract String getAuthCodeImageUrl();

/**
* 获取登陆地址
*
* @return
*/
protected abstract String getLoginUrl();

针对这个结构分布模拟了:开源中国,京东,华为商城 3个网站的登录

详细代码:https://github.com/ksfzhaohui/simulation-login

总结

其实模拟登录说白了就是看你对http协议是否了解,还有就是细心观察,当然还有其他一些网站可能就不那么简单了,比如淘宝,可能还需要其他方面的知识,比如加密解密.

最后再说一遍:以上仅供个人学习使用