实现了 Teams 机器人所需的全功能组件,包括: - 基础命令解析与帮助卡片生成 - 租户验证与访问控制 - 自定义 UA 与媒体工具 - 消息分块、批注处理与会话管理 - 防抖、缓存与配置路由能力 - 投票、配对、审计与运行时状态管理 - TTS 语音合成与卡片构建工具 - 群组管理与权限控制逻辑
77 lines
2.0 KiB
Python
77 lines
2.0 KiB
Python
"""Microsoft Teams 媒体辅助工具。
|
||
|
||
提供 MIME 类型推断、文件名提取和消息 ID 提取。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import mimetypes
|
||
import re
|
||
from pathlib import Path
|
||
|
||
_MIME_TYPE_MAP = {
|
||
".jpg": "image/jpeg",
|
||
".jpeg": "image/jpeg",
|
||
".png": "image/png",
|
||
".gif": "image/gif",
|
||
".bmp": "image/bmp",
|
||
".webp": "image/webp",
|
||
".svg": "image/svg+xml",
|
||
".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",
|
||
".txt": "text/plain",
|
||
".csv": "text/csv",
|
||
".json": "application/json",
|
||
".xml": "application/xml",
|
||
".zip": "application/zip",
|
||
".mp4": "video/mp4",
|
||
".mov": "video/quicktime",
|
||
".avi": "video/x-msvideo",
|
||
".wmv": "video/x-ms-wmv",
|
||
".mp3": "audio/mpeg",
|
||
".wav": "audio/wav",
|
||
".ogg": "audio/ogg",
|
||
".flac": "audio/flac",
|
||
".aac": "audio/aac",
|
||
}
|
||
|
||
_MESSAGE_ID_PATTERN = re.compile(r"^(\d+)@thread\.(skype|tacv2)$")
|
||
|
||
|
||
def get_mime_type(filename: str) -> str:
|
||
ext = Path(filename).suffix.lower()
|
||
if ext in _MIME_TYPE_MAP:
|
||
return _MIME_TYPE_MAP[ext]
|
||
|
||
mime_type, _ = mimetypes.guess_type(filename)
|
||
if mime_type:
|
||
return mime_type
|
||
|
||
return "application/octet-stream"
|
||
|
||
|
||
def extract_filename(url_or_path: str) -> str:
|
||
if not url_or_path:
|
||
return "unknown"
|
||
|
||
cleaned = url_or_path.split("?")[0].split("#")[0]
|
||
name = Path(cleaned).name
|
||
return name or "unknown"
|
||
|
||
|
||
def extract_message_id(raw_id: str) -> str:
|
||
"""提取标准化消息 ID,去除 thread/tacv2 前缀格式。"""
|
||
if not raw_id:
|
||
return ""
|
||
|
||
m = _MESSAGE_ID_PATTERN.match(raw_id)
|
||
if m:
|
||
return m.group(1)
|
||
|
||
return raw_id
|