简介

通过HttpClient获取网页数据源,通过Jsoup解析数据。先模拟登录,再获取信息。模拟浏览器正常操作,封装请求头信息获取SESSIONID。模拟登录成功后切勿断开会话,依赖登录请求得到的Cookie进行二次请求。请求信息时需打开谷歌浏览器或Fiddler抓包查看参数及请求头信息。

Maven

        <dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.8.0</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20160810</version></dependency>

基本步骤

1.获取exponent、modulus生成公钥进行密码加密

2.爬虫爬取csrftoken校验

3.添加Post参数模拟浏览器登录获取Cookie(SESSIONID)

4.二次请求

源代码

Util

package club.zstuca.util;import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;import javax.crypto.Cipher;public class RSAUtil {private static Map<Integer, String> keyMap = new HashMap<Integer, String>();  //用于封装随机产生的公钥与私钥/** * 随机生成密钥对 * @throws NoSuchAlgorithmException */  public static void genKeyPair() throws NoSuchAlgorithmException {  // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  // 初始化密钥对生成器,密钥大小为96-1024位  keyPairGen.initialize(1024,new SecureRandom());  // 生成一个密钥对,保存在keyPair中  KeyPair keyPair = keyPairGen.generateKeyPair();  RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥  RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥  String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded()));  // 得到私钥字符串  String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));  // 将公钥和私钥保存到MapkeyMap.put(0,publicKeyString);  //0表示公钥keyMap.put(1,privateKeyString);  //1表示私钥}  /** * RSA公钥加密 *  * @param str *            加密字符串* @param publicKey *            公钥 * @return 密文 * @throws Exception *             加密过程中的异常信息 */  public static String encryptByX509EncodedKeySpec( String str, String publicKey ) throws Exception{//base64编码的公钥byte[] decoded = Base64.getDecoder().decode(publicKey.getBytes("UTF-8"));RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));return outStr;} /** * RSA公钥加密 *  * @param str *            加密字符串* @param modulus *            模数 * @param publicExponent*            公众指数        * @return 密文 * @throws Exception *             加密过程中的异常信息 */  public static String encryptByRSAPublicKeySpec( String str, String modulus, String publicExponent ) throws Exception{//base64编码的公钥RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger(1,Base64.getDecoder().decode(modulus.getBytes("UTF-8"))),new BigInteger(1,Base64.getDecoder().decode(publicExponent.getBytes("UTF-8")))));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));return outStr;} /** * RSA私钥解密*  * @param str *            加密字符串* @param privateKey *            私钥 * @return 铭文* @throws Exception *             解密过程中的异常信息 */  public static String decryptByPKCS8EncodedKeySpec(String str, String privateKey) throws Exception{//64位解码加密后的字符串byte[] inputByte = Base64.getDecoder().decode(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.getDecoder().decode(privateKey.getBytes("UTF-8"));  RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));  //RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}
}

Main 

package club.zstuca.tools;import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;import club.zstuca.util.RSAUtil;import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class ZFsoft {public static void main(String[] args) {ZFsoft zFsoft=new ZFsoft();//zFsoft.login("2018329621200","xxxx");List<Score>scoreList=zFsoft.login("2018329621200","xxxx").checkScore("","");for(Score score:scoreList){System.out.println(score);}System.out.println(scoreList.size());}private final String LOGIN_URL="http://10.11.247.52/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t=";private final String PUBLICKEY_URL="http://10.11.247.52/jwglxt/xtgl/login_getPublicKey.html?time=";private final String CHECK_SCORE_URL="http://10.11.247.52/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005";private CloseableHttpClient httpClient;private BasicCookieStore basicCookieStore;public ZFsoft(){basicCookieStore=new BasicCookieStore();httpClient= HttpClients.custom().setDefaultCookieStore(basicCookieStore).build();}/*** 密码加密 RSA* @param password* @return*/private String encryp(String password){//一、获取 exponent modulus 生成公钥String exponent=null,modulus=null;HttpGet gpkHttpGet=new HttpGet(PUBLICKEY_URL+new Date().getTime());gpkHttpGet.setHeader("Accept","application/json, text/javascript, */*; q=0.01");gpkHttpGet.setHeader("Accept-Encoding","gzip, deflate");gpkHttpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");gpkHttpGet.setHeader("Connection","keep-alive");gpkHttpGet.setHeader("Host","jwgl.hebtu.edu.cn");gpkHttpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");gpkHttpGet.setHeader("X-Requested-With","XMLHttpRequest");CloseableHttpResponse gpkResponse=null;try {gpkResponse = httpClient.execute(gpkHttpGet);if (gpkResponse.getStatusLine().getStatusCode() == 200) {String emJson = EntityUtils.toString(gpkResponse.getEntity(), "utf8");JSONObject jsonObject = new JSONObject(emJson);exponent = jsonObject.getString("exponent");modulus = jsonObject.getString("modulus");}}catch (Exception e){e.printStackTrace();}finally {try {gpkResponse.close();} catch (IOException e) {e.printStackTrace();}}//二、根据公钥进行密码加密System.out.println(modulus);System.out.println(exponent);System.out.println(password);try {password=RSAUtil.encryptByRSAPublicKeySpec(password, modulus, exponent);} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}System.out.println(password);return password;}/*** 获取Token* @param timestamp* @return*/private String crawlCsrfToken(String timestamp){String csrftoken=null;HttpGet csrftokenHttpGet=new HttpGet(LOGIN_URL+timestamp);CloseableHttpResponse csrftokenResponse=null;try {csrftokenResponse = httpClient.execute(csrftokenHttpGet);if (csrftokenResponse.getStatusLine().getStatusCode() == 200) {Document csrftokenDoc = Jsoup.parse(EntityUtils.toString(csrftokenResponse.getEntity(), "utf8"));csrftoken = csrftokenDoc.select(".col-sm-4").select(".sl_log_rt").select("input[id=csrftoken]").first().attr("value");return csrftoken;}}catch (Exception e){e.printStackTrace();}finally {try {csrftokenResponse.close();} catch (IOException e) {e.printStackTrace();}}return null;}/*** 模拟登录* @param username* @param password* @return*/public ZFsoft login(String username,String password){String timestamp=""+new Date().getTime();HttpPost loginHttpPost=new HttpPost(LOGIN_URL+timestamp);loginHttpPost.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");loginHttpPost.setHeader("Accept-Encoding","gzip, deflate");loginHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");loginHttpPost.setHeader("Cache-Control","max-age=0");loginHttpPost.setHeader("Connection","keep-alive");loginHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded");loginHttpPost.setHeader("Host","jwgl.hebtu.edu.cn");loginHttpPost.setHeader("Origin","http://jwgl.hebtu.edu.cn");loginHttpPost.setHeader("Upgrade-Insecure-Requests","1");loginHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");List<NameValuePair> loginParams=new ArrayList<NameValuePair>();password=this.encryp(password);String csrftoken=this.crawlCsrfToken(timestamp);loginParams.add(new BasicNameValuePair("csrftoken",csrftoken));loginParams.add(new BasicNameValuePair("yhm",username));loginParams.add(new BasicNameValuePair("mm",password));loginParams.add(new BasicNameValuePair("mm",password));CloseableHttpResponse loginResponse=null;try {loginHttpPost.setEntity(new UrlEncodedFormEntity(loginParams, "utf8"));loginResponse = httpClient.execute(loginHttpPost);List<Cookie>cookies=basicCookieStore.getCookies();if(cookies.isEmpty()){System.out.println("The Cookie Is None.");}else {for(Cookie cookie:cookies){}}}catch (Exception e){e.printStackTrace();}return this;}/*** 查看成绩* @param xnm* @param xqm* @return*/public List<Score> checkScore(String xnm,String xqm){HttpPost scoreHttpPost=new HttpPost(CHECK_SCORE_URL);scoreHttpPost.setHeader("Accept","application/json, text/javascript, */*; q=0.01");scoreHttpPost.setHeader("Accept-Encoding","gzip, deflate");scoreHttpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9");scoreHttpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");scoreHttpPost.setHeader("Host","jwgl.hebtu.edu.cn");scoreHttpPost.setHeader("Origin","http://jwgl.hebtu.edu.cn");scoreHttpPost.setHeader("Proxy-Connection","keep-alive");scoreHttpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36");scoreHttpPost.setHeader("X-Requested-With","XMLHttpRequest");List<NameValuePair>scoreParams=new ArrayList<NameValuePair>();scoreParams.add(new BasicNameValuePair("xnm",xnm));scoreParams.add(new BasicNameValuePair("xqm",xqm));scoreParams.add(new BasicNameValuePair("_search","false"));scoreParams.add(new BasicNameValuePair("nd",""+new Date().getTime()));scoreParams.add(new BasicNameValuePair("queryModel.showCount","100"));scoreParams.add(new BasicNameValuePair("queryModel.currentPage","1"));scoreParams.add(new BasicNameValuePair("queryModel.sortName",""));scoreParams.add(new BasicNameValuePair("queryModel.sortOrder","asc"));scoreParams.add(new BasicNameValuePair("time","1"));try {scoreHttpPost.setEntity(new UrlEncodedFormEntity(scoreParams, "utf8"));CloseableHttpResponse scoreResponse = httpClient.execute(scoreHttpPost);if (scoreResponse.getStatusLine().getStatusCode() == 200) {if (scoreResponse.getEntity() != null) {String scoreJson = EntityUtils.toString(scoreResponse.getEntity(), "utf8");System.out.print(scoreJson);JSONObject jsonObject = new JSONObject(scoreJson);JSONArray jsonArray = jsonObject.getJSONArray("items");List<Score>scoreList=new ArrayList<Score>();for (int i = 0; i < jsonArray.length(); ++i) {JSONObject item = (JSONObject) jsonArray.get(i);Score score=new Score();score.setXm(item.getString("xm"));score.setKcmc(item.getString("kcmc"));score.setBj(item.getString("bj"));score.setCj(item.getString("cj"));String jd = "0";try {jd = item.getString("jd");} catch (Exception e) {e.printStackTrace();}score.setJd(jd);score.setJgmc(item.getString("jgmc"));score.setKch(item.getString("kch"));score.setKcxzmc(item.getString("kcxzmc"));score.setKsxz(item.getString("ksxz"));scoreList.add(score);}return  scoreList;}}}catch (Exception e){e.printStackTrace();}return null;}
}

运行结果

参考文章

https://www.cnblogs.com/hbsdljz/p/10874099.html

https://shentuzhigang.blog.csdn.net/article/details/103995547

JAVA——基于HttpClient的正方教务系统[1999-2020]模拟登录基本解决方案相关推荐

  1. JAVA——基于HttpClient的正方教务系统[1999-2020]模拟登录|模拟退出|课程查询|成绩查询|考试查询基本解决方案

    简介 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录,再获取信息.模拟浏览器正常操作,封装请求头信息获取SESSIONID.模拟登录成功后切勿断开会话,依赖登录请求得到的C ...

  2. python登录教务系统_强智科技教务系统python爬虫模拟登录分析(湖南)

    强智科技教务系统python爬虫模拟登录分析(湖南) 本文章仅用作于学习 前提:最近期末到来,想第一时间看到新出成绩的,于是就有了爬取学校教务系统自己的成绩并通过Qmsg酱推送到自己QQ上的想法,目前 ...

  3. 基于HttpClient的正方教务系统模拟登录(带验证码)

    PS:恩,由于最近在学web和简单的http协议,所以心血来潮想用java写个爬虫来爬取学校官网(正方教务系统)个人主页的基础信息(课程信息.成绩--),其实在之前学过java基础教程的时候就可以写的 ...

  4. 新版正方教务系统Java爬取_正方教务系统成绩爬取(仅个人)+tk可视化

    [JavaScript] 纯文本查看 复制代码var CryptoJS = CryptoJS || function (u, p) { var d = {}, l = d.lib = {}, s = ...

  5. Web安全——正方教务系统自主选课非正常退课解决方案(危险操作,仅用于学习)

    解决方案 退课按钮 审查元素 控制台 参考文章

  6. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案

    问题分析 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录统一身份认证平台,再通过单点登录方式登录正方教务系统,最后获取相关信息.模拟浏览器正常操作,封装请求头信息获取SES ...

  7. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

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

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

  9. 我的第一个开源项目:Java爬虫爬取旧版正方教务系统课程表、成绩表

    Java爬虫爬取旧版正方教务系统课程表.成绩表 一.项目展示 1.正方教务系统 首页 2.爬虫系统 首页: 成绩查询: 课表查询: 二.项目实现 1.爬取思路描述 无论是成绩查询或课表查询亦或者其它的 ...

最新文章

  1. copy 修改时间_DAY5-step3 Python用shutil.copy(), shutil.copystat()复制文件
  2. 城市生态的机器人革命
  3. css文本 颜色1
  4. android 云应用开发,Android云应用开发:网络通信技术介绍
  5. [生态建设] - js判断小技巧
  6. 【前缀和】【DP】登机(jzoj 5535)
  7. 基于docker在Ubuntu上搭建TensorFlow-GPU计算环境
  8. java中使用tika_Tika基本使用
  9. Javascript变量的使用第三课
  10. android系统已停止运用,安卓系统平板电脑启动器停止运行处理方法(文/明)
  11. qq空间留言板删除 php,怎么批量删除QQ空间的说说
  12. 彩扩机项目--散热马达驱动部分
  13. 联想小新一键恢复小孔_联想小新笔记本怎么一键恢复|联想小新air恢复出厂系统步骤...
  14. Opencv Python图像处理进阶教程②
  15. 基础知识------我所知道的、应该知道的
  16. 熬之滴水穿石:Delphi曾经的利器(2)
  17. 如何打开微信dat文件
  18. S3C2440之LCD
  19. Mathematica基础及应用
  20. 一本正经需求洽谈老黄历 No.136

热门文章

  1. [转]为什么我们不用软件工程?软件工程能帮多大忙?
  2. 并联系统的失效率公式推导_电容的串并联计算方法
  3. 1151压力变送器型号_罗斯蒙特变送器的标准精度!
  4. java mesos kubernete_Fabric8操作Kubernetes(一)
  5. mysql varchar最多可以存多少汉字_MySql的这几个坑你踩过没?真是防不胜防!
  6. python图片二进制流转换成图片_python将图片二进制数据转换成Django file对象
  7. catia如何测量毛料尺寸_浅谈线束尺寸测量基准点的定义
  8. 七十五、栈+双指针,头条当年接雨水问题
  9. 十、Go协程的调度,互斥锁,计数器和线程池
  10. 九十一、Python的GUI系列 | QT组件篇