本次提交将woc-bridge项目重构为模块化包结构,按职责拆分多个子域: 1. 新增models层定义所有Pydantic数据模型与统一错误体系 2. 拆分db/ui/messaging/routes等业务域模块 3. 实现基础API路由:状态查询、截图、登录、媒体获取等 4. 重构tools脚本的模块导入路径 5. 补充版本号与能力清单定义 6. 完善全局配置与依赖管理 整体完成项目从单文件脚本到可维护的包结构迁移,为后续功能开发打下基础。
95 lines
3.6 KiB
Python
95 lines
3.6 KiB
Python
"""发送域模型:发送文本 / 发送文件 / 发送响应。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from typing import Optional
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 发送接口
|
||
# ---------------------------------------------------------------------------
|
||
class SendTextRequest(BaseModel):
|
||
"""发送文本消息请求。"""
|
||
|
||
to_wxid: str = Field(description="目标 wxid")
|
||
content: str = Field(description="文本内容")
|
||
display_name: Optional[str] = Field(
|
||
default=None,
|
||
description="可选:用于微信搜索框定位会话的显示名。不传时 bridge 自动按备注->昵称->wxid 查找",
|
||
)
|
||
|
||
|
||
class SendFileRequest(BaseModel):
|
||
"""发送图片/文件请求。"""
|
||
|
||
to_wxid: str = Field(description="目标 wxid")
|
||
file_path: str = Field(description="容器内文件绝对路径")
|
||
display_name: Optional[str] = Field(
|
||
default=None,
|
||
description="可选:用于微信搜索框定位会话的显示名。不传时 bridge 自动按备注->昵称->wxid 查找",
|
||
)
|
||
|
||
|
||
class SendResponse(BaseModel):
|
||
"""发送消息响应。
|
||
|
||
字段说明:
|
||
- local_send_id:bridge 本地生成的发送 ID,格式 local_<unix秒>_<随机>。
|
||
仅用于客户端幂等去重,**不对应微信原生 msg_id**,禁止用于
|
||
/api/media/{msg_id} 查媒体。
|
||
- placeholder:是否为占位实现(true 表示真实文件/图片内容未传输,
|
||
仅发了提示文本;客户端应走降级处理)。
|
||
"""
|
||
|
||
success: bool = Field(default=False)
|
||
local_send_id: str = Field(default="", description="本地生成的发送 ID,非微信原生 msg_id")
|
||
placeholder: bool = Field(default=False, description="是否为占位实现(真实内容未传输)")
|
||
error: Optional[str] = Field(default=None, description="失败时的错误描述")
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 消息撤回(experimental)
|
||
# ---------------------------------------------------------------------------
|
||
class RevokeMessageRequest(BaseModel):
|
||
"""撤回消息请求(experimental)。"""
|
||
|
||
talker: str = Field(description="会话对方 wxid")
|
||
create_time: int = Field(description="消息发送时间戳(Unix 秒),用于校验撤回时限,必须 > 0")
|
||
display_name: Optional[str] = Field(
|
||
default=None,
|
||
description="会话显示名(备注/昵称),用于微信搜索框定位会话;"
|
||
"不传则从 contact.db 解析(优先 remark,其次 nickname,回退 wxid)",
|
||
)
|
||
|
||
|
||
class RevokeMessageResponse(BaseModel):
|
||
"""撤回消息响应。"""
|
||
|
||
success: bool = Field(default=False)
|
||
error: Optional[str] = Field(default=None, description="失败时的错误描述")
|
||
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 消息转发(experimental)
|
||
# ---------------------------------------------------------------------------
|
||
class ForwardMessageRequest(BaseModel):
|
||
"""转发消息请求(experimental)。"""
|
||
|
||
talker: str = Field(description="源会话对方 wxid")
|
||
target_display_name: str = Field(
|
||
description="转发目标联系人的显示名(备注/昵称)"
|
||
)
|
||
source_display_name: Optional[str] = Field(
|
||
default=None,
|
||
description="源会话显示名,用于搜索框定位源会话;不传则从 contact.db 解析",
|
||
)
|
||
|
||
|
||
class ForwardMessageResponse(BaseModel):
|
||
"""转发消息响应。"""
|
||
|
||
success: bool = Field(default=False)
|
||
error: Optional[str] = Field(default=None, description="失败时的错误描述")
|