最近用上了學校的校園網, 速度還行吧
不過校園網每次要 web登錄認證
, 就有點無語, 像我這么懶的人怎么可能每次都要重新登錄一次
圍觀地址: https://github.com/jsxxzy/inet
原理很簡單, 無非就是登錄一個 POST
請求, 然后億點點細節就可以了
懶才是第一生產力啊..
原理分析 2020-11-29
最近真的閑的不行, 沒什么事情做, 奇怪的是室友不知道發生什么事了, 全都在學JAVA
, 搞得我一臉懵逼(按理說不應該天天游戲嗎/霧)
所以就寫了一個java
版本的校園網客戶端: https://github.com/jsxxzy/inetl
首先查看入口函數: /src/main/java/io/xxzy/App.java
System.out.println(" login: 登錄");
System.out.println(" get: 獲取保存的賬號密碼");
System.out.println(" save: 保存賬號密碼");
System.out.println(" fix: 初始化賬號密碼");
System.out.println(" check: 查詢是否登錄");
System.out.println(" info: 查詢信息");
System.out.println("logout: 注銷");
System.out.println("=============>");
登錄
校園網有登錄的網端
稍微看一下就知道這就是簡單的 post
請求
密碼是經過 md5
機密, 加幾個偏移值, 這幾個偏移值在 html
片段里都有
/**
* 生成密碼
* https://github.com/jsxxzy/ipsd
* @return 密碼
*/
public String CreatePassword(String p) {
String offset1 = constvar.Pid + p + constvar.Calg;
String md5 = utilsx.CreateMD5(offset1);
return md5 + constvar.Calg + constvar.Pid;
}
請求之后, 后台返回的html
片段, 比較惡心的是, 居然不是utf-8
, 所以還需要將其轉為utf-8
格式
/**
* 轉為 `utf-8`
*/
static String toUTF8(String input) {
return new String(input.getBytes(), StandardCharsets.UTF_8);
}
返回的html
里有你需要的一些信息, 用來判斷是否登錄成功, 我們需要運行這段js
然后通過判斷變量msga
來判斷
但是第一步是去除其 <!--
/**
* 運營商的js寫的不標准, 此函數試圖去除一些不標准
*
* 一開口就老外包了...
*
* @param raw 源數據
* @return 正確的`js-code`
*/
public static String jsCodeRemoveCommit(String raw) {
String cp = raw.trim();
String left = "<!--";
String right = "// -->";
if (cp.startsWith(left)) {
cp = cp.substring(left.length());
};
if (cp.endsWith(right)) {
int endIndex = cp.length() - right.length();
cp = cp.substring(0, endIndex);
}
return cp;
}
判斷條件為, 若為空表示登錄成功, 若為 5
多台設備在線, 若為 1
表示賬號或密碼錯誤
查詢是否登錄
查詢是否登錄
只是查詢信息
的alias
// 未登錄將會自動跳轉到 `/0.htm` 登錄界面, 但判斷條件為 `title` 字符串為空
String title = $.title();
查詢信息
查詢信息相對有點復雜, 訪問校園路由, 然后和登錄差不多, 先轉utf-8
然后拿到js
, 運行, 就可以拿到了
// 運行`js`
void InitData(Document $) {
js jsRuntime = new js();
Elements jsData = $.select(constvar.QueryInfoSelectText);
String jsDataText = jsData.get(0).html();
String jsInputData = utilsx.jsCodeRemoveCommit(jsDataText);
jsRuntime.RunScript(jsInputData);
String cacheTimeString = jsRuntime.GetString(constvar.InfoTime);
try {
this.Time = Integer.parseInt(cacheTimeString);
} catch (NumberFormatException e) {
e.printStackTrace();
}
this.Ipv6 = jsRuntime.GetString(constvar.InfoIpv6);
this.Ipv4 = jsRuntime.GetString(constvar.InfoIpv4);
this.UID = jsRuntime.GetString(constvar.InfoUID);
this.Xip = jsRuntime.GetString(constvar.InfoXip);
this.Portalname = jsRuntime.GetString(constvar.InfoPortalname);
String cacheFlowData = jsRuntime.GetString(constvar.InfoFlow);
try {
this.Flow = Integer.parseInt(cacheFlowData);
} catch (NumberFormatException e) {
}
注銷
注銷比較簡單, 只是GET
請求一下注銷的路由即可
get
| save
| fix
存儲賬號到本地, 比較簡單, 讀寫一個文件, 不過我自己實現了一個解析格式
/**
* 解析格式
*/
private String[] parseLocalAuth(String rawString) {
String[] em = new String[0];
if (rawString.length() == 0) {
return em;
}
String[] arr = rawString.split(this.offset);
if (arr.length <= 1) {
return em;
}
String[] r = new String[2];
r[0] = arr[0];
r[1] = arr[1];
return r;
}
作者有話說
額, 迫於無聊編寫的, 以前一直對於java
有偏見, 但是寫了以后發現好像還挺好的哈