90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
|
//go:build plus
|
|
|
|
package smssenders
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/utils"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
|
|
"github.com/iwind/TeaGo/types"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type WebHookSender struct {
|
|
params *userconfigs.SMSSenderWebHookParams
|
|
}
|
|
|
|
func NewWebHookSender() *WebHookSender {
|
|
return &WebHookSender{}
|
|
}
|
|
|
|
func (this *WebHookSender) Init(params any) error {
|
|
if params == nil {
|
|
return errors.New("'params' should not be nil")
|
|
}
|
|
var ok bool
|
|
this.params, ok = params.(*userconfigs.SMSSenderWebHookParams)
|
|
if !ok {
|
|
return errors.New("invalid params type")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Send 发送短信
|
|
func (this *WebHookSender) Send(mobile string, body string, code string) (result string, isOk bool, err error) {
|
|
var encodedQuery = (&url.Values{
|
|
"mobile": []string{mobile},
|
|
"body": []string{body},
|
|
"code": []string{code},
|
|
}).Encode()
|
|
var webHookURL = this.params.URL
|
|
var reader io.Reader
|
|
if this.params.Method == "POST" {
|
|
reader = strings.NewReader(encodedQuery)
|
|
} else {
|
|
if strings.Contains(webHookURL, "?") {
|
|
webHookURL += "&" + encodedQuery
|
|
} else {
|
|
webHookURL += "?" + encodedQuery
|
|
}
|
|
}
|
|
req, err := http.NewRequest(this.params.Method, webHookURL, reader)
|
|
if err != nil {
|
|
return "", false, fmt.Errorf("create request failed: %w", err)
|
|
}
|
|
|
|
req.Header.Set("User-Agent", teaconst.ProductName+"/"+teaconst.Version)
|
|
if this.params.Method == "POST" {
|
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
}
|
|
|
|
resp, err := utils.SharedHttpClient(10 * time.Second).Do(req)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
if resp == nil || resp.Body == nil {
|
|
return "", false, errors.New("invalid response")
|
|
}
|
|
defer func() {
|
|
_ = resp.Body.Close()
|
|
}()
|
|
|
|
respData, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return "StatusCode: " + types.String(resp.StatusCode) + ": " + string(respData), false, nil
|
|
}
|
|
|
|
return string(respData), true, nil
|
|
}
|