使用Java模拟登录

  • 运行环境
  • 步骤
    • 浏览器阶段
    • 思路
    • 编码
  • 使用python模拟登录

运行环境

本次开发在Windos上进行,运行环境为:

java 11.0.2 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)

步骤

浏览器阶段

本次模拟网站:https://www.bbaaz.com
其登录界面网址为:https://www.bbaaz.com/member.php?mod=logging&action=login

先使用浏览器打开,输入用户名、密码,然后F12打开Dev Tools,选择Network选项卡,注意勾选Preserve log,不然可能的情况是,你点了登录,由于package太多的原因,或者跳转新页面,关键的包已经舍弃掉了。
找到关键包,如下图,可以看到很多信息。


从package中可以获取到:

Request URL: https://www.bbaaz.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lm0Hi&inajax=1Set-Cookie:xxxxxForm Data
formhash: xxxxx
referer: https://www.bbaaz.com/
loginfield: username
username: xxxxx
password: xxxxx
questionid: 0
answer:

仔细观察,发现了什么,首先,Request URL带有了一个loginhash,再Form Data中带有了formhash,这些应该是防止非法登录的,那么这些数据哪里来的呢?经过注销,重新打开登陆界面,分析登录界面,可以得知这些信息,都是原登录界面的隐藏信息。

思路

那么我们的思路就是,首先,打开登录界面,从登录界面获取两个Hash值,再打开一个能存放Cookie的Request,给登录URL发送表单,记录返回的Cookie,再打开别的页面的时候,就可以通过Cookie进行访问。

编码

注意,以下编码为了便于阅读,进行了修改,编码习惯并不好,请不要学习编码习惯。

final String loginURL = "https://www.bbaaz.com/member.php?mod=logging&action=login";
String query = "&loginsubmit=yes&frommessage&loginhash=xxx&inajax=1";
String form = "formhash=xxx&referer=https://www.bbaaz.com/&loginfield=username&username=xxxx&password=xxxx&questionid=0&answer=";
final String headerAgent = "User-Agent";
final String headerAgentArg = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3562.0 Safari/537.36";
byte [] buffer;
byte [] all;
int length;
ArrayList<byte []> byteList;
ArrayList<Integer> byteLength;
int totalLength = 0;
String [] content = null;
String formhash, suffix; //两个Hash值try {// 在刚开始就使用CookieManager的原因是,经过测试,在打开登录界面的时候,服务器就会向客户端发送3个Cookie,这些Cookie同样有验证作用,如果不带上,那么登录的时候,服务器会返回,含有非法字符,无法登录CookieManager manager = new CookieManager();manager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);CookieHandler.setDefault(manager);HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL(loginURL).openConnection());httpURLConnection.setRequestMethod("GET");httpURLConnection.setRequestProperty(headerAgent, headerAgentArg);httpURLConnection.connect();if(httpURLConnection.getResponseCode() == 200) {InputStream inputStream = httpURLConnection.getInputStream();buffer = new byte[1024];byteList = new ArrayList<>();byteLength = new ArrayList<>();while( (length = inputStream.read(buffer)) != -1 ) {byteList.add(buffer);byteLength.add(length);totalLength += length;buffer = new byte[1024];}httpURLConnection.disconnect();all = new byte[totalLength];totalLength = 0;while(byteList.size() != 0) {System.arraycopy(byteList.get(0), 0, all, totalLength, byteLength.get(0));totalLength += byteLength.get(0);byteList.remove(0);byteLength.remove(0);}// 通过第一次打开的页面获取Hash值content = new String(all, "UTF-8").split("<form method=\"post\"")[1].split("name=\"formhash\" value=\"");all = null;suffix = content[0].split("loginform_", 2)[1].split("\"", 2)[0];formhash = content[1].split("\" />", 2)[0];// 第二次获取网页,会自动携带Cookie信息httpURLConnection = (HttpURLConnection) (new URL(loginURL + query.replace("xxx", suffix)).openConnection());httpURLConnection.setRequestMethod("POST");httpURLConnection.setRequestProperty(headerAgent, headerAgentArg);httpURLConnection.setDoOutput(true);httpURLConnection.connect();httpURLConnection.getOutputStream().write(form.replace("xxx", formhash).getBytes("UTF-8"));inputStream = httpURLConnection.getInputStream();buffer = new byte[1024];byteList = new ArrayList<>();byteLength = new ArrayList<>();totalLength = 0;while( (length = inputStream.read(buffer)) != -1 ) {byteList.add(buffer);byteLength.add(length);totalLength += length;buffer = new byte[1024];}httpURLConnection.disconnect();all = new byte[totalLength];totalLength = 0;while(byteList.size() != 0) {System.arraycopy(byteList.get(0), 0, all, totalLength, byteLength.get(0));totalLength += byteLength.get(0);byteList.remove(0);byteLength.remove(0);}new String(all, "UTF-8"); // 查看该页面信息,登录成功all = null;}
} catch (Exception e) {e.printStackTrace();
}

经测试,使用该方法,成功模拟登录。

使用python模拟登录

https://blog.csdn.net/yancr/article/details/88748521

使用Java模拟登录相关推荐

  1. 微信群控系统制作系列一——java模拟登录网页版微信

    PS:很多人咨询我怎么做手机群控系统,因此我开了个制作群控系统的系列,准备分五期讲解群控系统的制作.前两篇是基础内容. 今天做个简单的java模拟登录网页版微信. 既然要做模拟登录,那么我们一定要了解 ...

  2. java模拟登录获取Cookie

    关于java模拟登录获取Cookie时经历的坑 springboot 引入jar包版本 通过httpclient来模拟登录 代码部分 表单提交部分代码(未测试正确与否,只是找了前辈们的东西过来) 总结 ...

  3. 用java模拟登录正方教务系统,抓取课表和个人成绩等数据

    之前学了一些java web的编程,理解了web应用的原理后,就突然想到,可以用java模拟登录吉珠的教务系统,然后爬取里面的课表.成绩.个人信息等等数据,然后就可以写成一个简易的课表APP. 一.第 ...

  4. java 模拟登录新浪微博(通过cookie)

    java模拟登录新浪微博(通过cookie) 这几天一直在研究新浪微博的爬虫,发现爬取微博的数据首先要登录.本来打算是通过账号和密码模拟浏览器登录.但是现在微博的登录机制比较复杂.通过账号密码还没有登 ...

  5. 微信公众号java模拟登录_【微信公众平台改版后】Java模拟登录微信平台,主动推送消息给用户...

    一.简要说明 在博文<Java模拟登录微信公众平台,主动推送图文消息给用户>中提到使用Java语言登录微信公众平台,然后发送图文消息给用户,基本可以符合使用要求,但是在今年10月23日,微 ...

  6. java模拟登录新版正方_java 模拟登陆正方教务系统

    比较懒,主要说一下思路.. 1.首先正方教务系统的验证码当你不去向服务器申请的时候,可以直接无视它不需要去输入验证码.可以通过浏览器屏蔽学校教务系统的图片就可以直接输入账号密码回车进去.. 2.通过抓 ...

  7. -Java 模拟登录时需要输入验证码功能

    模拟登录时需要输入验证码功能 本文通过java,随机数实现登录时需要输入的验证码功能: 验证码有4个字符组成 验证码只能由数字和大写字母组成(机制可以随意添加更改验证码的组成元素) 验证码要求字符不能 ...

  8. Java模拟登录并抓取数据

    问题: 最近做一个抓取数据的项目,发现网上很多资料不完备,或者按照代码执行不能真实爬取数据,自己特别根据自己的网站进行登录并进行数据爬取. 未登录 登录后,正常抓取数据截图(预期目标数据) 解决办法: ...

  9. java模拟登录知乎_Android(Java) 模拟登录知乎并抓取用户信息

    前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...

最新文章

  1. Jquery和PHP Ajax JSON
  2. 修改新版am335x支持1G主频的方法[来自A Xian调试记录]
  3. maven配置开源中国镜像
  4. CF-1207 F. Remainder Problem(分块)
  5. python文件字符串操作
  6. famous javascript library.
  7. java 实现中文排序,Java自定义比较器实现中文排序
  8. python 英语翻译 excel_翻译篇Day2-用python读写Excel–数据图表篇
  9. C++ 如何释放std::function中绑定的对象
  10. scala 单例对象 伴生对象
  11. 一分钟教会你固态硬盘数据恢复方法
  12. 带大家认识下Kvaser CAN总线协议
  13. libcef-Vs2017-下载编译第一个libcef3项目
  14. Axure绘制开关按钮
  15. 如何看计算机系统是x86,怎么看电脑是x86还是x64 x64和x86有区别讲解分享
  16. 简历包装严重,作为面试官,我是如何甄别应聘者的包装程度
  17. 中华第一考----系统架构设计师考试
  18. win10系统的深度清理方法
  19. ACM学习:例题完成总结与期中心得
  20. Python 3 集合方法 add( )

热门文章

  1. Django-应用与分布式路由
  2. try anbox or waydroid (by quqi99)
  3. mysql错误1273_mysql8 参考手册--错误代码1273-1294
  4. python求平均值,python 怎么求平均值
  5. 写作分册王诚pdf_后王诚时代|老铁们,管综写作还能跟谁?
  6. Gateway路由谓词工厂实例
  7. NX二次开发 使用了一个已删除或无效的类号
  8. 【XSS漏洞-06】XSS漏洞利用案例(浏览器劫持、会话劫持、GetShell)—基于神器beEF
  9. 记事狗微博php,记事狗微博系统_366rtc
  10. fatal: unable to access ‘https://github.com/xxxxx/xxx.git/‘: OpenSSL SSL_read: Connection was reset,