// ============================================================================ // memos_service.go — Memos 速记 // // 通过 Memos 的 REST API 新建备忘:POST {地址}/api/memos,请求头带 // Authorization: Bearer <访问令牌>,body 为 {"content": "...", "visibility": "..."}。 // 地址、访问令牌与默认可见性保存在「设置 → 工具」中。 // ============================================================================ package main import ( "bytes" "encoding/json" "errors" "fmt" "io" "net/http" "strings" "time" ) // MemosConfig 保存 Memos 速记所需的配置。 type MemosConfig struct { URL string `json:"url"` // 实例地址,如 https://m.scwy.net Token string `json:"token"` // 个人访问令牌(PAT),只存本地 } // MemosService 提供 Memos 速记的配置读取与新建备忘接口。 type MemosService struct{} // NewMemosService 创建 Memos 服务实例。 func NewMemosService() *MemosService { return &MemosService{} } // GetConfig 返回当前 Memos 配置(供前端回填设置表单)。 func (s *MemosService) GetConfig() MemosConfig { return loadSettings().Memos } // CreateMemo 调用 Memos REST API 新建一条私有备忘,返回备忘名称(形如 memos/xxxx)。 func (s *MemosService) CreateMemo(content string) (string, error) { content = strings.TrimSpace(content) if content == "" { return "", errors.New("内容不能为空") } cfg := loadSettings().Memos base := strings.TrimRight(strings.TrimSpace(cfg.URL), "/") if base == "" { return "", errors.New("未配置 Memos 地址,请到「设置 → 工具」中填写") } token := strings.TrimSpace(cfg.Token) if token == "" { return "", errors.New("未配置访问令牌,请到「设置 → 工具」中填写") } // 固定创建私有备忘 payload, err := json.Marshal(map[string]string{ "content": content, "visibility": "PRIVATE", }) if err != nil { return "", err } req, err := http.NewRequest(http.MethodPost, base+"/api/memos", bytes.NewReader(payload)) if err != nil { return "", fmt.Errorf("地址无效:%w", err) } req.Header.Set("Authorization", "Bearer "+token) req.Header.Set("Content-Type", "application/json") client := &http.Client{Timeout: 20 * time.Second} resp, err := client.Do(req) if err != nil { return "", fmt.Errorf("请求失败:%w", err) } defer resp.Body.Close() body, _ := io.ReadAll(io.LimitReader(resp.Body, 4096)) if resp.StatusCode < 200 || resp.StatusCode >= 300 { return "", fmt.Errorf("创建失败(HTTP %d):%s", resp.StatusCode, strings.TrimSpace(string(body))) } var out struct { Name string `json:"name"` } if json.Unmarshal(body, &out) == nil && out.Name != "" { return out.Name, nil } return "已创建", nil }