ForcePilot/backend/package/yuxi/channel/extensions/webex/media.py
Kris 7b5d1e5c69 feat(channel): 添加 Webex、微信 iLink 和微信小程序渠道扩展
新增 Webex、微信 iLink、微信小程序三个渠道扩展。

Webex 渠道扩展功能模块:
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- webhook: Webhook 事件处理
- outbound: 外发消息管理
- streaming: 流式消息处理
- pairing: 用户配对与绑定
- security: 安全校验
- dedupe: 消息去重
- monitor: 渠道状态监控
- status: 会话状态管理
- media: 媒体资源处理

微信 iLink 渠道扩展功能模块:
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- outbound: 外发消息管理
- streaming: 流式消息处理
- pairing: 用户配对与绑定
- security: 安全校验
- dedupe: 消息去重
- monitor: 渠道状态监控
- status: 会话状态管理
- context_store: 上下文存储
- aes_ecb: AES-ECB 加解密
- media: 媒体资源处理
- typing: 输入状态

微信小程序渠道扩展功能模块:
- config: 渠道配置管理
- gateway: SSE/WebSocket 网关接入
- webhook: Webhook 事件处理
- outbound: 外发消息管理
- streaming: 流式消息处理
- pairing: 用户配对与绑定
- security: 安全校验
- crypto: 加解密处理
- dedupe: 消息去重
- message: 消息处理
- passive_reply: 被动回复
- media: 媒体资源处理
- status: 会话状态管理
2026-05-21 11:59:04 +08:00

66 lines
1.9 KiB
Python

from pathlib import Path
class WebexMedia:
MIME_MAP = {
".pdf": "application/pdf",
".doc": "application/msword",
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
".xls": "application/vnd.ms-excel",
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
".ppt": "application/vnd.ms-powerpoint",
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
".png": "image/png",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".gif": "image/gif",
".bmp": "image/bmp",
}
def __init__(self, api):
self._api = api
async def send_local_file(
self,
room_id: str,
file_path: str | Path,
*,
description: str = "",
parent_id: str | None = None,
) -> str:
file_path = Path(file_path)
import aiofiles
async with aiofiles.open(file_path, "rb") as f:
file_content = await f.read()
kwargs = {"roomId": room_id, "files": [file_content]}
if description:
kwargs["text"] = description
if parent_id:
kwargs["parentId"] = parent_id
msg = self._api.messages.create(**kwargs)
return msg.id
async def send_remote_file(
self,
room_id: str,
file_url: str,
*,
description: str = "",
parent_id: str | None = None,
) -> str:
kwargs = {"roomId": room_id, "files": [file_url]}
if description:
kwargs["text"] = description
if parent_id:
kwargs["parentId"] = parent_id
msg = self._api.messages.create(**kwargs)
return msg.id
@classmethod
def _guess_mime(cls, suffix: str) -> str:
return cls.MIME_MAP.get(suffix.lower(), "application/octet-stream")