不论是抢购火车票仍是电商网站上抢购商品,若是在节假日没有抢购工具是很难靠手动抢到的,因此市面上的抢购工具也是层出不穷,但流程都是差很少的,大致上分为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协议是否了解,还有就是细心观察,固然还有其余一些网站可能就不那么简单了,好比淘宝,可能还须要其余方面的知识,好比加密解密.
最后再说一遍:以上仅供我的学习使用