模拟登陆流程

不论是抢购火车票仍是电商网站上抢购商品,若是在节假日没有抢购工具是很难靠手动抢到的,因此市面上的抢购工具也是层出不穷,但流程都是差很少的,大致上分为2步:html

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

今天主要介绍一下第一步:模拟用户登陆,做为登陆我也把它拆分红了这4步:java

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

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

模拟登陆--如下仅供我的学习使用github

1.分析请求地址算法

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

咱们主要关心的是Network这个标签页浏览器

验证码的请求:
咱们发现有些网站没有验证码好比:开源中国京东,还有些直接须要验证码好比:华为商城,其实这些没有验证码的网站只是在正常登录的状况下没有,当出现一些非正常状况会出现验证码,好比连续屡次登录失败,全部咱们能够经过这个方式让验证码框出现,以下图:eclipse

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

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

登陆的请求:
为了方便查看登陆请求地址,咱们能够写一个错误的密码,方式和上面同样,以下图所示:

是以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协议是否了解,还有就是细心观察,固然还有其余一些网站可能就不那么简单了,好比淘宝,可能还须要其余方面的知识,好比加密解密.

最后再说一遍:以上仅供我的学习使用

相关文章
相关标签/搜索