package feishu_util import ( "fmt" "sync" "ai_script/config" lark "github.com/larksuite/oapi-sdk-go/v3" ) var ( clientOnce sync.Once clientInst *Client clientErr error ) // Client 封装飞书 OpenAPI 客户端与应用凭证。 type Client struct { AppID string AppSecret string Lark *lark.Client } // NewClient 使用显式凭证创建客户端。 func NewClient(appID, appSecret string) *Client { return &Client{ AppID: appID, AppSecret: appSecret, Lark: lark.NewClient(appID, appSecret), } } // NewClientFromConfig 从项目配置创建客户端。 func NewClientFromConfig(cfg *config.Config) (*Client, error) { if cfg == nil { return nil, fmt.Errorf("config 为空") } if cfg.Feishu.AppID == "" || cfg.Feishu.AppSecret == "" { return nil, fmt.Errorf("配置缺少 feishu.app_id / feishu.app_secret") } return NewClient(cfg.Feishu.AppID, cfg.Feishu.AppSecret), nil } // DefaultClient 懒加载:读取本地 config/config.{APP_ENV}.yaml 并创建单例客户端。 func DefaultClient() (*Client, error) { clientOnce.Do(func() { cfg, err := config.Load() if err != nil { clientErr = err return } clientInst, clientErr = NewClientFromConfig(cfg) }) return clientInst, clientErr }