自动登录校园网

梔锿-iyutong-雨桐 Lv2

一、需求的起源

打开电脑,提示无网络.不对啊,我插了网线的啊,
一看校园网认证过期了,需要重新认证.啊这…
原来ip超过1天不在线自动下线.靠不能每次开机以后都去认证吧,弄个开机自动认证吧.
于是有了这个文章

二、开发过程

1.抓包分析

打开认证页面按下 F12 打开开发人员工具,选择 网络 选项卡,如下图:

校园网
校园网

输入账号密码,单击登录按钮,查看网站都干了啥.

校园网
校园网

非常明显的发现.点击登录以后,网页向 http://2.2.2.1:8888/webauth.do?wlanacname=TPdcxy 发送了一个POST请求

校园网
校园网

2.分析数据

选择 负载 选项卡,可以看到POST请求的表单数据,非常明显 userldpasswd 就是我们的账号密码,也是必须提交的数据

校园网
校园网

3.模拟请求

数据已经分析的差不多了,那么就可以编写代码,模拟请求看看是否正常了
我这里使用Java进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "pageid=142&userId=账号&passwd=密码");
Request request = new Request.Builder()
.url("http://2.2.2.1:8888/webauth.do?wlanacname=TPdcxy")
.method("POST", body)
.addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)")
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("Accept", "*/*")
.addHeader("Host", "2.2.2.1:8888")
.addHeader("Connection", "keep-alive")
.build();
Response response = client.newCall(request).execute();

运行代码返回html数据解析html,截取我们需要的部分就可以了

校园网
校园网

三、编写完整的代码

废话不多说直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package cn.iyutong;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.*;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;


public class Main {


public static void main(String[] args) {
// 设备认证
// System.out.println(get_init_login("学号","教务处密码"));
// 设备下线
// System.out.println(get_init_out("mac地址"));
// 当前设备信息查询
// System.out.println(get_init_json());
// ip认证
// System.out.println(get_login_errMessage("学号","校园网认证密码"));
}

//线下设备
private static JSONObject get_init_out(String mac){
try (HttpResponse result = HttpRequest.post("http://172.16.0.10:30004/byod/byodrs/login/loginOut")
.header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.header("Accept", "*/*")
.header("Host", "172.16.0.10:30004")
.form("mac", mac)
.timeout(20000)
.execute()) {
if (!result.isOk()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", String.valueOf(result.getStatus()));
JSONObject jsonObject = JSONUtil.parseObj(result.body());
return JSONUtil.createObj()
.set("code", jsonObject.getInt("code"))
.set("msg", jsonObject.getStr("msg"));
} catch (Exception e) {
return JSONUtil.createObj()
.set("code",-1)
.set("msg", e.getMessage());
}
}

//设备认证
private static JSONObject get_init_login(String userName,String userPassword){
try (HttpResponse result = HttpRequest.post("http://172.16.0.10:30004/byod/byodrs/login/defaultLogin")
.header("Content-Type", "application/json")
.header("Accept", "*/*")
.header("Host", "172.16.0.10:30004")
.body(JSONUtil.createObj().set("userName",userName).set("userPassword", Base64.encode(userPassword)).toString())
.timeout(20000)
.execute()) {
if (!result.isOk()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", String.valueOf(result.getStatus()));
JSONObject jsonObject = JSONUtil.parseObj(result.body());
return JSONUtil.createObj()
.set("code", jsonObject.getInt("code"))
.set("msg", jsonObject.getStr("msg"));
} catch (Exception e) {
return JSONUtil.createObj()
.set("code",-1)
.set("msg", e.getMessage());
}
}

//获取设备信息
private static JSONObject get_init_json(){
try (HttpResponse result = HttpRequest.get("http://172.16.0.10:30004/byod/byodrs/init")
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Accept", "*/*")
.header("Host", "172.16.0.10:30004")
.timeout(20000)
.execute()) {
if (!result.isOk()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", String.valueOf(result.getStatus()));
JSONObject jsonObject = JSONUtil.parseObj(result.body());
if (!(jsonObject.getInt("code") == 0)) return JSONUtil.createObj()
.set("code",-1)
.set("msg", jsonObject.getStr("msg"));
JSONObject data = jsonObject.getJSONObject("data");
String userip = data.getStr("userip");
JSONObject byodMacRegistInfo = data.getJSONObject("byodMacRegistInfo");
String mac = byodMacRegistInfo.getStr("mac");
String terminalOs = byodMacRegistInfo.getStr("terminalOs");
boolean ifGuest = byodMacRegistInfo.getBool("ifGuest");
return JSONUtil.createObj()
.set("code", 0)
.set("msg", "成功")
.set("userip", userip)
.set("mac", mac)
.set("terminalOs", terminalOs)
.set("ifGuest", !ifGuest);
} catch (Exception e) {
return JSONUtil.createObj()
.set("code",-1)
.set("msg", e.getMessage());
}
}

//ip认证信息
private static JSONObject get_login_errMessage(String wispr_userId, String wispr_passwd) {
String url = "http://2.2.2.1:8888/webauth.do?wlanacname=TPdcxy";
JSONObject pageid = get_login_pageid(url);
if (pageid.getInt("code") != 0) return pageid;
try (HttpResponse result = HttpRequest.post(url)
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Accept", "*/*")
.header("Host", "2.2.2.1:8888")
.header("Referer", url)
.header("Cookie", pageid.getStr("cookies"))
.form("pageid", pageid.getStr("pageid"))
.form("userId", wispr_userId)
.form("passwd", wispr_passwd)
.timeout(20000)
.execute()) {
if (!result.isOk()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", String.valueOf(result.getStatus()));
if (!ReUtil.findAll("<title>(.*?)</title>", result.body(), 1).get(0).equals("网络认证")) return JSONUtil.createObj()
.set("code",-1)
.set("msg", "认证页面访问失败");
String message = ReUtil.findAll("<input id=\"errMessage\" type=\"hidden\" value=\"(.*?)\"/>", result.body(), 1).get(0);
if (message.isEmpty()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", "认证信息获取失败");
return JSONUtil.createObj()
.set("code", 0)
.set("msg", message);
} catch (Exception e) {
return JSONUtil.createObj()
.set("code",-1)
.set("msg", e.getMessage());
}
}

private static JSONObject get_login_pageid(String url) {
try (HttpResponse result = HttpRequest.get(url)
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Accept", "*/*")
.header("Host", "2.2.2.1:8888")
.header("Referer", url)
.timeout(20000)
.execute()) {
if (!result.isOk()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", String.valueOf(result.getStatus()));
if (!ReUtil.findAll("<title>(.*?)</title>", result.body(), 1).get(0).equals("网络认证")) return JSONUtil.createObj()
.set("code",-1)
.set("msg", "认证页面访问失败");
String pageid = ReUtil.findAll("<input id=\"pageid\" type=\"hidden\" name=\"pageid\" value=\"(.*?)\" />", result.body(), 1).get(0);
String cookies = ReUtil.findAll("JSESSIONID-BOSS-(.*?);", result.getCookieStr(), 1).get(0);
if (pageid.isEmpty() || cookies.isEmpty()) return JSONUtil.createObj()
.set("code",-1)
.set("msg", "pageid获取失败");
return JSONUtil.createObj()
.set("code", 0)
.set("msg", "成功")
.set("pageid", pageid)
.set("cookies", "JSESSIONID-BOSS-" + cookies);
} catch (Exception e) {
return JSONUtil.createObj()
.set("code",-1)
.set("msg", e.getMessage());
}
}

}

四、添加开机自启动

制作成exe可执行文件,设置开机自启动皆可
成品exe在下一帖子发布 https://www.iyutong.cn/posts/7c7ddbb7/

  • 标题: 自动登录校园网
  • 作者: 梔锿-iyutong-雨桐
  • 创建于 : 2024-09-22 13:56:22
  • 更新于 : 2025-05-25 21:24:54
  • 链接: https://www.iyutong.cn/posts/bb01f2a2/
  • 版权声明: 版权所有 © 梔锿-iyutong-雨桐,禁止转载。
评论