71 lines
2.8 KiB
Python
71 lines
2.8 KiB
Python
"""
|
||
微信开放平台「小程序卡片」客服消息 msg 结构(与发送客服消息文档一致)。
|
||
|
||
字段:title, appid, pagepath, thumb_media_id, thumb_url。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
from typing import Any, Mapping, Optional
|
||
from urllib.parse import quote
|
||
|
||
# 默认值可通过环境变量覆盖,便于不同部署环境配置素材与小程序信息
|
||
_DEFAULT_TITLE = (os.getenv("CHATBOT_MINIPROGRAM_TITLE") or "openai对话插件").strip()
|
||
_DEFAULT_APPID = (os.getenv("CHATBOT_MINIPROGRAM_APPID") or "wx8c631f7e9f2465e1").strip()
|
||
_DEFAULT_PAGEPATH = (os.getenv("CHATBOT_MINIPROGRAM_PAGEPATH") or "pages/index/index").strip()
|
||
_DEFAULT_THUMB_MEDIA_ID = (
|
||
os.getenv("CHATBOT_MINIPROGRAM_THUMB_MEDIA_ID") or "KegpipQG9t-klMo25My4e8zpBjhjg3JMrMSpgjikB4U"
|
||
).strip()
|
||
_DEFAULT_THUMB_URL = (
|
||
os.getenv("CHATBOT_MINIPROGRAM_THUMB_URL")
|
||
or "http://mmbiz.qpic.cn/mmbiz_png/W3gQtpV3j8BYhWgfHT5Hfg6auN94c2ec4BBhDOMtPQrx6vEMc1rR4iaDKxDLOfZ1jBUqIEEY4YpvEj6ktSyXT7g/0?wx_fmt=png"
|
||
).strip()
|
||
|
||
|
||
def normalize_miniprogrampage_msg(msg: Mapping[str, Any]) -> dict:
|
||
"""仅保留文档约定的 miniprogrampage 五字段,避免多余键导致客户端不渲染。"""
|
||
raw = msg.get("miniprogrampage") if isinstance(msg, dict) else None
|
||
inner = raw if isinstance(raw, dict) else {}
|
||
return {
|
||
"miniprogrampage": {
|
||
"title": str(inner.get("title", "")),
|
||
"appid": str(inner.get("appid", "")),
|
||
"pagepath": str(inner.get("pagepath", "")),
|
||
"thumb_media_id": str(inner.get("thumb_media_id", "")),
|
||
"thumb_url": str(inner.get("thumb_url", "")),
|
||
}
|
||
}
|
||
|
||
|
||
def build_miniprogram_card_msg(
|
||
*,
|
||
user_id: str = "",
|
||
title: Optional[str] = None,
|
||
appid: Optional[str] = None,
|
||
pagepath: Optional[str] = None,
|
||
thumb_media_id: Optional[str] = None,
|
||
thumb_url: Optional[str] = None,
|
||
append_userid_to_pagepath: bool = True,
|
||
) -> dict:
|
||
"""
|
||
返回完整客服 msg:{\"miniprogrampage\": {...}}。
|
||
|
||
若 append_userid_to_pagepath 且 user_id 非空,在 pagepath 上追加 ?userid=(已有查询串则用 &)。
|
||
"""
|
||
uid = (user_id or "").strip()
|
||
base_path = (pagepath if pagepath is not None else _DEFAULT_PAGEPATH).strip()
|
||
if append_userid_to_pagepath and uid:
|
||
sep = "&" if "?" in base_path else "?"
|
||
base_path = f"{base_path}{sep}userid={quote(uid, safe='')}"
|
||
|
||
return {
|
||
"miniprogrampage": {
|
||
"title": str(title if title is not None else _DEFAULT_TITLE),
|
||
"appid": str(appid if appid is not None else _DEFAULT_APPID),
|
||
"pagepath": base_path,
|
||
"thumb_media_id": str(thumb_media_id if thumb_media_id is not None else _DEFAULT_THUMB_MEDIA_ID),
|
||
"thumb_url": str(thumb_url if thumb_url is not None else _DEFAULT_THUMB_URL),
|
||
}
|
||
}
|