Skip to content

QQ 适配器:支持文件消息(File)接收与发送 #77

Description

@Qixuan112

背景

TaleAI QQ 适配器不支持文件消息的接收和发送。KiraAI 已支持。

QQ 文件传输通过 OneBot 的 upload_group_file / upload_private_file API 实现。接收时需通过 get_group_file_url / get_private_file_url 获取文件下载地址。

建议修改

1. 扩展消息模型

@dataclass
class MessageContent:
    # ...
    files: List[dict] = field(default_factory=list)
    # [{"url": "https://...", "name": "doc.pdf", "size": "12345"}]

2. 接收端解析

elif seg_type == "file":
    file_name = data.get("file", "")
    file_id = data.get("file_id", "")
    file_size = data.get("file_size", "")

    if is_group:
        file_info = await api_call("get_group_file_url", {"group_id": group_id, "file_id": file_id})
    else:
        file_info = await api_call("get_private_file_url", {"file_id": file_id})

    file_url = file_info.get("data", {}).get("url", "")
    files.append({"url": file_url, "name": file_name, "size": file_size})

3. 发送端

for file in content.files:
    file_param = file["url"] if file.get("url", "").startswith("http") else f"base64://{file['url']}"
    file_name = file.get("name", "file")
    if is_group:
        await self.api_call("upload_group_file", {"group_id": int(target_id), "file": file_param, "name": file_name})
    else:
        await self.api_call("upload_private_file", {"user_id": int(target_id), "file": file_param, "name": file_name})

注意:文件发送不走普通 message 段,使用独立的上传 API,返回值获取方式不同。

4. 依赖

  • api_call 需先实现或完善(当前已有 api_call 方法,但仅封装了 get_group_member_list

涉及文件

  • core/adapter/event.pyMessageContent 扩展
  • core/adapter/src/qq/adapter.py — 接收解析 + 发送
  • core/adapter/message_processor.pyProcessedMessage 同步扩展

优先级

P2 — 实用性高,用户经常需要发送文件(如图片压缩包、日志等)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions