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.
@@ -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"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+