campus-login 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- campus_login-0.1.2/LICENSE +21 -0
- campus_login-0.1.2/PKG-INFO +294 -0
- campus_login-0.1.2/README.md +264 -0
- campus_login-0.1.2/pyproject.toml +58 -0
- campus_login-0.1.2/setup.cfg +4 -0
- campus_login-0.1.2/src/campus_login.egg-info/PKG-INFO +294 -0
- campus_login-0.1.2/src/campus_login.egg-info/SOURCES.txt +22 -0
- campus_login-0.1.2/src/campus_login.egg-info/dependency_links.txt +1 -0
- campus_login-0.1.2/src/campus_login.egg-info/entry_points.txt +2 -0
- campus_login-0.1.2/src/campus_login.egg-info/requires.txt +6 -0
- campus_login-0.1.2/src/campus_login.egg-info/top_level.txt +1 -0
- campus_login-0.1.2/src/campus_login_tool/__init__.py +5 -0
- campus_login-0.1.2/src/campus_login_tool/__main__.py +6 -0
- campus_login-0.1.2/src/campus_login_tool/cli.py +346 -0
- campus_login-0.1.2/src/campus_login_tool/client.py +381 -0
- campus_login-0.1.2/src/campus_login_tool/config.py +254 -0
- campus_login-0.1.2/src/campus_login_tool/logging_utils.py +62 -0
- campus_login-0.1.2/src/campus_login_tool/security.py +85 -0
- campus_login-0.1.2/src/campus_login_tool/watch.py +67 -0
- campus_login-0.1.2/tests/test_cli.py +111 -0
- campus_login-0.1.2/tests/test_client.py +201 -0
- campus_login-0.1.2/tests/test_compat.py +23 -0
- campus_login-0.1.2/tests/test_config.py +142 -0
- campus_login-0.1.2/tests/test_security.py +50 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 RustyPiano
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: campus-login
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: 校园网自动登录工具(Eportal 动态公钥型)
|
|
5
|
+
Author: wangsiyuan
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/RustyPiano/campus-login
|
|
8
|
+
Project-URL: Repository, https://github.com/RustyPiano/campus-login
|
|
9
|
+
Project-URL: Issues, https://github.com/RustyPiano/campus-login/issues
|
|
10
|
+
Keywords: campus-network,eportal,login,cli
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Internet
|
|
20
|
+
Classifier: Topic :: Utilities
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: requests>=2.31
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
27
|
+
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
28
|
+
Requires-Dist: twine>=5.1; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
# 校园网自动登录工具
|
|
32
|
+
|
|
33
|
+
适用于当前仓库抓包确认过的 **Eportal 动态公钥认证流程**。这个项目的目标不是做跨学校通用适配器,而是把当前这套协议整理成一个可安装、可配置、可排障的 CLI 工具。
|
|
34
|
+
|
|
35
|
+
## 定位
|
|
36
|
+
|
|
37
|
+
- 正式入口是 `campus-login`
|
|
38
|
+
- `python3 campus_login.py` 仍然可用,但仅作为兼容入口,已处于弃用状态
|
|
39
|
+
- 根目录 `security.py` 仅为历史兼容 shim
|
|
40
|
+
- 唯一维护中的 RSA 实现在 `src/campus_login_tool/security.py`
|
|
41
|
+
- 不提供 GUI,也不抽象多学校协议差异
|
|
42
|
+
|
|
43
|
+
## 安装
|
|
44
|
+
|
|
45
|
+
推荐直接从 PyPI 安装:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
python3 -m pip install campus-login
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
如果是在项目目录下本地安装:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
python3 -m pip install .
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
安装完成后可用:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
campus-login --help
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
如果只是从源码目录临时运行:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
PYTHONPATH=src python3 -m campus_login_tool --help
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 快速开始
|
|
70
|
+
|
|
71
|
+
1. 生成配置模板:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
campus-login init-config
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
默认会创建 `~/.campus_login.conf`,并尝试把权限设为 `600`。
|
|
78
|
+
|
|
79
|
+
2. 编辑配置文件,至少填入用户名。密码推荐按以下顺序提供:
|
|
80
|
+
|
|
81
|
+
- 直接运行时交互输入
|
|
82
|
+
- `--password-stdin`
|
|
83
|
+
- 环境变量
|
|
84
|
+
- 配置文件
|
|
85
|
+
|
|
86
|
+
3. 运行诊断:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
campus-login doctor
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
4. 单次登录:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
campus-login login
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
5. 前台持续监控并自动重连:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
campus-login watch
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 命令说明
|
|
105
|
+
|
|
106
|
+
### `campus-login login`
|
|
107
|
+
|
|
108
|
+
执行一次完整登录流程。
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
campus-login login --username your_name
|
|
112
|
+
campus-login login --password-stdin
|
|
113
|
+
campus-login login --config /path/to/config.conf
|
|
114
|
+
campus-login login --force
|
|
115
|
+
campus-login login -v --log-file ./campus-login.log
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
如果用户名或密码未在 CLI / 环境变量 / 配置文件中提供,且当前在 TTY 中运行,程序会交互提示输入。
|
|
119
|
+
|
|
120
|
+
### `campus-login watch`
|
|
121
|
+
|
|
122
|
+
前台循环检测网络状态,连续探测失败后自动重登。它不是系统级 daemon,不会自动注册到 `launchd`、`systemd` 或任务计划程序。
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
campus-login watch --interval 30 --retries 3
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `campus-login doctor`
|
|
129
|
+
|
|
130
|
+
用于确认本机配置和当前网络环境是否还符合预期,会检查:
|
|
131
|
+
|
|
132
|
+
- 配置文件是否存在
|
|
133
|
+
- 配置文件权限是否安全
|
|
134
|
+
- 用户名和密码是否已解析
|
|
135
|
+
- 联网探测地址是否可访问
|
|
136
|
+
- 认证触发地址是否还能解析出登录页
|
|
137
|
+
|
|
138
|
+
### `campus-login init-config`
|
|
139
|
+
|
|
140
|
+
生成与运行时模板一致的配置文件:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
campus-login init-config
|
|
144
|
+
campus-login init-config --config ./campus_login.conf --force
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
仓库中的 [campus_login.conf.example](./campus_login.conf.example) 只是同一模板的文档镜像,真正的单一来源在 `src/campus_login_tool/config.py` 的 `CONFIG_TEMPLATE`。
|
|
148
|
+
|
|
149
|
+
## 配置规则
|
|
150
|
+
|
|
151
|
+
统一优先级:
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
CLI 参数 > 环境变量 > 配置文件 > 默认值
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
支持的环境变量:
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
CAMPUS_LOGIN_CONFIG
|
|
161
|
+
CAMPUS_LOGIN_USERNAME
|
|
162
|
+
CAMPUS_LOGIN_PASSWORD
|
|
163
|
+
CAMPUS_LOGIN_CHECK_URL
|
|
164
|
+
CAMPUS_LOGIN_INTERVAL
|
|
165
|
+
CAMPUS_LOGIN_RETRIES
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
默认配置文件路径:
|
|
169
|
+
|
|
170
|
+
```text
|
|
171
|
+
~/.campus_login.conf
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
如果配置文件中保存了密码,在 macOS / Linux 上权限必须是 `600`,否则程序会拒绝读取。
|
|
175
|
+
|
|
176
|
+
## 故障排查
|
|
177
|
+
|
|
178
|
+
### `doctor` 说互联网探测失败
|
|
179
|
+
|
|
180
|
+
通常意味着以下情况之一:
|
|
181
|
+
|
|
182
|
+
- 当前还没完成认证
|
|
183
|
+
- 当前不在校园网环境
|
|
184
|
+
- `check_url` 在本地网络中不可达
|
|
185
|
+
|
|
186
|
+
可先尝试:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
campus-login login --force
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
如果环境里有更稳定的外部地址,也可以调整 `check_url`。
|
|
193
|
+
|
|
194
|
+
### `doctor` 说认证触发地址解析失败
|
|
195
|
+
|
|
196
|
+
通常说明:
|
|
197
|
+
|
|
198
|
+
- 认证页跳转脚本格式发生变化
|
|
199
|
+
- 当前网络不再需要这套认证流程
|
|
200
|
+
- 学校更新了协议实现
|
|
201
|
+
|
|
202
|
+
这时优先查看 [认证流程分析.md](./认证流程分析.md),确认抓包记录与当前代码实现是否仍一致。
|
|
203
|
+
|
|
204
|
+
### 参数看起来都对,但仍登录失败
|
|
205
|
+
|
|
206
|
+
优先检查:
|
|
207
|
+
|
|
208
|
+
- 账号密码是否正确
|
|
209
|
+
- `pageInfo` 返回的公钥字段是否变化
|
|
210
|
+
- `src/campus_login_tool/security.py` 的加密逻辑是否仍与认证页 JS 一致
|
|
211
|
+
- `login` 接口返回的错误消息
|
|
212
|
+
|
|
213
|
+
需要更多细节时请加 `-v`,并在分享日志前先脱敏。
|
|
214
|
+
|
|
215
|
+
## 兼容入口
|
|
216
|
+
|
|
217
|
+
以下历史用法仍可用,但会打印弃用提示:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
python3 campus_login.py -u your_name
|
|
221
|
+
python3 campus_login.py --daemon
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
建议迁移到:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
campus-login login
|
|
228
|
+
campus-login watch
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
根目录 [campus_login.py](./campus_login.py) 只是 CLI 兼容包装层;根目录 [security.py](./security.py) 只是 RSA 兼容 shim,避免历史引用直接失效。
|
|
232
|
+
|
|
233
|
+
## 开发
|
|
234
|
+
|
|
235
|
+
安装开发依赖:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
python3 -m pip install -e ".[dev]"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
本地和 CI 使用同一组基础检查:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
python3 -m ruff check .
|
|
245
|
+
python3 -m compileall src campus_login.py security.py
|
|
246
|
+
python3 -m unittest discover -s tests -v
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
如果需要本地构建并检查发布包:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
python3 -m pip install -e ".[dev]"
|
|
253
|
+
python3 -m build
|
|
254
|
+
python3 -m twine check dist/*
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## 发布到 PyPI
|
|
258
|
+
|
|
259
|
+
当前仓库已配置为使用 GitHub Actions + PyPI Trusted Publishing 发布。建议流程:
|
|
260
|
+
|
|
261
|
+
1. 修改 `src/campus_login_tool/__init__.py` 中的 `__version__`
|
|
262
|
+
2. 本地执行构建检查:
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
python3 -m pip install -e ".[dev]"
|
|
266
|
+
python3 -m build
|
|
267
|
+
python3 -m twine check dist/*
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
3. 提交变更后创建并推送版本 tag:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
git tag v0.1.2
|
|
274
|
+
git push origin v0.1.2
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
4. GitHub 会触发 `.github/workflows/publish.yml` 自动上传到 PyPI
|
|
278
|
+
|
|
279
|
+
首次启用前,需要在 PyPI 项目侧把仓库 `RustyPiano/campus-login` 配置为 Trusted Publisher,并允许工作流 `.github/workflows/publish.yml` 使用 `pypi` 环境。
|
|
280
|
+
|
|
281
|
+
## 仓库结构
|
|
282
|
+
|
|
283
|
+
- `src/campus_login_tool/`: 当前维护中的 CLI、配置解析、协议客户端、watch 模式和加密实现
|
|
284
|
+
- `campus_login.py`: 历史单文件入口的兼容包装层
|
|
285
|
+
- `security.py`: 历史 RSA 模块的兼容 shim
|
|
286
|
+
- `campus_login.conf.example`: 配置模板镜像
|
|
287
|
+
- `认证流程分析.md`: 协议抓包、字段和接口说明
|
|
288
|
+
|
|
289
|
+
## 免责声明
|
|
290
|
+
|
|
291
|
+
- 该工具只针对当前仓库分析过的认证流程,不保证适用于其他学校
|
|
292
|
+
- 校园网认证流程可能随时变化,导致脚本失效
|
|
293
|
+
- 自动化登录可能违反学校网络使用规定,请自行确认风险
|
|
294
|
+
- 请妥善保管校园网密码
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# 校园网自动登录工具
|
|
2
|
+
|
|
3
|
+
适用于当前仓库抓包确认过的 **Eportal 动态公钥认证流程**。这个项目的目标不是做跨学校通用适配器,而是把当前这套协议整理成一个可安装、可配置、可排障的 CLI 工具。
|
|
4
|
+
|
|
5
|
+
## 定位
|
|
6
|
+
|
|
7
|
+
- 正式入口是 `campus-login`
|
|
8
|
+
- `python3 campus_login.py` 仍然可用,但仅作为兼容入口,已处于弃用状态
|
|
9
|
+
- 根目录 `security.py` 仅为历史兼容 shim
|
|
10
|
+
- 唯一维护中的 RSA 实现在 `src/campus_login_tool/security.py`
|
|
11
|
+
- 不提供 GUI,也不抽象多学校协议差异
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
推荐直接从 PyPI 安装:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
python3 -m pip install campus-login
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
如果是在项目目录下本地安装:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 -m pip install .
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
安装完成后可用:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
campus-login --help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
如果只是从源码目录临时运行:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
PYTHONPATH=src python3 -m campus_login_tool --help
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 快速开始
|
|
40
|
+
|
|
41
|
+
1. 生成配置模板:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
campus-login init-config
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
默认会创建 `~/.campus_login.conf`,并尝试把权限设为 `600`。
|
|
48
|
+
|
|
49
|
+
2. 编辑配置文件,至少填入用户名。密码推荐按以下顺序提供:
|
|
50
|
+
|
|
51
|
+
- 直接运行时交互输入
|
|
52
|
+
- `--password-stdin`
|
|
53
|
+
- 环境变量
|
|
54
|
+
- 配置文件
|
|
55
|
+
|
|
56
|
+
3. 运行诊断:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
campus-login doctor
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
4. 单次登录:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
campus-login login
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
5. 前台持续监控并自动重连:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
campus-login watch
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 命令说明
|
|
75
|
+
|
|
76
|
+
### `campus-login login`
|
|
77
|
+
|
|
78
|
+
执行一次完整登录流程。
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
campus-login login --username your_name
|
|
82
|
+
campus-login login --password-stdin
|
|
83
|
+
campus-login login --config /path/to/config.conf
|
|
84
|
+
campus-login login --force
|
|
85
|
+
campus-login login -v --log-file ./campus-login.log
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
如果用户名或密码未在 CLI / 环境变量 / 配置文件中提供,且当前在 TTY 中运行,程序会交互提示输入。
|
|
89
|
+
|
|
90
|
+
### `campus-login watch`
|
|
91
|
+
|
|
92
|
+
前台循环检测网络状态,连续探测失败后自动重登。它不是系统级 daemon,不会自动注册到 `launchd`、`systemd` 或任务计划程序。
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
campus-login watch --interval 30 --retries 3
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### `campus-login doctor`
|
|
99
|
+
|
|
100
|
+
用于确认本机配置和当前网络环境是否还符合预期,会检查:
|
|
101
|
+
|
|
102
|
+
- 配置文件是否存在
|
|
103
|
+
- 配置文件权限是否安全
|
|
104
|
+
- 用户名和密码是否已解析
|
|
105
|
+
- 联网探测地址是否可访问
|
|
106
|
+
- 认证触发地址是否还能解析出登录页
|
|
107
|
+
|
|
108
|
+
### `campus-login init-config`
|
|
109
|
+
|
|
110
|
+
生成与运行时模板一致的配置文件:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
campus-login init-config
|
|
114
|
+
campus-login init-config --config ./campus_login.conf --force
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
仓库中的 [campus_login.conf.example](./campus_login.conf.example) 只是同一模板的文档镜像,真正的单一来源在 `src/campus_login_tool/config.py` 的 `CONFIG_TEMPLATE`。
|
|
118
|
+
|
|
119
|
+
## 配置规则
|
|
120
|
+
|
|
121
|
+
统一优先级:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
CLI 参数 > 环境变量 > 配置文件 > 默认值
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
支持的环境变量:
|
|
128
|
+
|
|
129
|
+
```text
|
|
130
|
+
CAMPUS_LOGIN_CONFIG
|
|
131
|
+
CAMPUS_LOGIN_USERNAME
|
|
132
|
+
CAMPUS_LOGIN_PASSWORD
|
|
133
|
+
CAMPUS_LOGIN_CHECK_URL
|
|
134
|
+
CAMPUS_LOGIN_INTERVAL
|
|
135
|
+
CAMPUS_LOGIN_RETRIES
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
默认配置文件路径:
|
|
139
|
+
|
|
140
|
+
```text
|
|
141
|
+
~/.campus_login.conf
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
如果配置文件中保存了密码,在 macOS / Linux 上权限必须是 `600`,否则程序会拒绝读取。
|
|
145
|
+
|
|
146
|
+
## 故障排查
|
|
147
|
+
|
|
148
|
+
### `doctor` 说互联网探测失败
|
|
149
|
+
|
|
150
|
+
通常意味着以下情况之一:
|
|
151
|
+
|
|
152
|
+
- 当前还没完成认证
|
|
153
|
+
- 当前不在校园网环境
|
|
154
|
+
- `check_url` 在本地网络中不可达
|
|
155
|
+
|
|
156
|
+
可先尝试:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
campus-login login --force
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
如果环境里有更稳定的外部地址,也可以调整 `check_url`。
|
|
163
|
+
|
|
164
|
+
### `doctor` 说认证触发地址解析失败
|
|
165
|
+
|
|
166
|
+
通常说明:
|
|
167
|
+
|
|
168
|
+
- 认证页跳转脚本格式发生变化
|
|
169
|
+
- 当前网络不再需要这套认证流程
|
|
170
|
+
- 学校更新了协议实现
|
|
171
|
+
|
|
172
|
+
这时优先查看 [认证流程分析.md](./认证流程分析.md),确认抓包记录与当前代码实现是否仍一致。
|
|
173
|
+
|
|
174
|
+
### 参数看起来都对,但仍登录失败
|
|
175
|
+
|
|
176
|
+
优先检查:
|
|
177
|
+
|
|
178
|
+
- 账号密码是否正确
|
|
179
|
+
- `pageInfo` 返回的公钥字段是否变化
|
|
180
|
+
- `src/campus_login_tool/security.py` 的加密逻辑是否仍与认证页 JS 一致
|
|
181
|
+
- `login` 接口返回的错误消息
|
|
182
|
+
|
|
183
|
+
需要更多细节时请加 `-v`,并在分享日志前先脱敏。
|
|
184
|
+
|
|
185
|
+
## 兼容入口
|
|
186
|
+
|
|
187
|
+
以下历史用法仍可用,但会打印弃用提示:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
python3 campus_login.py -u your_name
|
|
191
|
+
python3 campus_login.py --daemon
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
建议迁移到:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
campus-login login
|
|
198
|
+
campus-login watch
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
根目录 [campus_login.py](./campus_login.py) 只是 CLI 兼容包装层;根目录 [security.py](./security.py) 只是 RSA 兼容 shim,避免历史引用直接失效。
|
|
202
|
+
|
|
203
|
+
## 开发
|
|
204
|
+
|
|
205
|
+
安装开发依赖:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
python3 -m pip install -e ".[dev]"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
本地和 CI 使用同一组基础检查:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
python3 -m ruff check .
|
|
215
|
+
python3 -m compileall src campus_login.py security.py
|
|
216
|
+
python3 -m unittest discover -s tests -v
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
如果需要本地构建并检查发布包:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
python3 -m pip install -e ".[dev]"
|
|
223
|
+
python3 -m build
|
|
224
|
+
python3 -m twine check dist/*
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 发布到 PyPI
|
|
228
|
+
|
|
229
|
+
当前仓库已配置为使用 GitHub Actions + PyPI Trusted Publishing 发布。建议流程:
|
|
230
|
+
|
|
231
|
+
1. 修改 `src/campus_login_tool/__init__.py` 中的 `__version__`
|
|
232
|
+
2. 本地执行构建检查:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
python3 -m pip install -e ".[dev]"
|
|
236
|
+
python3 -m build
|
|
237
|
+
python3 -m twine check dist/*
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
3. 提交变更后创建并推送版本 tag:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
git tag v0.1.2
|
|
244
|
+
git push origin v0.1.2
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
4. GitHub 会触发 `.github/workflows/publish.yml` 自动上传到 PyPI
|
|
248
|
+
|
|
249
|
+
首次启用前,需要在 PyPI 项目侧把仓库 `RustyPiano/campus-login` 配置为 Trusted Publisher,并允许工作流 `.github/workflows/publish.yml` 使用 `pypi` 环境。
|
|
250
|
+
|
|
251
|
+
## 仓库结构
|
|
252
|
+
|
|
253
|
+
- `src/campus_login_tool/`: 当前维护中的 CLI、配置解析、协议客户端、watch 模式和加密实现
|
|
254
|
+
- `campus_login.py`: 历史单文件入口的兼容包装层
|
|
255
|
+
- `security.py`: 历史 RSA 模块的兼容 shim
|
|
256
|
+
- `campus_login.conf.example`: 配置模板镜像
|
|
257
|
+
- `认证流程分析.md`: 协议抓包、字段和接口说明
|
|
258
|
+
|
|
259
|
+
## 免责声明
|
|
260
|
+
|
|
261
|
+
- 该工具只针对当前仓库分析过的认证流程,不保证适用于其他学校
|
|
262
|
+
- 校园网认证流程可能随时变化,导致脚本失效
|
|
263
|
+
- 自动化登录可能违反学校网络使用规定,请自行确认风险
|
|
264
|
+
- 请妥善保管校园网密码
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "campus-login"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "校园网自动登录工具(Eportal 动态公钥型)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [
|
|
14
|
+
{ name = "wangsiyuan" }
|
|
15
|
+
]
|
|
16
|
+
urls = { Homepage = "https://github.com/RustyPiano/campus-login", Repository = "https://github.com/RustyPiano/campus-login", Issues = "https://github.com/RustyPiano/campus-login/issues" }
|
|
17
|
+
dependencies = [
|
|
18
|
+
"requests>=2.31",
|
|
19
|
+
]
|
|
20
|
+
keywords = ["campus-network", "eportal", "login", "cli"]
|
|
21
|
+
classifiers = [
|
|
22
|
+
"Development Status :: 4 - Beta",
|
|
23
|
+
"Environment :: Console",
|
|
24
|
+
"Intended Audience :: End Users/Desktop",
|
|
25
|
+
"Programming Language :: Python :: 3",
|
|
26
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
27
|
+
"Programming Language :: Python :: 3.10",
|
|
28
|
+
"Programming Language :: Python :: 3.11",
|
|
29
|
+
"Programming Language :: Python :: 3.12",
|
|
30
|
+
"Topic :: Internet",
|
|
31
|
+
"Topic :: Utilities",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[project.optional-dependencies]
|
|
35
|
+
dev = [
|
|
36
|
+
"build>=1.2",
|
|
37
|
+
"ruff>=0.8",
|
|
38
|
+
"twine>=5.1",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[project.scripts]
|
|
42
|
+
campus-login = "campus_login_tool.cli:main"
|
|
43
|
+
|
|
44
|
+
[tool.setuptools]
|
|
45
|
+
package-dir = { "" = "src" }
|
|
46
|
+
|
|
47
|
+
[tool.setuptools.dynamic]
|
|
48
|
+
version = { attr = "campus_login_tool.__version__" }
|
|
49
|
+
|
|
50
|
+
[tool.setuptools.packages.find]
|
|
51
|
+
where = ["src"]
|
|
52
|
+
|
|
53
|
+
[tool.ruff]
|
|
54
|
+
line-length = 100
|
|
55
|
+
target-version = "py310"
|
|
56
|
+
|
|
57
|
+
[tool.ruff.lint]
|
|
58
|
+
select = ["E", "F", "I", "B", "UP"]
|