mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-30 07:06:38 +08:00
92 lines
2.0 KiB
Go
92 lines
2.0 KiB
Go
package drives
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"net/http"
|
|
"one-api/common/requester"
|
|
)
|
|
|
|
var smUploadURL = "https://sm.ms/api/v2/upload"
|
|
|
|
type SMUpload struct {
|
|
Secret string
|
|
}
|
|
|
|
type SMData struct {
|
|
URL string `json:"url"`
|
|
// FileID int `json:"file_id"`
|
|
// Width int `json:"width"`
|
|
// Height int `json:"height"`
|
|
// Filename string `json:"filename"`
|
|
// Storename string `json:"storename"`
|
|
// Size int `json:"size"`
|
|
// Path string `json:"path"`
|
|
// Hash string `json:"hash"`
|
|
// Delete string `json:"delete"`
|
|
// Page string `json:"page"`
|
|
}
|
|
|
|
type SMResponse struct {
|
|
Success bool `json:"success"`
|
|
Code string `json:"code"`
|
|
Message string `json:"message"`
|
|
Data SMData `json:"data,omitempty"`
|
|
RequestID string `json:"RequestId"`
|
|
}
|
|
|
|
func NewSMUpload(secret string) *SMUpload {
|
|
return &SMUpload{
|
|
Secret: secret,
|
|
}
|
|
}
|
|
|
|
func (sm *SMUpload) Name() string {
|
|
return "SM.MS"
|
|
}
|
|
|
|
func (sm *SMUpload) Upload(data []byte, fileName string) (string, error) {
|
|
client := requester.NewHTTPRequester("", nil)
|
|
|
|
var formBody bytes.Buffer
|
|
builder := client.CreateFormBuilder(&formBody)
|
|
|
|
err := builder.CreateFormFileReader("smfile", bytes.NewReader(data), fileName)
|
|
if err != nil {
|
|
return "", fmt.Errorf("creating form file: %w", err)
|
|
}
|
|
builder.WriteField("format", "json")
|
|
builder.Close()
|
|
|
|
headers := map[string]string{
|
|
"Content-type": "application/json",
|
|
"Authorization": sm.Secret,
|
|
}
|
|
|
|
req, err := client.NewRequest(
|
|
http.MethodPost,
|
|
smUploadURL,
|
|
client.WithBody(&formBody),
|
|
client.WithHeader(headers),
|
|
client.WithContentType(builder.FormDataContentType()))
|
|
req.ContentLength = int64(formBody.Len())
|
|
|
|
if err != nil {
|
|
return "", fmt.Errorf("new request failed: %w", err)
|
|
}
|
|
|
|
defer req.Body.Close()
|
|
|
|
smResponse := &SMResponse{}
|
|
_, errWithCode := client.SendRequest(req, smResponse, false)
|
|
if errWithCode != nil {
|
|
return "", fmt.Errorf("%s", errWithCode.Message)
|
|
}
|
|
|
|
if !smResponse.Success {
|
|
return "", fmt.Errorf("upload failed: %s", smResponse.Message)
|
|
}
|
|
|
|
return smResponse.Data.URL, nil
|
|
}
|