Skip to content

此页由 Zensical 配合 mkdocstrings 根据源码自动生成,适合在以下场景使用:

  • 查看公开模块和导出符号
  • 确认方法签名、参数名和返回值
  • 查询 Pydantic 模型字段

如果你更关注接入步骤和调用示例,优先阅读 Usage

zzupy¤

zzupy ¤

Modules:

  • aio

    各模块的异步实现

  • app

    移动应用 API 抽象层

  • crypto

    纯 Python 实现的轻量级 RSA 加密

  • exception

    异常处理模块。

  • logging

    zzupy 日志工具。

  • model
  • utils

    工具函数库

  • web

    Web API 客户端模块

Attributes:

logger module-attribute ¤

logger = logger

__version__ module-attribute ¤

__version__ = '7.0.0'

__all__ module-attribute ¤

__all__ = ['aio', 'app', 'web', 'exception', 'logging']

aio ¤

各模块的异步实现

app ¤

移动应用 API 抽象层

crypto ¤

纯 Python 实现的轻量级 RSA 加密

Functions:

load_pem_public_key ¤

load_pem_public_key(pem_data: bytes) -> RSAPublicKey

从 PEM 格式加载 RSA 公钥

Parameters:

  • pem_data ¤

    (bytes) –

    PEM 格式的公钥数据

Returns:

_parse_der_public_key ¤

_parse_der_public_key(der_data: bytes) -> Tuple[int, int]

解析 DER 编码的 RSA 公钥

支持两种格式: 1. PKCS#1 RSAPublicKey (常见于 OpenSSL) 2. X.509 SubjectPublicKeyInfo (标准格式)

Parameters:

  • der_data ¤

    (bytes) –

    DER 编码的公钥数据

Returns:

exception ¤

异常处理模块。

logging ¤

zzupy 日志工具。

model ¤

utils ¤

工具函数库

web ¤

Web API 客户端模块

zzupy.aio¤

aio ¤

各模块的异步实现

Modules:

  • app

    移动应用 API 抽象层

  • web

    Web API 客户端模块

app ¤

移动应用 API 抽象层

web ¤

Web API 客户端模块

zzupy.aio.app¤

app ¤

移动应用 API 抽象层

Modules:

Classes:

Attributes:

__all__ module-attribute ¤

__all__ = ['CASClient', 'ECardClient', 'UndergradEASClient']

CASClient ¤

CASClient(account: str, password: str)

              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:

  • account ¤

    (str) –

    账号

  • password ¤

    (str) –

    密码

_get_public_key async ¤

_get_public_key() -> RSAPublicKey

从 CAS 服务器获取 RSA 公钥。

ECardClient ¤

ECardClient(cas_client: ICASClient)

一卡通客户端

Parameters:

  • cas_client ¤

    (ICASClient) –

    已登录的 CASClient 实例

UndergradEASClient ¤

UndergradEASClient(cas_client: ICASClient)

auth ¤

统一认证

eas ¤

ecard ¤

一卡通

interfaces ¤

抽象接口

zzupy.aio.app.auth¤

auth ¤

统一认证

Classes:

Functions:

Attributes:

logger module-attribute ¤

logger = logger

ICASClient ¤

ICASClient(account: str, password: str)

              flowchart TD
              zzupy.aio.app.auth.ICASClient[ICASClient]

              

              click zzupy.aio.app.auth.ICASClient href "" "zzupy.aio.app.auth.ICASClient"
            

RSAPublicKey ¤

RSAPublicKey(modulus: int, exponent: int)

轻量级 RSA 公钥实现

Parameters:

  • modulus ¤

    (int) –

    RSA 模数 (n)

  • exponent ¤

    (int) –

    RSA 公开指数 (e),通常是 65537

padding ¤

填充方案命名空间(兼容 cryptography)

serialization ¤

序列化命名空间(兼容 cryptography)

Methods:

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 ¤

CASClient(account: str, password: str)

              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:

  • account ¤

    (str) –

    账号

  • password ¤

    (str) –

    密码

_get_public_key async ¤

_get_public_key() -> RSAPublicKey

从 CAS 服务器获取 RSA 公钥。

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.aio.app.eas¤

eas ¤

Modules:

Classes:

Attributes:

__all__ module-attribute ¤

__all__ = ['UndergradEASClient']

UndergradEASClient ¤

UndergradEASClient(cas_client: ICASClient)

undergrad ¤

140w 教务

zzupy.aio.app.eas.undergrad¤

undergrad ¤

140w 教务

Classes:

Functions:

Attributes:

logger module-attribute ¤

logger = logger

ICASClient ¤

ICASClient(account: str, password: str)

              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"
            

UndergradEASClient ¤

UndergradEASClient(cas_client: ICASClient)

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.aio.app.ecard¤

ecard ¤

一卡通

Classes:

Functions:

Attributes:

logger module-attribute ¤

logger = logger

ICASClient ¤

ICASClient(account: str, password: str)

              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)

一卡通客户端

Parameters:

  • cas_client ¤

    (ICASClient) –

    已登录的 CASClient 实例

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

log_http_headers ¤

log_http_headers(message: str, headers: Headers, *, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 头日志。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

sm4_decrypt_ecb ¤

sm4_decrypt_ecb(ciphertext: bytes, key: bytes) -> str

SM4 解密,ECB模式

Parameters:

Returns:

  • str

    明文 Hex

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.aio.app.interfaces¤

interfaces ¤

抽象接口

Classes:

ICASClient ¤

ICASClient(account: str, password: str)

              flowchart TD
              zzupy.aio.app.interfaces.ICASClient[ICASClient]

              

              click zzupy.aio.app.interfaces.ICASClient href "" "zzupy.aio.app.interfaces.ICASClient"
            

zzupy.aio.web¤

web ¤

Web API 客户端模块

Modules:

Classes:

Functions:

Attributes:

__all__ module-attribute ¤

__all__ = ['EPortalClient', 'SelfServiceSystem', 'discover_portal_info']

EPortalClient ¤

EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)

Portal 认证客户端 / 校园网认证客户端

Parameters:

  • base_url ¤

    (str) –

    Portal 服务器的 Base URL

  • bind_address ¤

    (str | None, default: None ) –

    绑定的本地 IP

  • force_bind ¤

    (bool, default: False ) –

    即便 IP 绑定失败也在请求参数中使用该 IP。

    如果你在路由器后使用本方法,则需要把 bind_address 填写为路由器分配的内网 IP 并启用 force_bind

SelfServiceSystem ¤

SelfServiceSystem(base_url: str)

自助服务系统

discover_portal_info async ¤

discover_portal_info() -> PortalInfo

自动发现校园网Portal认证信息

Returns:

Raises:

  • NetworkError

    如果网络错误,或当前环境无法检测到 Portal 信息

  • ParsingError

    如果响应格式异常

network ¤

校园网模块

zzupy.aio.web.network¤

network ¤

校园网模块

Classes:

Functions:

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 认证信息

JsonPParser ¤

JsonPParser(text: str)

JsonP 格式数据解析器

XorCipher ¤

XorCipher(key_string: str = '')

一个使用异或 (XOR) 算法进行简单加密和解密的类。

EPortalClient ¤

EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)

Portal 认证客户端 / 校园网认证客户端

Parameters:

  • base_url ¤

    (str) –

    Portal 服务器的 Base URL

  • bind_address ¤

    (str | None, default: None ) –

    绑定的本地 IP

  • force_bind ¤

    (bool, default: False ) –

    即便 IP 绑定失败也在请求参数中使用该 IP。

    如果你在路由器后使用本方法,则需要把 bind_address 填写为路由器分配的内网 IP 并启用 force_bind

SelfServiceSystem ¤

SelfServiceSystem(base_url: str)

自助服务系统

get_local_ip ¤

get_local_ip(target: str = '8.8.8.8') -> str | None

获取用于连接到特定目标IP的本地IP地址。

Parameters:

  • target ¤

    (str, default: '8.8.8.8' ) –

    目标主机名或IP地址。默认为 '8.8.8.8'。

Returns:

  • str ( str | None ) –

    用于到达目标的本地IP地址

  • None ( str | None ) –

    如果发生网络错误

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

discover_portal_info async ¤

discover_portal_info() -> PortalInfo

自动发现校园网Portal认证信息

Returns:

Raises:

  • NetworkError

    如果网络错误,或当前环境无法检测到 Portal 信息

  • ParsingError

    如果响应格式异常

zzupy.app¤

app ¤

移动应用 API 抽象层

Modules:

Classes:

Attributes:

__all__ module-attribute ¤

__all__ = ['CASClient', 'ECardClient', 'UndergradEASClient']

CASClient ¤

CASClient(account: str, password: str)

              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:

  • account ¤

    (str) –

    账号

  • password ¤

    (str) –

    密码

_get_public_key ¤

_get_public_key() -> RSAPublicKey

从 CAS 服务器获取 RSA 公钥。

ECardClient ¤

ECardClient(cas_client: ICASClient)

一卡通客户端

Parameters:

  • cas_client ¤

    (ICASClient) –

    已登录的 CASClient 实例

UndergradEASClient ¤

UndergradEASClient(cas_client: ICASClient)

auth ¤

统一认证

eas ¤

ecard ¤

一卡通

interfaces ¤

抽象接口

zzupy.app.auth¤

auth ¤

统一认证

Classes:

Functions:

Attributes:

logger module-attribute ¤

logger = logger

ICASClient ¤

ICASClient(account: str, password: str)

              flowchart TD
              zzupy.app.auth.ICASClient[ICASClient]

              

              click zzupy.app.auth.ICASClient href "" "zzupy.app.auth.ICASClient"
            

RSAPublicKey ¤

RSAPublicKey(modulus: int, exponent: int)

轻量级 RSA 公钥实现

Parameters:

  • modulus ¤

    (int) –

    RSA 模数 (n)

  • exponent ¤

    (int) –

    RSA 公开指数 (e),通常是 65537

padding ¤

填充方案命名空间(兼容 cryptography)

serialization ¤

序列化命名空间(兼容 cryptography)

Methods:

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 ¤

CASClient(account: str, password: str)

              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:

  • account ¤

    (str) –

    账号

  • password ¤

    (str) –

    密码

_get_public_key ¤

_get_public_key() -> RSAPublicKey

从 CAS 服务器获取 RSA 公钥。

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.app.eas¤

eas ¤

Modules:

Classes:

Attributes:

__all__ module-attribute ¤

__all__ = ['UndergradEASClient']

UndergradEASClient ¤

UndergradEASClient(cas_client: ICASClient)

undergrad ¤

140w 教务

zzupy.app.eas.undergrad¤

undergrad ¤

140w 教务

Classes:

Functions:

Attributes:

logger module-attribute ¤

logger = logger

ICASClient ¤

ICASClient(account: str, password: str)

              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"
            

UndergradEASClient ¤

UndergradEASClient(cas_client: ICASClient)

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.app.ecard¤

ecard ¤

一卡通

Classes:

Functions:

Attributes:

logger module-attribute ¤

logger = logger

ICASClient ¤

ICASClient(account: str, password: str)

              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)

一卡通客户端

Parameters:

  • cas_client ¤

    (ICASClient) –

    已登录的 CASClient 实例

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

log_http_headers ¤

log_http_headers(message: str, headers: Headers, *, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 头日志。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

sm4_decrypt_ecb ¤

sm4_decrypt_ecb(ciphertext: bytes, key: bytes) -> str

SM4 解密,ECB模式

Parameters:

Returns:

  • str

    明文 Hex

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.app.interfaces¤

interfaces ¤

抽象接口

Classes:

ICASClient ¤

ICASClient(account: str, password: str)

              flowchart TD
              zzupy.app.interfaces.ICASClient[ICASClient]

              

              click zzupy.app.interfaces.ICASClient href "" "zzupy.app.interfaces.ICASClient"
            

zzupy.crypto¤

crypto ¤

纯 Python 实现的轻量级 RSA 加密

Classes:

  • RSAPublicKey

    轻量级 RSA 公钥实现

  • padding

    填充方案命名空间(兼容 cryptography)

  • serialization

    序列化命名空间(兼容 cryptography)

Functions:

RSAPublicKey ¤

RSAPublicKey(modulus: int, exponent: int)

轻量级 RSA 公钥实现

Parameters:

  • modulus ¤

    (int) –

    RSA 模数 (n)

  • exponent ¤

    (int) –

    RSA 公开指数 (e),通常是 65537

padding ¤

填充方案命名空间(兼容 cryptography)

serialization ¤

序列化命名空间(兼容 cryptography)

Methods:

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

从 PEM 格式加载 RSA 公钥

Parameters:

  • pem_data ¤

    (bytes) –

    PEM 格式的公钥数据

Returns:

_parse_der_public_key ¤

_parse_der_public_key(der_data: bytes) -> Tuple[int, int]

解析 DER 编码的 RSA 公钥

支持两种格式: 1. PKCS#1 RSAPublicKey (常见于 OpenSSL) 2. X.509 SubjectPublicKeyInfo (标准格式)

Parameters:

  • der_data ¤

    (bytes) –

    DER 编码的公钥数据

Returns:

zzupy.exception¤

exception ¤

异常处理模块。

Classes:

Attributes:

__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:

Attributes:

logger module-attribute ¤

logger = logger

_REDACTED module-attribute ¤

_REDACTED = '[REDACTED]'

_MAX_BODY_LENGTH module-attribute ¤

_MAX_BODY_LENGTH = 2048

_DEFAULT_HANDLER_ID module-attribute ¤

_DEFAULT_HANDLER_ID = 0

_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'})

_normalize_key ¤

_normalize_key(key: str) -> str

_is_sensitive_key ¤

_is_sensitive_key(key: str) -> bool

_truncate_text ¤

_truncate_text(text: str, limit: int = _MAX_BODY_LENGTH) -> str

_sanitize_value ¤

_sanitize_value(key: str | None, value: Any) -> Any

sanitize_http_headers ¤

sanitize_http_headers(headers: Headers) -> dict[str, str]

脱敏并标准化 HTTP 头,便于安全输出到日志。

sanitize_http_url ¤

sanitize_http_url(url: str | URL) -> str

脱敏 URL 查询参数。

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 ¤

log_http_headers(message: str, headers: Headers, *, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 头日志。

log_http_response_body ¤

log_http_response_body(url: str | URL, text: str, *, content_type: str | None = None, level: str = 'TRACE') -> None

输出脱敏后的 HTTP 响应体日志。

build_http_event_hooks ¤

build_http_event_hooks(*, async_client: bool = False) -> dict[str, list[Any]]

创建带脱敏能力的 HTTP 请求/响应日志钩子。

zzupy.model¤

model ¤

Modules:

auth ¤

eas ¤

network ¤

zzupy.model.auth¤

auth ¤

Classes:

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 ¤


              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:

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"
            

在未登录状态下调用了需要登录的方法。

XorCipher ¤

XorCipher(key_string: str = '')

一个使用异或 (XOR) 算法进行简单加密和解密的类。

JsonPParser ¤

JsonPParser(text: str)

JsonP 格式数据解析器

get_sign ¤

get_sign(dynamic_secret: str, params: str) -> str

获取sign值

Parameters:

  • dynamic_secret ¤

    (str) –

    login 后自动获取,来自 login-token 请求

  • params ¤

    (str) –

    URL 请求参数

Returns:

  • str ( str ) –

    sign 值

pkcs7_unpad ¤

pkcs7_unpad(padded_data: bytes, block_size: int) -> bytes

去除数据中的PKCS#7填充。

Parameters:

  • padded_data ¤

    (bytes) –

    带填充的数据

  • block_size ¤

    (int) –

    用于填充的块大小

Returns:

  • bytes ( bytes ) –

    去除填充后的数据

Raises:

sm4_decrypt_ecb ¤

sm4_decrypt_ecb(ciphertext: bytes, key: bytes) -> str

SM4 解密,ECB模式

Parameters:

Returns:

  • str

    明文 Hex

get_local_ip ¤

get_local_ip(target: str = '8.8.8.8') -> str | None

获取用于连接到特定目标IP的本地IP地址。

Parameters:

  • target ¤

    (str, default: '8.8.8.8' ) –

    目标主机名或IP地址。默认为 '8.8.8.8'。

Returns:

  • str ( str | None ) –

    用于到达目标的本地IP地址

  • None ( str | None ) –

    如果发生网络错误

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

zzupy.web¤

web ¤

Web API 客户端模块

Modules:

Classes:

Functions:

Attributes:

__all__ module-attribute ¤

__all__ = ['EPortalClient', 'SelfServiceSystem', 'discover_portal_info']

EPortalClient ¤

EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)

Portal 认证客户端 / 校园网认证客户端

Parameters:

  • base_url ¤

    (str) –

    Portal 服务器的 Base URL

  • bind_address ¤

    (str | None, default: None ) –

    绑定的本地 IP

  • force_bind ¤

    (bool, default: False ) –

    即便 IP 绑定失败也在请求参数中使用该 IP。

    如果你在路由器后使用本方法,则需要把 bind_address 填写为路由器分配的内网 IP 并启用 force_bind

SelfServiceSystem ¤

SelfServiceSystem(base_url: str)

自助服务系统

discover_portal_info ¤

discover_portal_info() -> PortalInfo

自动发现校园网Portal认证信息

Returns:

Raises:

  • NetworkError

    如果网络错误,或当前环境无法检测到 Portal 信息

  • ParsingError

    如果响应格式异常

network ¤

校园网模块

zzupy.web.network¤

network ¤

校园网模块

Classes:

Functions:

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 认证信息

JsonPParser ¤

JsonPParser(text: str)

JsonP 格式数据解析器

XorCipher ¤

XorCipher(key_string: str = '')

一个使用异或 (XOR) 算法进行简单加密和解密的类。

EPortalClient ¤

EPortalClient(base_url: str, bind_address: str | None = None, force_bind: bool = False)

Portal 认证客户端 / 校园网认证客户端

Parameters:

  • base_url ¤

    (str) –

    Portal 服务器的 Base URL

  • bind_address ¤

    (str | None, default: None ) –

    绑定的本地 IP

  • force_bind ¤

    (bool, default: False ) –

    即便 IP 绑定失败也在请求参数中使用该 IP。

    如果你在路由器后使用本方法,则需要把 bind_address 填写为路由器分配的内网 IP 并启用 force_bind

SelfServiceSystem ¤

SelfServiceSystem(base_url: str)

自助服务系统

get_local_ip ¤

get_local_ip(target: str = '8.8.8.8') -> str | None

获取用于连接到特定目标IP的本地IP地址。

Parameters:

  • target ¤

    (str, default: '8.8.8.8' ) –

    目标主机名或IP地址。默认为 '8.8.8.8'。

Returns:

  • str ( str | None ) –

    用于到达目标的本地IP地址

  • None ( str | None ) –

    如果发生网络错误

require_auth ¤

require_auth(func)

装饰器:确保调用方法前已登录

Raises:

discover_portal_info ¤

discover_portal_info() -> PortalInfo

自动发现校园网Portal认证信息

Returns:

Raises:

  • NetworkError

    如果网络错误,或当前环境无法检测到 Portal 信息

  • ParsingError

    如果响应格式异常