1 前言
此代码只适用于新版正方教务系统
本文主要是代码,具体分析过程有很多爬虫教程都有讲述,主要就是学会使用各种抓包工具,仔细分析提交时的请求头和表单,用各种方法提取或构造出需要提交的参数,具体步骤可以搜索其他爬虫教程,我个人表达能力不是很好,怕讲不明白或者讲错了,所以就不仔细讲述了。
代码是我借鉴了许多版本的java正方爬虫写出的,因为在Android端HttpClient已经被Google官方遗弃,所以代码是基于Jsoup完成的。
2 准备工作
Jsoup库用于网络请求和html文本解析
fastjson库用来解析JSON数据
在Android Studio的build.gradle(Module)添加对应依赖:
implementation 'org.jsoup:jsoup:1.11.3'
implementation 'com.alibaba:fastjson:1.1.54.android'
3 代码
3.1 新版正方RSA加密方法
public class Base64 {
public static String b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private static char b64pad = '=';
private static String hexCode = "0123456789abcdef";
// 获取对应16进制字符
public static char int2char(int a){
return hexCode.charAt(a);
}
// Base64转16进制
public static String b64tohex(String s) {
String ret = "";
int k = 0;
int slop = 0;
for(int i = 0; i < s.length(); ++i) {
if(s.charAt(i) == b64pad) break;
int v = b64map.indexOf(s.charAt(i));
if(v < 0) continue;
if(k == 0) {
ret += int2char(v >> 2);
slop = v & 3;
k = 1;
}
else if(k == 1) {
ret += int2char((slop << 2) | (v >> 4));
slop = v & 0xf;
k = 2;
}
else if(k == 2) {
ret += int2char(slop);
ret += int2char(v >> 2);
slop = v & 3;
k = 3;
}
else {
ret += int2char((slop << 2) | (v >> 4));
ret += int2char(v & 0xf);
k = 0;
}
}
if(k == 1)
ret += int2char(slop << 2);
return ret;
}
// 16进制转Base64
public static String hex2b64(String h) {
int i , c;
StringBuilder ret = new StringBuilder();
for(i = 0; i+3 <= h.length(); i+=3) {
c = parseInt(h.substring(i,i+3),16);
ret.append(b64map.charAt(c >> 6));
ret.append(b64map.charAt(c & 63));
}
if(i+1 == h.length()) {
c = parseInt(h.substring(i,i+1),16);
ret.append(b64map.charAt(c << 2));
}
else if(i+2 == h.length()) {
c = parseInt(h.substring(i,i+2),16);
ret.append(b64map.charAt(c >> 2));
ret.append(b64map.charAt((c