import os from yuxi.channel.extensions.weibo.types import WeiboAccount class WeiboConfig: ENV_MAP = { "app_key": "WEIBO_APP_KEY", "app_secret": "WEIBO_APP_SECRET", "callback_token": "WEIBO_CALLBACK_TOKEN", "access_token": "WEIBO_ACCESS_TOKEN", "dm_policy": "WEIBO_DM_POLICY", "reply_mode": "WEIBO_REPLY_MODE", "subscribe_msg": "WEIBO_SUBSCRIBE_MSG", "remove_markdown": "WEIBO_REMOVE_MD", "subscribe_guide": "WEIBO_SUBSCRIBE_GUIDE", } def list_account_ids(self, config: dict | None = None) -> list[str]: if self._resolve_app_key(): return ["default"] return [] def resolve_account(self, account_id: str = "default") -> WeiboAccount: return WeiboAccount( account_id=account_id, app_key=self._env_or_config("app_key") or "", app_secret=self._env_or_config("app_secret") or "", callback_token=self._env_or_config("callback_token") or "", access_token=self._env_or_config("access_token") or "", dm_policy=self._env_or_config("dm_policy") or "open", reply_mode=self._env_or_config("reply_mode") or "active", subscribe_msg=self._env_or_config("subscribe_msg") or "", remove_markdown=self._env_or_config("remove_markdown") != "false", subscribe_guide=self._env_or_config("subscribe_guide") or "", ) def is_configured(self, account: dict | None = None) -> bool: return bool( self._resolve_app_key() and self._env_or_config("app_secret") and self._env_or_config("callback_token") and self._env_or_config("access_token") ) def _resolve_app_key(self) -> str | None: return self._env_or_config("app_key") def _env_or_config(self, key: str) -> str | None: env_key = self.ENV_MAP.get(key, "") if env_key: val = os.getenv(env_key) if val: return val return None def config_schema(self) -> dict: return { "$schema": "https://json-schema.org/draft-07/schema#", "type": "object", "title": "微博渠道配置", "properties": { "app_key": { "type": "string", "title": "App Key", "description": "微博开放平台应用的 App Key", }, "app_secret": { "type": "string", "title": "App Secret", "x-ui-password": True, "description": "微博开放平台应用的 App Secret", }, "callback_token": { "type": "string", "title": "回调 Token", "description": "微博开放平台配置的自定义 Token(用于 URL 验证签名)", }, "access_token": { "type": "string", "title": "Access Token", "x-ui-password": True, "description": "OAuth2 access_token(蓝V后台粉丝服务平台直接获取,有效期约 5 年)", }, "dm_policy": { "type": "string", "enum": ["open", "pairing", "allowlist", "disabled"], "default": "open", "title": "DM 策略", }, "reply_mode": { "type": "string", "enum": ["passive", "active"], "default": "active", "title": "回复模式", "description": "passive=被动回复, active=客服消息 API", }, "subscribe_msg": { "type": "string", "title": "关注欢迎语", "description": "用户关注后自动回复的文本", }, "subscribe_guide": { "type": "string", "title": "订阅引导语", "description": "关注欢迎语后追加的订阅引导文本(如:发送 DY 订阅服务消息)", }, "remove_markdown": { "type": "boolean", "default": True, "title": "移除 Markdown 格式", "description": "自动移除 AI 回复中的 Markdown 符号(微博不支持 Markdown 渲染)", }, }, "required": ["app_key", "app_secret", "callback_token", "access_token"], }