WechatOnCloud/bridge/woc_bridge/models/send.py
Kris 15fc62d478 feat: 完成微信UI自动化新架构全量开发与集成
- 新增六层UI自动化架构:从Backend到Capabilities的完整分层实现
- 添加WeChat 4.0分辨率适配Profile与图像模板资源
- 实现幂等缓存、熔断器、重试策略、链路追踪与监控指标
- 新增头像下载安全校验、发布朋友圈路径白名单防护
- 优化密钥缓存、DB校验逻辑与初始化流程
- 补充完整错误码体系与启动清场机制
2026-07-16 01:19:47 +08:00

98 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""发送域模型:发送文本 / 发送文件 / 发送响应。"""
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 查找",
)
client_request_id: str = Field(default="", description="客户端幂等去重 ID空字符串表示不参与幂等校验")
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_idbridge 本地生成的发送 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="失败时的错误描述")
verified: bool = Field(default=False, description="是否已通过发送结果验证")
skipped: bool = Field(default=False, 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="失败时的错误描述")