此页由 Zensical 配合 mkdocstrings 根据源码自动生成,适合在以下场景使用:
- 查看公开模块和导出符号
- 确认方法签名、参数名和返回值
- 查询 Pydantic 模型字段
如果你更关注接入步骤和调用示例,优先阅读 Usage。
zzupy¤
zzupy
¤
Modules:
-
aio–各模块的异步实现
-
app–移动应用 API 抽象层
-
crypto–纯 Python 实现的轻量级 RSA 加密
-
exception–异常处理模块。
-
logging–zzupy 日志工具。
-
model– -
utils–工具函数库
-
web–Web API 客户端模块
Attributes:
-
logger– -
__version__– -
__all__–
aio
¤
各模块的异步实现
app
¤
移动应用 API 抽象层
crypto
¤
纯 Python 实现的轻量级 RSA 加密
Functions:
-
load_pem_public_key–从 PEM 格式加载 RSA 公钥
load_pem_public_key
¤
load_pem_public_key(pem_data: bytes) -> RSAPublicKey
exception
¤
异常处理模块。
logging
¤
zzupy 日志工具。
model
¤
utils
¤
工具函数库
web
¤
Web API 客户端模块
zzupy.aio¤
aio
¤
zzupy.aio.app¤
app
¤
移动应用 API 抽象层
Modules:
-
auth–统一认证
-
eas– -
ecard–一卡通
-
interfaces–抽象接口
Classes:
-
CASClient–统一认证系统 (CAS) App 客户端。
-
ECardClient–一卡通客户端
-
UndergradEASClient–
Attributes:
-
__all__–
CASClient
¤
flowchart TD
zzupy.aio.app.CASClient[CASClient]
zzupy.aio.app.interfaces.ICASClient[ICASClient]
zzupy.aio.app.interfaces.ICASClient --> zzupy.aio.app.CASClient
click zzupy.aio.app.CASClient href "" "zzupy.aio.app.CASClient"
click zzupy.aio.app.interfaces.ICASClient href "" "zzupy.aio.app.interfaces.ICASClient"
统一认证系统 (CAS) App 客户端。
Parameters:
ECardClient
¤
ECardClient(cas_client: ICASClient)
auth
¤
统一认证
eas
¤
ecard
¤
一卡通
interfaces
¤
抽象接口
zzupy.aio.app.auth¤
auth
¤
统一认证
Classes:
-
ICASClient– -
RSAPublicKey–轻量级 RSA 公钥实现
-
padding–填充方案命名空间(兼容 cryptography)
-
serialization–序列化命名空间(兼容 cryptography)
-
LoginError–登录失败。
-
ParsingError–响应解析或数据校验失败。
-
NetworkError–网络请求失败或网络环境异常。
-
OperationError–服务端接受请求但业务处理失败。
-
PersonalInfo–个人信息模型
-
PersonalInfoCardModel–‘我的’页中个人信息卡片 API 响应根模型
-
PersonalInfoModel–个人信息 API 响应根模型
-
CASClient–统一认证系统 (CAS) App 客户端。
Functions:
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
require_auth–装饰器:确保调用方法前已登录
Attributes:
-
logger–
ICASClient
¤
flowchart TD
zzupy.aio.app.auth.ICASClient[ICASClient]
click zzupy.aio.app.auth.ICASClient href "" "zzupy.aio.app.auth.ICASClient"
RSAPublicKey
¤
padding
¤
填充方案命名空间(兼容 cryptography)
serialization
¤
序列化命名空间(兼容 cryptography)
Methods:
-
load_pem_public_key–加载 PEM 格式公钥(兼容 cryptography 接口)
load_pem_public_key
staticmethod
¤
load_pem_public_key(data: bytes) -> RSAPublicKey
加载 PEM 格式公钥(兼容 cryptography 接口)
LoginError
¤
LoginError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.auth.LoginError[LoginError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.auth.LoginError
click zzupy.aio.app.auth.LoginError href "" "zzupy.aio.app.auth.LoginError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
登录失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.auth.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.auth.ParsingError
click zzupy.aio.app.auth.ParsingError href "" "zzupy.aio.app.auth.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.auth.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.auth.NetworkError
click zzupy.aio.app.auth.NetworkError href "" "zzupy.aio.app.auth.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.auth.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.auth.OperationError
click zzupy.aio.app.auth.OperationError href "" "zzupy.aio.app.auth.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
PersonalInfo
¤
flowchart TD
zzupy.aio.app.auth.PersonalInfo[PersonalInfo]
click zzupy.aio.app.auth.PersonalInfo href "" "zzupy.aio.app.auth.PersonalInfo"
个人信息模型
PersonalInfoCardModel
¤
flowchart TD
zzupy.aio.app.auth.PersonalInfoCardModel[PersonalInfoCardModel]
click zzupy.aio.app.auth.PersonalInfoCardModel href "" "zzupy.aio.app.auth.PersonalInfoCardModel"
‘我的’页中个人信息卡片 API 响应根模型
PersonalInfoModel
¤
flowchart TD
zzupy.aio.app.auth.PersonalInfoModel[PersonalInfoModel]
click zzupy.aio.app.auth.PersonalInfoModel href "" "zzupy.aio.app.auth.PersonalInfoModel"
个人信息 API 响应根模型
CASClient
¤
flowchart TD
zzupy.aio.app.auth.CASClient[CASClient]
zzupy.aio.app.interfaces.ICASClient[ICASClient]
zzupy.aio.app.interfaces.ICASClient --> zzupy.aio.app.auth.CASClient
click zzupy.aio.app.auth.CASClient href "" "zzupy.aio.app.auth.CASClient"
click zzupy.aio.app.interfaces.ICASClient href "" "zzupy.aio.app.interfaces.ICASClient"
统一认证系统 (CAS) App 客户端。
Parameters:
build_http_event_hooks
¤
创建带脱敏能力的 HTTP 请求/响应日志钩子。
zzupy.aio.app.eas¤
zzupy.aio.app.eas.undergrad¤
undergrad
¤
140w 教务
Classes:
-
ICASClient– -
DataNotFoundError–请求的数据不存在或当前上下文中无法找到。
-
InvalidArgumentError–调用参数不合法。
-
NetworkError–网络请求失败或网络环境异常。
-
NotLoggedInError–在未登录状态下调用了需要登录的方法。
-
OperationError–服务端接受请求但业务处理失败。
-
ParsingError–响应解析或数据校验失败。
-
Lesson–课表中的一节课
-
TeachingWeek–教学周课表,7 天 × 10 节的网格
-
LessonModel–课程表查询 API 响应根模型
-
SemesterModel–获取全部学期数据 API 响应根模型
-
Semester–单个学期
-
WeekIndexModel–获取某日期的教学周序数 API 响应根模型
-
CurrentSemesterModel–获取当前学期数据 API 响应根模型
-
TeachingWeeks– -
UndergradEASClient–
Functions:
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
require_auth–装饰器:确保调用方法前已登录
Attributes:
-
logger–
ICASClient
¤
flowchart TD
zzupy.aio.app.eas.undergrad.ICASClient[ICASClient]
click zzupy.aio.app.eas.undergrad.ICASClient href "" "zzupy.aio.app.eas.undergrad.ICASClient"
DataNotFoundError
¤
DataNotFoundError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.eas.undergrad.DataNotFoundError[DataNotFoundError]
zzupy.exception.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.OperationError --> zzupy.aio.app.eas.undergrad.DataNotFoundError
zzupy.exception.ZZUError --> zzupy.exception.OperationError
click zzupy.aio.app.eas.undergrad.DataNotFoundError href "" "zzupy.aio.app.eas.undergrad.DataNotFoundError"
click zzupy.exception.OperationError href "" "zzupy.exception.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
请求的数据不存在或当前上下文中无法找到。
InvalidArgumentError
¤
InvalidArgumentError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.eas.undergrad.InvalidArgumentError[InvalidArgumentError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.eas.undergrad.InvalidArgumentError
click zzupy.aio.app.eas.undergrad.InvalidArgumentError href "" "zzupy.aio.app.eas.undergrad.InvalidArgumentError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
调用参数不合法。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.eas.undergrad.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.eas.undergrad.NetworkError
click zzupy.aio.app.eas.undergrad.NetworkError href "" "zzupy.aio.app.eas.undergrad.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
NotLoggedInError
¤
NotLoggedInError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.eas.undergrad.NotLoggedInError[NotLoggedInError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.aio.app.eas.undergrad.NotLoggedInError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.aio.app.eas.undergrad.NotLoggedInError href "" "zzupy.aio.app.eas.undergrad.NotLoggedInError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
在未登录状态下调用了需要登录的方法。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.eas.undergrad.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.eas.undergrad.OperationError
click zzupy.aio.app.eas.undergrad.OperationError href "" "zzupy.aio.app.eas.undergrad.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.eas.undergrad.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.eas.undergrad.ParsingError
click zzupy.aio.app.eas.undergrad.ParsingError href "" "zzupy.aio.app.eas.undergrad.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
Lesson
¤
flowchart TD
zzupy.aio.app.eas.undergrad.Lesson[Lesson]
click zzupy.aio.app.eas.undergrad.Lesson href "" "zzupy.aio.app.eas.undergrad.Lesson"
课表中的一节课
TeachingWeek
¤
flowchart TD
zzupy.aio.app.eas.undergrad.TeachingWeek[TeachingWeek]
click zzupy.aio.app.eas.undergrad.TeachingWeek href "" "zzupy.aio.app.eas.undergrad.TeachingWeek"
教学周课表,7 天 × 10 节的网格
LessonModel
¤
flowchart TD
zzupy.aio.app.eas.undergrad.LessonModel[LessonModel]
click zzupy.aio.app.eas.undergrad.LessonModel href "" "zzupy.aio.app.eas.undergrad.LessonModel"
课程表查询 API 响应根模型
SemesterModel
¤
flowchart TD
zzupy.aio.app.eas.undergrad.SemesterModel[SemesterModel]
click zzupy.aio.app.eas.undergrad.SemesterModel href "" "zzupy.aio.app.eas.undergrad.SemesterModel"
获取全部学期数据 API 响应根模型
Semester
¤
flowchart TD
zzupy.aio.app.eas.undergrad.Semester[Semester]
click zzupy.aio.app.eas.undergrad.Semester href "" "zzupy.aio.app.eas.undergrad.Semester"
单个学期
WeekIndexModel
¤
flowchart TD
zzupy.aio.app.eas.undergrad.WeekIndexModel[WeekIndexModel]
click zzupy.aio.app.eas.undergrad.WeekIndexModel href "" "zzupy.aio.app.eas.undergrad.WeekIndexModel"
获取某日期的教学周序数 API 响应根模型
CurrentSemesterModel
¤
flowchart TD
zzupy.aio.app.eas.undergrad.CurrentSemesterModel[CurrentSemesterModel]
click zzupy.aio.app.eas.undergrad.CurrentSemesterModel href "" "zzupy.aio.app.eas.undergrad.CurrentSemesterModel"
获取当前学期数据 API 响应根模型
TeachingWeeks
¤
flowchart TD
zzupy.aio.app.eas.undergrad.TeachingWeeks[TeachingWeeks]
click zzupy.aio.app.eas.undergrad.TeachingWeeks href "" "zzupy.aio.app.eas.undergrad.TeachingWeeks"
build_http_event_hooks
¤
创建带脱敏能力的 HTTP 请求/响应日志钩子。
zzupy.aio.app.ecard¤
ecard
¤
一卡通
Classes:
-
ICASClient– -
InvalidArgumentError–调用参数不合法。
-
NetworkError–网络请求失败或网络环境异常。
-
NotLoggedInError–在未登录状态下调用了需要登录的方法。
-
OperationError–服务端接受请求但业务处理失败。
-
ParsingError–响应解析或数据校验失败。
-
ECardClient–一卡通客户端
Functions:
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
-
log_http_headers–输出脱敏后的 HTTP 头日志。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
sm4_decrypt_ecb–SM4 解密,ECB模式
-
require_auth–装饰器:确保调用方法前已登录
Attributes:
-
logger–
ICASClient
¤
flowchart TD
zzupy.aio.app.ecard.ICASClient[ICASClient]
click zzupy.aio.app.ecard.ICASClient href "" "zzupy.aio.app.ecard.ICASClient"
InvalidArgumentError
¤
InvalidArgumentError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.ecard.InvalidArgumentError[InvalidArgumentError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.ecard.InvalidArgumentError
click zzupy.aio.app.ecard.InvalidArgumentError href "" "zzupy.aio.app.ecard.InvalidArgumentError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
调用参数不合法。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.ecard.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.ecard.NetworkError
click zzupy.aio.app.ecard.NetworkError href "" "zzupy.aio.app.ecard.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
NotLoggedInError
¤
NotLoggedInError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.ecard.NotLoggedInError[NotLoggedInError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.aio.app.ecard.NotLoggedInError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.aio.app.ecard.NotLoggedInError href "" "zzupy.aio.app.ecard.NotLoggedInError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
在未登录状态下调用了需要登录的方法。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.ecard.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.ecard.OperationError
click zzupy.aio.app.ecard.OperationError href "" "zzupy.aio.app.ecard.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.app.ecard.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.app.ecard.ParsingError
click zzupy.aio.app.ecard.ParsingError href "" "zzupy.aio.app.ecard.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
ECardClient
¤
ECardClient(cas_client: ICASClient)
build_http_event_hooks
¤
创建带脱敏能力的 HTTP 请求/响应日志钩子。
log_http_headers
¤
输出脱敏后的 HTTP 头日志。
log_http_response_body
¤
log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None
输出脱敏后的 HTTP 响应体日志。
zzupy.aio.app.interfaces¤
interfaces
¤
抽象接口
Classes:
zzupy.aio.web¤
web
¤
Web API 客户端模块
Modules:
-
network–校园网模块
Classes:
-
EPortalClient–Portal 认证客户端 / 校园网认证客户端
-
SelfServiceSystem–自助服务系统
Functions:
-
discover_portal_info–自动发现校园网Portal认证信息
Attributes:
-
__all__–
EPortalClient
¤
EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)
discover_portal_info
async
¤
discover_portal_info() -> PortalInfo
自动发现校园网Portal认证信息
Returns:
-
PortalInfo(PortalInfo) –Portal信息
Raises:
-
NetworkError–如果网络错误,或当前环境无法检测到 Portal 信息
-
ParsingError–如果响应格式异常
network
¤
校园网模块
zzupy.aio.web.network¤
network
¤
校园网模块
Classes:
-
LoginError–登录失败。
-
NetworkError–网络请求失败或网络环境异常。
-
OperationError–服务端接受请求但业务处理失败。
-
ParsingError–响应解析或数据校验失败。
-
ZZUError–项目异常基类。
-
AuthResult–Portal 认证结果
-
OnlineDevice–在线设备信息
-
PortalInfo–探测出的 Portal 认证信息
-
JsonPParser–JsonP 格式数据解析器
-
XorCipher–一个使用异或 (XOR) 算法进行简单加密和解密的类。
-
EPortalClient–Portal 认证客户端 / 校园网认证客户端
-
SelfServiceSystem–自助服务系统
Functions:
-
get_local_ip–获取用于连接到特定目标IP的本地IP地址。
-
require_auth–装饰器:确保调用方法前已登录
-
discover_portal_info–自动发现校园网Portal认证信息
LoginError
¤
LoginError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.web.network.LoginError[LoginError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.web.network.LoginError
click zzupy.aio.web.network.LoginError href "" "zzupy.aio.web.network.LoginError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
登录失败。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.web.network.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.web.network.NetworkError
click zzupy.aio.web.network.NetworkError href "" "zzupy.aio.web.network.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.web.network.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.web.network.OperationError
click zzupy.aio.web.network.OperationError href "" "zzupy.aio.web.network.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.web.network.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.aio.web.network.ParsingError
click zzupy.aio.web.network.ParsingError href "" "zzupy.aio.web.network.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
ZZUError
¤
ZZUError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.aio.web.network.ZZUError[ZZUError]
click zzupy.aio.web.network.ZZUError href "" "zzupy.aio.web.network.ZZUError"
项目异常基类。
除了人类可读的错误消息外,还会保留额外上下文,便于调用方记录日志、 序列化或调试。
Parameters:
-
(message¤str | None, default:None) –错误消息。
-
(context¤Mapping[str, Any] | None, default:None) –结构化上下文信息。
-
(error_code¤str | None, default:None) –可选错误代码。
AuthResult
¤
flowchart TD
zzupy.aio.web.network.AuthResult[AuthResult]
click zzupy.aio.web.network.AuthResult href "" "zzupy.aio.web.network.AuthResult"
Portal 认证结果
OnlineDevice
¤
flowchart TD
zzupy.aio.web.network.OnlineDevice[OnlineDevice]
click zzupy.aio.web.network.OnlineDevice href "" "zzupy.aio.web.network.OnlineDevice"
在线设备信息
PortalInfo
¤
flowchart TD
zzupy.aio.web.network.PortalInfo[PortalInfo]
click zzupy.aio.web.network.PortalInfo href "" "zzupy.aio.web.network.PortalInfo"
探测出的 Portal 认证信息
EPortalClient
¤
EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)
get_local_ip
¤
discover_portal_info
async
¤
discover_portal_info() -> PortalInfo
自动发现校园网Portal认证信息
Returns:
-
PortalInfo(PortalInfo) –Portal信息
Raises:
-
NetworkError–如果网络错误,或当前环境无法检测到 Portal 信息
-
ParsingError–如果响应格式异常
zzupy.app¤
app
¤
移动应用 API 抽象层
Modules:
-
auth–统一认证
-
eas– -
ecard–一卡通
-
interfaces–抽象接口
Classes:
-
CASClient–统一认证系统 (CAS) App 客户端。
-
ECardClient–一卡通客户端
-
UndergradEASClient–
Attributes:
-
__all__–
CASClient
¤
flowchart TD
zzupy.app.CASClient[CASClient]
zzupy.app.interfaces.ICASClient[ICASClient]
zzupy.app.interfaces.ICASClient --> zzupy.app.CASClient
click zzupy.app.CASClient href "" "zzupy.app.CASClient"
click zzupy.app.interfaces.ICASClient href "" "zzupy.app.interfaces.ICASClient"
统一认证系统 (CAS) App 客户端。
Parameters:
ECardClient
¤
ECardClient(cas_client: ICASClient)
auth
¤
统一认证
eas
¤
ecard
¤
一卡通
interfaces
¤
抽象接口
zzupy.app.auth¤
auth
¤
统一认证
Classes:
-
ICASClient– -
RSAPublicKey–轻量级 RSA 公钥实现
-
padding–填充方案命名空间(兼容 cryptography)
-
serialization–序列化命名空间(兼容 cryptography)
-
LoginError–登录失败。
-
ParsingError–响应解析或数据校验失败。
-
NetworkError–网络请求失败或网络环境异常。
-
OperationError–服务端接受请求但业务处理失败。
-
PersonalInfo–个人信息模型
-
PersonalInfoModel–个人信息 API 响应根模型
-
PersonalInfoCardModel–‘我的’页中个人信息卡片 API 响应根模型
-
CASClient–统一认证系统 (CAS) App 客户端。
Functions:
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
require_auth–装饰器:确保调用方法前已登录
Attributes:
-
logger–
ICASClient
¤
flowchart TD
zzupy.app.auth.ICASClient[ICASClient]
click zzupy.app.auth.ICASClient href "" "zzupy.app.auth.ICASClient"
RSAPublicKey
¤
padding
¤
填充方案命名空间(兼容 cryptography)
serialization
¤
序列化命名空间(兼容 cryptography)
Methods:
-
load_pem_public_key–加载 PEM 格式公钥(兼容 cryptography 接口)
load_pem_public_key
staticmethod
¤
load_pem_public_key(data: bytes) -> RSAPublicKey
加载 PEM 格式公钥(兼容 cryptography 接口)
LoginError
¤
LoginError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.auth.LoginError[LoginError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.auth.LoginError
click zzupy.app.auth.LoginError href "" "zzupy.app.auth.LoginError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
登录失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.auth.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.auth.ParsingError
click zzupy.app.auth.ParsingError href "" "zzupy.app.auth.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.auth.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.auth.NetworkError
click zzupy.app.auth.NetworkError href "" "zzupy.app.auth.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.auth.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.auth.OperationError
click zzupy.app.auth.OperationError href "" "zzupy.app.auth.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
PersonalInfo
¤
flowchart TD
zzupy.app.auth.PersonalInfo[PersonalInfo]
click zzupy.app.auth.PersonalInfo href "" "zzupy.app.auth.PersonalInfo"
个人信息模型
PersonalInfoModel
¤
flowchart TD
zzupy.app.auth.PersonalInfoModel[PersonalInfoModel]
click zzupy.app.auth.PersonalInfoModel href "" "zzupy.app.auth.PersonalInfoModel"
个人信息 API 响应根模型
PersonalInfoCardModel
¤
flowchart TD
zzupy.app.auth.PersonalInfoCardModel[PersonalInfoCardModel]
click zzupy.app.auth.PersonalInfoCardModel href "" "zzupy.app.auth.PersonalInfoCardModel"
‘我的’页中个人信息卡片 API 响应根模型
CASClient
¤
flowchart TD
zzupy.app.auth.CASClient[CASClient]
zzupy.app.interfaces.ICASClient[ICASClient]
zzupy.app.interfaces.ICASClient --> zzupy.app.auth.CASClient
click zzupy.app.auth.CASClient href "" "zzupy.app.auth.CASClient"
click zzupy.app.interfaces.ICASClient href "" "zzupy.app.interfaces.ICASClient"
统一认证系统 (CAS) App 客户端。
Parameters:
build_http_event_hooks
¤
创建带脱敏能力的 HTTP 请求/响应日志钩子。
zzupy.app.eas¤
zzupy.app.eas.undergrad¤
undergrad
¤
140w 教务
Classes:
-
ICASClient– -
DataNotFoundError–请求的数据不存在或当前上下文中无法找到。
-
InvalidArgumentError–调用参数不合法。
-
NetworkError–网络请求失败或网络环境异常。
-
NotLoggedInError–在未登录状态下调用了需要登录的方法。
-
OperationError–服务端接受请求但业务处理失败。
-
ParsingError–响应解析或数据校验失败。
-
Lesson–课表中的一节课
-
TeachingWeek–教学周课表,7 天 × 10 节的网格
-
LessonModel–课程表查询 API 响应根模型
-
SemesterModel–获取全部学期数据 API 响应根模型
-
Semester–单个学期
-
WeekIndexModel–获取某日期的教学周序数 API 响应根模型
-
CurrentSemesterModel–获取当前学期数据 API 响应根模型
-
TeachingWeeks– -
UndergradEASClient–
Functions:
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
require_auth–装饰器:确保调用方法前已登录
Attributes:
-
logger–
ICASClient
¤
flowchart TD
zzupy.app.eas.undergrad.ICASClient[ICASClient]
click zzupy.app.eas.undergrad.ICASClient href "" "zzupy.app.eas.undergrad.ICASClient"
DataNotFoundError
¤
DataNotFoundError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.eas.undergrad.DataNotFoundError[DataNotFoundError]
zzupy.exception.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.OperationError --> zzupy.app.eas.undergrad.DataNotFoundError
zzupy.exception.ZZUError --> zzupy.exception.OperationError
click zzupy.app.eas.undergrad.DataNotFoundError href "" "zzupy.app.eas.undergrad.DataNotFoundError"
click zzupy.exception.OperationError href "" "zzupy.exception.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
请求的数据不存在或当前上下文中无法找到。
InvalidArgumentError
¤
InvalidArgumentError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.eas.undergrad.InvalidArgumentError[InvalidArgumentError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.eas.undergrad.InvalidArgumentError
click zzupy.app.eas.undergrad.InvalidArgumentError href "" "zzupy.app.eas.undergrad.InvalidArgumentError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
调用参数不合法。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.eas.undergrad.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.eas.undergrad.NetworkError
click zzupy.app.eas.undergrad.NetworkError href "" "zzupy.app.eas.undergrad.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
NotLoggedInError
¤
NotLoggedInError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.eas.undergrad.NotLoggedInError[NotLoggedInError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.app.eas.undergrad.NotLoggedInError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.app.eas.undergrad.NotLoggedInError href "" "zzupy.app.eas.undergrad.NotLoggedInError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
在未登录状态下调用了需要登录的方法。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.eas.undergrad.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.eas.undergrad.OperationError
click zzupy.app.eas.undergrad.OperationError href "" "zzupy.app.eas.undergrad.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.eas.undergrad.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.eas.undergrad.ParsingError
click zzupy.app.eas.undergrad.ParsingError href "" "zzupy.app.eas.undergrad.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
Lesson
¤
flowchart TD
zzupy.app.eas.undergrad.Lesson[Lesson]
click zzupy.app.eas.undergrad.Lesson href "" "zzupy.app.eas.undergrad.Lesson"
课表中的一节课
TeachingWeek
¤
flowchart TD
zzupy.app.eas.undergrad.TeachingWeek[TeachingWeek]
click zzupy.app.eas.undergrad.TeachingWeek href "" "zzupy.app.eas.undergrad.TeachingWeek"
教学周课表,7 天 × 10 节的网格
LessonModel
¤
flowchart TD
zzupy.app.eas.undergrad.LessonModel[LessonModel]
click zzupy.app.eas.undergrad.LessonModel href "" "zzupy.app.eas.undergrad.LessonModel"
课程表查询 API 响应根模型
SemesterModel
¤
flowchart TD
zzupy.app.eas.undergrad.SemesterModel[SemesterModel]
click zzupy.app.eas.undergrad.SemesterModel href "" "zzupy.app.eas.undergrad.SemesterModel"
获取全部学期数据 API 响应根模型
Semester
¤
flowchart TD
zzupy.app.eas.undergrad.Semester[Semester]
click zzupy.app.eas.undergrad.Semester href "" "zzupy.app.eas.undergrad.Semester"
单个学期
WeekIndexModel
¤
flowchart TD
zzupy.app.eas.undergrad.WeekIndexModel[WeekIndexModel]
click zzupy.app.eas.undergrad.WeekIndexModel href "" "zzupy.app.eas.undergrad.WeekIndexModel"
获取某日期的教学周序数 API 响应根模型
CurrentSemesterModel
¤
flowchart TD
zzupy.app.eas.undergrad.CurrentSemesterModel[CurrentSemesterModel]
click zzupy.app.eas.undergrad.CurrentSemesterModel href "" "zzupy.app.eas.undergrad.CurrentSemesterModel"
获取当前学期数据 API 响应根模型
TeachingWeeks
¤
flowchart TD
zzupy.app.eas.undergrad.TeachingWeeks[TeachingWeeks]
click zzupy.app.eas.undergrad.TeachingWeeks href "" "zzupy.app.eas.undergrad.TeachingWeeks"
build_http_event_hooks
¤
创建带脱敏能力的 HTTP 请求/响应日志钩子。
zzupy.app.ecard¤
ecard
¤
一卡通
Classes:
-
ICASClient– -
InvalidArgumentError–调用参数不合法。
-
NetworkError–网络请求失败或网络环境异常。
-
NotLoggedInError–在未登录状态下调用了需要登录的方法。
-
OperationError–服务端接受请求但业务处理失败。
-
ParsingError–响应解析或数据校验失败。
-
ECardClient–一卡通客户端
Functions:
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
-
log_http_headers–输出脱敏后的 HTTP 头日志。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
sm4_decrypt_ecb–SM4 解密,ECB模式
-
require_auth–装饰器:确保调用方法前已登录
Attributes:
-
logger–
ICASClient
¤
flowchart TD
zzupy.app.ecard.ICASClient[ICASClient]
click zzupy.app.ecard.ICASClient href "" "zzupy.app.ecard.ICASClient"
InvalidArgumentError
¤
InvalidArgumentError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.ecard.InvalidArgumentError[InvalidArgumentError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.ecard.InvalidArgumentError
click zzupy.app.ecard.InvalidArgumentError href "" "zzupy.app.ecard.InvalidArgumentError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
调用参数不合法。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.ecard.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.ecard.NetworkError
click zzupy.app.ecard.NetworkError href "" "zzupy.app.ecard.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
NotLoggedInError
¤
NotLoggedInError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.ecard.NotLoggedInError[NotLoggedInError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.app.ecard.NotLoggedInError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.app.ecard.NotLoggedInError href "" "zzupy.app.ecard.NotLoggedInError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
在未登录状态下调用了需要登录的方法。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.ecard.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.ecard.OperationError
click zzupy.app.ecard.OperationError href "" "zzupy.app.ecard.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.app.ecard.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.app.ecard.ParsingError
click zzupy.app.ecard.ParsingError href "" "zzupy.app.ecard.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
ECardClient
¤
ECardClient(cas_client: ICASClient)
build_http_event_hooks
¤
创建带脱敏能力的 HTTP 请求/响应日志钩子。
log_http_headers
¤
输出脱敏后的 HTTP 头日志。
log_http_response_body
¤
log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None
输出脱敏后的 HTTP 响应体日志。
zzupy.app.interfaces¤
interfaces
¤
抽象接口
Classes:
zzupy.crypto¤
crypto
¤
纯 Python 实现的轻量级 RSA 加密
Classes:
-
RSAPublicKey–轻量级 RSA 公钥实现
-
padding–填充方案命名空间(兼容 cryptography)
-
serialization–序列化命名空间(兼容 cryptography)
Functions:
-
load_pem_public_key–从 PEM 格式加载 RSA 公钥
-
_parse_der_public_key–解析 DER 编码的 RSA 公钥
RSAPublicKey
¤
padding
¤
填充方案命名空间(兼容 cryptography)
serialization
¤
序列化命名空间(兼容 cryptography)
Methods:
-
load_pem_public_key–加载 PEM 格式公钥(兼容 cryptography 接口)
load_pem_public_key
staticmethod
¤
load_pem_public_key(data: bytes) -> RSAPublicKey
加载 PEM 格式公钥(兼容 cryptography 接口)
load_pem_public_key
¤
load_pem_public_key(pem_data: bytes) -> RSAPublicKey
zzupy.exception¤
exception
¤
异常处理模块。
Classes:
-
ZZUError–项目异常基类。
-
ClientStateError–客户端状态错误。
-
InvalidArgumentError–调用参数不合法。
-
NetworkError–网络请求失败或网络环境异常。
-
LoginError–登录失败。
-
ParsingError–响应解析或数据校验失败。
-
NotLoggedInError–在未登录状态下调用了需要登录的方法。
-
AuthenticationError–认证失败。
-
OperationError–服务端接受请求但业务处理失败。
-
DataNotFoundError–请求的数据不存在或当前上下文中无法找到。
Attributes:
-
__all__–
__all__
module-attribute
¤
__all__ = ['AuthenticationError', 'ClientStateError', 'DataNotFoundError', 'InvalidArgumentError', 'LoginError', 'NetworkError', 'NotLoggedInError', 'OperationError', 'ParsingError', 'ZZUError']
ZZUError
¤
ZZUError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.ZZUError[ZZUError]
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
项目异常基类。
除了人类可读的错误消息外,还会保留额外上下文,便于调用方记录日志、 序列化或调试。
Parameters:
-
(message¤str | None, default:None) –错误消息。
-
(context¤Mapping[str, Any] | None, default:None) –结构化上下文信息。
-
(error_code¤str | None, default:None) –可选错误代码。
ClientStateError
¤
ClientStateError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
客户端状态错误。
InvalidArgumentError
¤
InvalidArgumentError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.InvalidArgumentError[InvalidArgumentError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.exception.InvalidArgumentError
click zzupy.exception.InvalidArgumentError href "" "zzupy.exception.InvalidArgumentError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
调用参数不合法。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.exception.NetworkError
click zzupy.exception.NetworkError href "" "zzupy.exception.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
LoginError
¤
LoginError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.LoginError[LoginError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.exception.LoginError
click zzupy.exception.LoginError href "" "zzupy.exception.LoginError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
登录失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.exception.ParsingError
click zzupy.exception.ParsingError href "" "zzupy.exception.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
NotLoggedInError
¤
NotLoggedInError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.NotLoggedInError[NotLoggedInError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.exception.NotLoggedInError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.exception.NotLoggedInError href "" "zzupy.exception.NotLoggedInError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
在未登录状态下调用了需要登录的方法。
AuthenticationError
¤
AuthenticationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.AuthenticationError[AuthenticationError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.exception.AuthenticationError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.exception.AuthenticationError href "" "zzupy.exception.AuthenticationError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
认证失败。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.exception.OperationError
click zzupy.exception.OperationError href "" "zzupy.exception.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
DataNotFoundError
¤
DataNotFoundError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.exception.DataNotFoundError[DataNotFoundError]
zzupy.exception.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.OperationError --> zzupy.exception.DataNotFoundError
zzupy.exception.ZZUError --> zzupy.exception.OperationError
click zzupy.exception.DataNotFoundError href "" "zzupy.exception.DataNotFoundError"
click zzupy.exception.OperationError href "" "zzupy.exception.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
请求的数据不存在或当前上下文中无法找到。
zzupy.logging¤
logging
¤
zzupy 日志工具。
Functions:
-
_normalize_key– -
_is_sensitive_key– -
_truncate_text– -
_sanitize_value– -
sanitize_http_headers–脱敏并标准化 HTTP 头,便于安全输出到日志。
-
sanitize_http_url–脱敏 URL 查询参数。
-
sanitize_http_body–按内容类型对 HTTP Body 做脱敏与截断。
-
log_http_headers–输出脱敏后的 HTTP 头日志。
-
log_http_response_body–输出脱敏后的 HTTP 响应体日志。
-
build_http_event_hooks–创建带脱敏能力的 HTTP 请求/响应日志钩子。
Attributes:
-
logger– -
_REDACTED– -
_MAX_BODY_LENGTH– -
_DEFAULT_HANDLER_ID– -
_TEXT_CONTENT_TYPES– -
_SENSITIVE_KEYS–
_TEXT_CONTENT_TYPES
module-attribute
¤
_TEXT_CONTENT_TYPES = ('application/json', 'application/x-www-form-urlencoded', 'application/xml', 'application/javascript', 'text/')
_SENSITIVE_KEYS
module-attribute
¤
_SENSITIVE_KEYS = frozenset({'access_token', 'accesstoken', 'authorization', 'clientid', 'cookie', 'deviceid', 'password', 'refresh_token', 'refreshtoken', 'set-cookie', 'token', 'user_token', 'usertoken', 'username'})
sanitize_http_headers
¤
脱敏并标准化 HTTP 头,便于安全输出到日志。
sanitize_http_body
¤
sanitize_http_body(body: bytes | str | None, *, content_type: str | None = None, limit: int = _MAX_BODY_LENGTH) -> str
按内容类型对 HTTP Body 做脱敏与截断。
log_http_headers
¤
输出脱敏后的 HTTP 头日志。
zzupy.model¤
zzupy.model.auth¤
auth
¤
Classes:
-
PersonalInfoCardModel–‘我的’页中个人信息卡片 API 响应根模型
-
PersonalInfo–个人信息模型
-
PersonalInfoModel–个人信息 API 响应根模型
PersonalInfoCardModel
¤
flowchart TD
zzupy.model.auth.PersonalInfoCardModel[PersonalInfoCardModel]
click zzupy.model.auth.PersonalInfoCardModel href "" "zzupy.model.auth.PersonalInfoCardModel"
‘我的’页中个人信息卡片 API 响应根模型
PersonalInfo
¤
flowchart TD
zzupy.model.auth.PersonalInfo[PersonalInfo]
click zzupy.model.auth.PersonalInfo href "" "zzupy.model.auth.PersonalInfo"
个人信息模型
PersonalInfoModel
¤
flowchart TD
zzupy.model.auth.PersonalInfoModel[PersonalInfoModel]
click zzupy.model.auth.PersonalInfoModel href "" "zzupy.model.auth.PersonalInfoModel"
个人信息 API 响应根模型
zzupy.model.eas¤
eas
¤
Classes:
-
Campus–校区信息
-
CultivateType–培养类型,如主修、辅修等
-
PeriodInfo–课时详情,描述一门课程各类学时的分配情况
-
Course–课程基本信息
-
OpenDepartment–开课院系
-
CourseType–课程类型,如必修课、选修课等
-
DateTimeText–上课时间的文字描述
-
DateTimePlaceText–上课时间与地点的文字描述,如「1~16周 星期四 3~4节 主校区 北3_111」
-
DateTimePlacePersonText–上课时间、地点与教师的文字描述,如「1~16周 星期四 3~4节 主校区 北3_111 王艳玲」
-
ScheduleText–教学班排课的综合文字描述,聚合了三个层次的描述信息
-
ScheduleGroup–排课组,将一个教学班的多次课归入同一组
-
Building–楼栋信息
-
Room–教室信息
-
Schedule–单次课程的具体排课记录
-
Datum–教学班信息,包含课程、排课等完整数据
-
LessonModel–课程表查询 API 响应根模型
-
Lesson–课表中的一节课
-
TeachingWeek–教学周课表,7 天 × 10 节的网格
-
TeachingWeeks– -
Semester–单个学期
-
SemesterModel–获取全部学期数据 API 响应根模型
-
CurrentSemesterModel–获取当前学期数据 API 响应根模型
-
WeekIndexModel–获取某日期的教学周序数 API 响应根模型
Campus
¤
flowchart TD
zzupy.model.eas.Campus[Campus]
click zzupy.model.eas.Campus href "" "zzupy.model.eas.Campus"
校区信息
CultivateType
¤
flowchart TD
zzupy.model.eas.CultivateType[CultivateType]
click zzupy.model.eas.CultivateType href "" "zzupy.model.eas.CultivateType"
培养类型,如主修、辅修等
PeriodInfo
¤
flowchart TD
zzupy.model.eas.PeriodInfo[PeriodInfo]
click zzupy.model.eas.PeriodInfo href "" "zzupy.model.eas.PeriodInfo"
课时详情,描述一门课程各类学时的分配情况
Course
¤
flowchart TD
zzupy.model.eas.Course[Course]
click zzupy.model.eas.Course href "" "zzupy.model.eas.Course"
课程基本信息
OpenDepartment
¤
flowchart TD
zzupy.model.eas.OpenDepartment[OpenDepartment]
click zzupy.model.eas.OpenDepartment href "" "zzupy.model.eas.OpenDepartment"
开课院系
CourseType
¤
flowchart TD
zzupy.model.eas.CourseType[CourseType]
click zzupy.model.eas.CourseType href "" "zzupy.model.eas.CourseType"
课程类型,如必修课、选修课等
DateTimeText
¤
flowchart TD
zzupy.model.eas.DateTimeText[DateTimeText]
click zzupy.model.eas.DateTimeText href "" "zzupy.model.eas.DateTimeText"
上课时间的文字描述
DateTimePlaceText
¤
flowchart TD
zzupy.model.eas.DateTimePlaceText[DateTimePlaceText]
click zzupy.model.eas.DateTimePlaceText href "" "zzupy.model.eas.DateTimePlaceText"
上课时间与地点的文字描述,如「1~16周 星期四 3~4节 主校区 北3_111」
DateTimePlacePersonText
¤
flowchart TD
zzupy.model.eas.DateTimePlacePersonText[DateTimePlacePersonText]
click zzupy.model.eas.DateTimePlacePersonText href "" "zzupy.model.eas.DateTimePlacePersonText"
上课时间、地点与教师的文字描述,如「1~16周 星期四 3~4节 主校区 北3_111 王艳玲」
ScheduleText
¤
flowchart TD
zzupy.model.eas.ScheduleText[ScheduleText]
click zzupy.model.eas.ScheduleText href "" "zzupy.model.eas.ScheduleText"
教学班排课的综合文字描述,聚合了三个层次的描述信息
ScheduleGroup
¤
flowchart TD
zzupy.model.eas.ScheduleGroup[ScheduleGroup]
click zzupy.model.eas.ScheduleGroup href "" "zzupy.model.eas.ScheduleGroup"
排课组,将一个教学班的多次课归入同一组
Building
¤
flowchart TD
zzupy.model.eas.Building[Building]
click zzupy.model.eas.Building href "" "zzupy.model.eas.Building"
楼栋信息
Room
¤
flowchart TD
zzupy.model.eas.Room[Room]
click zzupy.model.eas.Room href "" "zzupy.model.eas.Room"
教室信息
Schedule
¤
flowchart TD
zzupy.model.eas.Schedule[Schedule]
click zzupy.model.eas.Schedule href "" "zzupy.model.eas.Schedule"
单次课程的具体排课记录
Datum
¤
flowchart TD
zzupy.model.eas.Datum[Datum]
click zzupy.model.eas.Datum href "" "zzupy.model.eas.Datum"
教学班信息,包含课程、排课等完整数据
LessonModel
¤
flowchart TD
zzupy.model.eas.LessonModel[LessonModel]
click zzupy.model.eas.LessonModel href "" "zzupy.model.eas.LessonModel"
课程表查询 API 响应根模型
Lesson
¤
flowchart TD
zzupy.model.eas.Lesson[Lesson]
click zzupy.model.eas.Lesson href "" "zzupy.model.eas.Lesson"
课表中的一节课
TeachingWeek
¤
flowchart TD
zzupy.model.eas.TeachingWeek[TeachingWeek]
click zzupy.model.eas.TeachingWeek href "" "zzupy.model.eas.TeachingWeek"
教学周课表,7 天 × 10 节的网格
TeachingWeeks
¤
flowchart TD
zzupy.model.eas.TeachingWeeks[TeachingWeeks]
click zzupy.model.eas.TeachingWeeks href "" "zzupy.model.eas.TeachingWeeks"
Semester
¤
flowchart TD
zzupy.model.eas.Semester[Semester]
click zzupy.model.eas.Semester href "" "zzupy.model.eas.Semester"
单个学期
SemesterModel
¤
flowchart TD
zzupy.model.eas.SemesterModel[SemesterModel]
click zzupy.model.eas.SemesterModel href "" "zzupy.model.eas.SemesterModel"
获取全部学期数据 API 响应根模型
CurrentSemesterModel
¤
flowchart TD
zzupy.model.eas.CurrentSemesterModel[CurrentSemesterModel]
click zzupy.model.eas.CurrentSemesterModel href "" "zzupy.model.eas.CurrentSemesterModel"
获取当前学期数据 API 响应根模型
WeekIndexModel
¤
flowchart TD
zzupy.model.eas.WeekIndexModel[WeekIndexModel]
click zzupy.model.eas.WeekIndexModel href "" "zzupy.model.eas.WeekIndexModel"
获取某日期的教学周序数 API 响应根模型
zzupy.model.network¤
network
¤
Classes:
-
OnlineDevice–在线设备信息
-
AuthResult–Portal 认证结果
-
PortalInfo–探测出的 Portal 认证信息
OnlineDevice
¤
flowchart TD
zzupy.model.network.OnlineDevice[OnlineDevice]
click zzupy.model.network.OnlineDevice href "" "zzupy.model.network.OnlineDevice"
在线设备信息
AuthResult
¤
flowchart TD
zzupy.model.network.AuthResult[AuthResult]
click zzupy.model.network.AuthResult href "" "zzupy.model.network.AuthResult"
Portal 认证结果
PortalInfo
¤
flowchart TD
zzupy.model.network.PortalInfo[PortalInfo]
click zzupy.model.network.PortalInfo href "" "zzupy.model.network.PortalInfo"
探测出的 Portal 认证信息
zzupy.utils¤
utils
¤
工具函数库
Classes:
-
NotLoggedInError–在未登录状态下调用了需要登录的方法。
-
XorCipher–一个使用异或 (XOR) 算法进行简单加密和解密的类。
-
JsonPParser–JsonP 格式数据解析器
Functions:
-
get_sign–获取sign值
-
pkcs7_unpad–去除数据中的PKCS#7填充。
-
sm4_decrypt_ecb–SM4 解密,ECB模式
-
get_local_ip–获取用于连接到特定目标IP的本地IP地址。
-
require_auth–装饰器:确保调用方法前已登录
NotLoggedInError
¤
NotLoggedInError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.utils.NotLoggedInError[NotLoggedInError]
zzupy.exception.ClientStateError[ClientStateError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ClientStateError --> zzupy.utils.NotLoggedInError
zzupy.exception.ZZUError --> zzupy.exception.ClientStateError
click zzupy.utils.NotLoggedInError href "" "zzupy.utils.NotLoggedInError"
click zzupy.exception.ClientStateError href "" "zzupy.exception.ClientStateError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
在未登录状态下调用了需要登录的方法。
pkcs7_unpad
¤
pkcs7_unpad(padded_data: bytes, block_size: int) -> bytes
get_local_ip
¤
zzupy.web¤
web
¤
Web API 客户端模块
Modules:
-
network–校园网模块
Classes:
-
EPortalClient–Portal 认证客户端 / 校园网认证客户端
-
SelfServiceSystem–自助服务系统
Functions:
-
discover_portal_info–自动发现校园网Portal认证信息
Attributes:
-
__all__–
EPortalClient
¤
EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)
discover_portal_info
¤
discover_portal_info() -> PortalInfo
自动发现校园网Portal认证信息
Returns:
-
PortalInfo(PortalInfo) –Portal信息
Raises:
-
NetworkError–如果网络错误,或当前环境无法检测到 Portal 信息
-
ParsingError–如果响应格式异常
network
¤
校园网模块
zzupy.web.network¤
network
¤
校园网模块
Classes:
-
LoginError–登录失败。
-
NetworkError–网络请求失败或网络环境异常。
-
OperationError–服务端接受请求但业务处理失败。
-
ParsingError–响应解析或数据校验失败。
-
ZZUError–项目异常基类。
-
AuthResult–Portal 认证结果
-
OnlineDevice–在线设备信息
-
PortalInfo–探测出的 Portal 认证信息
-
JsonPParser–JsonP 格式数据解析器
-
XorCipher–一个使用异或 (XOR) 算法进行简单加密和解密的类。
-
EPortalClient–Portal 认证客户端 / 校园网认证客户端
-
SelfServiceSystem–自助服务系统
Functions:
-
get_local_ip–获取用于连接到特定目标IP的本地IP地址。
-
require_auth–装饰器:确保调用方法前已登录
-
discover_portal_info–自动发现校园网Portal认证信息
LoginError
¤
LoginError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.web.network.LoginError[LoginError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.web.network.LoginError
click zzupy.web.network.LoginError href "" "zzupy.web.network.LoginError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
登录失败。
NetworkError
¤
NetworkError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.web.network.NetworkError[NetworkError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.web.network.NetworkError
click zzupy.web.network.NetworkError href "" "zzupy.web.network.NetworkError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
网络请求失败或网络环境异常。
OperationError
¤
OperationError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.web.network.OperationError[OperationError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.web.network.OperationError
click zzupy.web.network.OperationError href "" "zzupy.web.network.OperationError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
服务端接受请求但业务处理失败。
ParsingError
¤
ParsingError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.web.network.ParsingError[ParsingError]
zzupy.exception.ZZUError[ZZUError]
zzupy.exception.ZZUError --> zzupy.web.network.ParsingError
click zzupy.web.network.ParsingError href "" "zzupy.web.network.ParsingError"
click zzupy.exception.ZZUError href "" "zzupy.exception.ZZUError"
响应解析或数据校验失败。
ZZUError
¤
ZZUError(message: str | None = None, *, context: Mapping[str, Any] | None = None, error_code: str | None = None)
flowchart TD
zzupy.web.network.ZZUError[ZZUError]
click zzupy.web.network.ZZUError href "" "zzupy.web.network.ZZUError"
项目异常基类。
除了人类可读的错误消息外,还会保留额外上下文,便于调用方记录日志、 序列化或调试。
Parameters:
-
(message¤str | None, default:None) –错误消息。
-
(context¤Mapping[str, Any] | None, default:None) –结构化上下文信息。
-
(error_code¤str | None, default:None) –可选错误代码。
AuthResult
¤
flowchart TD
zzupy.web.network.AuthResult[AuthResult]
click zzupy.web.network.AuthResult href "" "zzupy.web.network.AuthResult"
Portal 认证结果
OnlineDevice
¤
flowchart TD
zzupy.web.network.OnlineDevice[OnlineDevice]
click zzupy.web.network.OnlineDevice href "" "zzupy.web.network.OnlineDevice"
在线设备信息
PortalInfo
¤
flowchart TD
zzupy.web.network.PortalInfo[PortalInfo]
click zzupy.web.network.PortalInfo href "" "zzupy.web.network.PortalInfo"
探测出的 Portal 认证信息
EPortalClient
¤
EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)
get_local_ip
¤
discover_portal_info
¤
discover_portal_info() -> PortalInfo
自动发现校园网Portal认证信息
Returns:
-
PortalInfo(PortalInfo) –Portal信息
Raises:
-
NetworkError–如果网络错误,或当前环境无法检测到 Portal 信息
-
ParsingError–如果响应格式异常