/** * WeCom 消息类型定义 * Bot 和 Agent 模式共用 */ /** * Bot 模式入站消息基础结构 (JSON) */ /** * **WecomBotInboundBase (Bot 入站消息基类)** * * Bot 模式下 JSON 格式回调的基础字段。 * @property msgid 消息 ID * @property aibotid 机器人 ID * @property chattype 会话类型: "single" | "group" * @property chatid 群聊 ID (仅群组时存在) * @property response_url 下行回复 URL (用于被动响应转主动推送) * @property from 发送者信息 */ export type WecomBotInboundBase = { msgid?: string; aibotid?: string; chattype?: "single" | "group"; chatid?: string; response_url?: string; from?: { userid?: string; corpid?: string; }; msgtype?: string; /** 附件数量 (部分消息存在) */ attachment_count?: number; }; export type WecomBotInboundText = WecomBotInboundBase & { msgtype: "text"; text?: { content?: string; }; quote?: WecomInboundQuote; }; export type WecomBotInboundVoice = WecomBotInboundBase & { msgtype: "voice"; voice?: { content?: string; }; quote?: WecomInboundQuote; }; export type WecomBotInboundVideo = WecomBotInboundBase & { msgtype: "video"; video?: { url?: string; aeskey?: string; }; quote?: WecomInboundQuote; }; export type WecomBotInboundStreamRefresh = WecomBotInboundBase & { msgtype: "stream"; stream?: { id?: string; }; }; export type WecomBotInboundEvent = WecomBotInboundBase & { msgtype: "event"; create_time?: number; event?: { eventtype?: string; [key: string]: unknown; }; }; /** * **WecomInboundQuote (引用消息)** * * 消息中引用的原始内容(如回复某条消息)。 * 支持引用文本、图片、混合类型、语音、文件等。 */ export type WecomInboundQuote = { msgtype?: "text" | "image" | "mixed" | "voice" | "file" | "video"; /** 引用文本内容 */ text?: { content?: string; }; /** 引用图片 URL */ image?: { url?: string; }; /** 引用混合消息 (图文) */ mixed?: { msg_item?: Array<{ msgtype: "text" | "image"; text?: { content?: string; }; image?: { url?: string; }; }>; }; /** 引用语音 */ voice?: { content?: string; }; /** 引用文件 */ file?: { url?: string; }; /** 引用视频 */ video?: { url?: string; }; }; export type WecomBotInboundMessage = WecomBotInboundText | WecomBotInboundVoice | WecomBotInboundVideo | WecomBotInboundStreamRefresh | WecomBotInboundEvent | (WecomBotInboundBase & { quote?: WecomInboundQuote; } & Record); /** * Agent 模式入站消息结构 (解析自 XML) */ /** * **WecomAgentInboundMessage (Agent 入站消息)** * * Agent 模式下解析自 XML 的扁平化消息结构。 * 键名保持 PascalCase (如 `ToUserName`)。 */ export type WecomAgentInboundMessage = { ToUserName?: string; FromUserName?: string; CreateTime?: number; MsgType?: string; MsgId?: string; AgentID?: number; Content?: string; PicUrl?: string; MediaId?: string; FileName?: string; Format?: string; Recognition?: string; ThumbMediaId?: string; Location_X?: number; Location_Y?: number; Scale?: number; Label?: string; Title?: string; Description?: string; Url?: string; Event?: string; EventKey?: string; ChatId?: string; }; /** * 模板卡片类型 */ /** * **WecomTemplateCard (模板卡片)** * * 复杂的交互式卡片结构。 * @property card_type 卡片类型: "text_notice" | "news_notice" | "button_interaction" ... * @property source 来源信息 * @property main_title 主标题 * @property sub_title_text 副标题 * @property horizontal_content_list 水平排列的键值列表 * @property button_list 按钮列表 */ export type WecomTemplateCard = { card_type: "text_notice" | "news_notice" | "button_interaction" | "vote_interaction" | "multiple_interaction"; source?: { icon_url?: string; desc?: string; desc_color?: number; }; main_title?: { title?: string; desc?: string; }; task_id?: string; button_list?: Array<{ text: string; style?: number; key: string; }>; sub_title_text?: string; horizontal_content_list?: Array<{ keyname: string; value?: string; type?: number; url?: string; userid?: string; }>; card_action?: { type: number; url?: string; appid?: string; pagepath?: string; }; action_menu?: { desc: string; action_list: Array<{ text: string; key: string; }>; }; select_list?: Array<{ question_key: string; title?: string; selected_id?: string; option_list: Array<{ id: string; text: string; }>; }>; submit_button?: { text: string; key: string; }; checkbox?: { question_key: string; option_list: Array<{ id: string; text: string; is_checked?: boolean; }>; mode?: number; }; }; /** * 出站消息类型 */ export type WecomOutboundMessage = { msgtype: "text"; text: { content: string; }; } | { msgtype: "markdown"; markdown: { content: string; }; } | { msgtype: "template_card"; template_card: WecomTemplateCard; };