跳转至

API 编写指南

1. ApiRequest 的使用方法

ApiRequest 是 QQMusic API 的核心类,用于封装 API 请求。它提供了多种方式来发起请求,以下是几种常见的使用方法:

1.1 直接使用 ApiRequest

你可以直接实例化 ApiRequest 类来发起请求。以下是一个简单的示例:

from qqmusicapi.network import ApiRequest
from qqmusicapi.credential import Credential

from typing import Any

async def get_album_detail(album_id: int, credential: Credential):
    req = ApiRequest[[], dict[str, Any]](
        module="music.musichallAlbum.AlbumInfoServer",
        method="GetAlbumDetail",
        params={"albumId": album_id},
        credential=credential,
    )
    response = await req()
    return response

在这个示例中,我们创建了一个 ApiRequest 实例,指定了模块名、方法名、请求参数和凭证,然后通过 await req() 发起请求并获取响应。

1.2 使用 api_request 装饰器

api_request 是一个装饰器,用于简化 API 请求的编写。它可以将一个函数转换为一个返回 ApiRequest 实例的函数。以下是一个示例:

from qqmusicapi.network import api_request, NO_PROCESSOR

@api_request("music.musichallAlbum.AlbumInfoServer", "GetAlbumDetail")
async def get_album_detail(value: str | int):
    if isinstance(value, int):
        return {"albumId": value}, NO_PROCESSOR
    return {"albumMId": value}, NO_PROCESSOR

在这个示例中,get_album_detail 函数被 api_request 装饰器修饰,它会自动返回一个 ApiRequest 实例。你可以通过 await get_album_detail(album_id) 来发起请求。

1.3 使用 RequestGroup 进行批量请求

RequestGroup 用于合并多个 API 请求,支持组级公共参数和重复模块方法处理。以下是一个示例:

from qqmusicapi.network import RequestGroup, ApiRequest

async def get_multiple_album_details(album_ids: list[int], credential: Credential):
    rg = RequestGroup(credential=credential)
    for album_id in album_ids:
        req = ApiRequest(
            module="music.musichallAlbum.AlbumInfoServer",
            method="GetAlbumDetail",
            params={"albumId": album_id},
            credential=credential,
        )
        rg.add_request(req)
    results = await rg.execute()
    return results

2. 请求流程

2.1 ApiRequest

%% ApiRequest 流程图
flowchart TD
    A[调用ApiRequest实例] --> B[检查是否传入新Credential]
    B -->|是| C[更新Credential]
    C --> E
    B -->|否| D[保持原有Credential]
    D --> E[生成参数和处理器]
    E --> F{是否启用缓存且存在缓存?}
    F -->|是| G[直接返回缓存数据]
    F -->|否| I[构建请求参数]
    I --> J[发送POST请求]
    J --> K{是否忽略状态码?}
    K -->|否| L[验证HTTP状态码]
    K -->|是| M[跳过状态码验证]
    L --> N[处理响应JSON]
    M --> N
    N --> O{验证业务状态码}
    O -->|0| P[提取数据字段]
    O -->|非0| Q[抛出对应异常]
    P --> R[应用数据处理器]
    R --> S{是否启用缓存?}
    S -->|是| T[保存结果到缓存]
    S -->|否| U[返回结果]
    T --> U

2.2 RequestGroup

%% RequestGroup 流程图
flowchart TD
    A[创建RequestGroup实例] --> B[添加多个ApiRequest]
    B --> C[遍历请求准备参数]
    C --> D[合并公共参数]
    D --> E{是否启用缓存?}
    E -->|是| F[批量检查缓存]
    E -->|否| K[构建合并请求体]
    F --> G[移除已有缓存的请求]
    G --> I{是否有剩余请求?}
    I -->|否| J[直接返回缓存结果]
    I -->|是| K
    K --> L[发送合并POST请求]
    L --> M[解析响应JSON]
    M --> N[遍历子请求处理]
    N --> O{子请求状态码是否正常?}
    O -->|是| P[应用对应处理器]
    O -->|否| Q[抛出异常]
    P --> R{是否启用缓存?}
    R -->|是| S[保存子结果到缓存]
    S --> T
    R -->|否| T[返回完整结果列表]