ForcePilot/backend/package/yuxi/channel/extensions/weibo/template.py
Kris 7215418610 feat(channel): 添加企业微信、微博、WhatsApp 和 Workplace 渠道扩展
新增企业微信、微博、WhatsApp、Workplace 四个渠道扩展。

企业微信渠道扩展主要模块:config, gateway, webhook, webhook_bot, outbound, streaming, pairing, security, crypto, dedupe, persistent_dedupe, card, directory, events, externalcontact, media, mentions, menu, message, oauth, status

微博渠道扩展主要模块:config, gateway, webhook, outbound, streaming, pairing, security, dedupe, passive_reply, broadcast, message, menu, media, subscription, template, status

WhatsApp 渠道扩展主要模块:config, gateway, webhook, outbound, streaming, pairing, security, dedupe, actions, monitor, status

Workplace 渠道扩展主要模块:config, gateway, webhook, outbound, streaming, pairing, security, dedupe, actions, challenge, groups, media, mentions, menu, monitor, persona, quick_reply, signature, subscriptions, template, threading, users, status
2026-05-21 12:01:56 +08:00

71 lines
2.0 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.

import json
import logging
import httpx
logger = logging.getLogger(__name__)
TEMPLATE_SEND_URL = "https://m.api.weibo.com/2/eps/template/send.json"
class WeiboTemplate:
def __init__(self, gateway=None):
self._gateway = gateway
self._http: httpx.AsyncClient | None = None
async def send(
self,
receiver_id: int,
template_id: str,
data: dict,
*,
url: str = "",
topcolor: str = "#FF0000",
) -> dict | None:
"""
发送模板消息。
data 为模板变量的键值对,格式:
{"first": {"value": "标题", "color": "#173177"}, "keyword1": {"value": "内容", "color": "#173177"}, ...}
支持两种格式:
- 纯文本模板data 中的变量将替换文本中的 {{var.DATA}}
- 卡片模板:自动生成结构化卡片形式
"""
if self._http is None:
self._http = httpx.AsyncClient(timeout=15.0)
token = self._gateway.access_token if self._gateway else None
if not token:
logger.error("No access_token for template message")
return None
payload = {
"access_token": token,
"receiver_id": receiver_id,
"template_id": template_id,
"data": data,
}
if url:
payload["url"] = url
if topcolor:
payload["topcolor"] = topcolor
try:
resp = await self._http.post(
TEMPLATE_SEND_URL,
data={"access_token": token, "json": json.dumps(payload, ensure_ascii=False)},
)
data = resp.json()
if data.get("error_code"):
logger.error("Template send failed: %s", data)
return data
except Exception:
logger.exception("Template send error")
return None
async def close(self):
if self._http:
await self._http.aclose()
self._http = None