From ce30ff4ef9a6aa22d24f6d3a959f171b980decc2 Mon Sep 17 00:00:00 2001 From: xuyang Date: Tue, 6 May 2025 18:09:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Esms=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/sms/client.go | 110 ++++++++++++++++++++++++++++++++++++ services/sms/client_test.go | 110 ++++++++++++++++++++++++++++++++++++ services/sms/email.go | 45 +++++++++++++++ services/sms/feishu.go | 49 ++++++++++++++++ services/sms/sms.go | 51 +++++++++++++++++ 5 files changed, 365 insertions(+) create mode 100644 services/sms/client.go create mode 100644 services/sms/client_test.go create mode 100644 services/sms/email.go create mode 100644 services/sms/feishu.go create mode 100644 services/sms/sms.go diff --git a/services/sms/client.go b/services/sms/client.go new file mode 100644 index 0000000..3b68f8c --- /dev/null +++ b/services/sms/client.go @@ -0,0 +1,110 @@ +package sms + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "time" +) + +const ( + VERSION = "2024-05-30" +) + +var HOST = requests.Host{ + Default: "sms.gaore.com:8804", +} + +type Client struct { + sdk.Client +} + +func NewClient() (client *Client, err error) { + client = new(Client) + err = client.Init() + return +} + +func (c *Client) SendEmail(req *SendEmailRequest) (resp *SendEmailResponse, err error) { + if len(req.Addresses) == 0 { + return nil, errors.New("addresses is empty") + } + if req.FromName == "" { + return nil, errors.New("from is empty") + } + if req.Subject == "" { + return nil, errors.New("subject is empty") + } + if req.Body == "" { + return nil, errors.New("content is empty") + } + + ts, token := getToken("04573fc4c8e01999a0909ab9c00bca5a") + + req.JsonParams["sign"] = token + req.JsonParams["time"] = ts + resp = CreateSendEmailResponse() + err = c.DoAction(req, resp) + return +} + +func (c *Client) SendFeiShuWebHook(req *SendFeiShuWebHookRequest) (resp *SendFeiShuWebHookResponse, err error) { + if req.Content == "" { + err = errors.New("content is empty") + return + } + + if req.Do == "" { + err = errors.New("webhook is empty") + return + } + + if req.Token == "" { + err = errors.New("token is empty") + return + } + + resp = CreateSendFeiShuWebHookResponse() + err = c.DoAction(req, resp) + return +} + +func (c *Client) SendSms(req *SendSmsRequest) (resp *SendSmsResponse, err error) { + + if req.Mobile == "" { + err = errors.New("mobile is empty") + return + } + + if req.Type == "" { + err = errors.New("type is empty") + return + } + + if req.Expired == 0 { + err = errors.New("expired is empty") + return + } + + if req.Code == 0 { + err = errors.New("code is empty") + return + } + + resp = CreateSendSmsResponse() + err = c.DoAction(req, resp) + return +} + +func getToken(key string) (ts int64, token string) { + ts = time.Now().Unix() + hash := md5.New() + hash.Write([]byte(fmt.Sprintf("%v%v", ts, key))) + hashBytes := hash.Sum(nil) + + token = hex.EncodeToString(hashBytes) + return +} diff --git a/services/sms/client_test.go b/services/sms/client_test.go new file mode 100644 index 0000000..b484cf3 --- /dev/null +++ b/services/sms/client_test.go @@ -0,0 +1,110 @@ +package sms + +import ( + "fmt" + "testing" +) + +var ( + client *Client +) + +func TestMain(t *testing.M) { + var err error + client, err = NewClient() + if err != nil { + panic(err) + } + + t.Run() +} + +func TestClient_SendEmail(t *testing.T) { + req := CreateSendEmailRequest(SendEmailParam{ + Addresses: []string{"xuyang@89you.com"}, + Subject: "测试邮件", + Body: "xxx已修改密码,新密码是:xxx", + FromName: "高热监控", + }) + + email, err := client.SendEmail(req) + if err != nil { + panic(err) + } + + fmt.Println(email) +} + +func TestClient_SendFeiShuWebHook(t *testing.T) { + //req := CreateSendFeiShuWebHookRequest(SendFeiShuWebHookParam{ + // Do: "sendCardText", + // Token: "b762f80c-fe4f-4182-b48e-5c78041592bc", + // Content: "[{\"tag\":\"div\",\"text\":{\"tag\":\"plain_text\",\"content\":\"请完成以下任务:\"}},{\"tag\":\"action\",\"actions\":[{\"tag\":\"button\",\"text\":{\"tag\":\"plain_text\",\"content\":\"查看详情\"},\"type\":\"primary\",\"url\":\"https:\\\\\\\\/\\\\\\\\/example.com\\\\\\\\/task\"}]}]", + // Title: "卡片主标题", + // TitleColor: "purple", + //}) + // + //resp, err := client.SendFeiShuWebHook(req) + //if err != nil { + // panic(err) + //} + //fmt.Println(resp) + // + //req2 := CreateSendFeiShuWebHookRequest(SendFeiShuWebHookParam{ + // Do: "sendSimpleText", + // Token: "b762f80c-fe4f-4182-b48e-5c78041592bc", + // Content: " - 苹果ID:XXXX\n - 游戏ID:XXXX\n - bundleID:XXXX\n - 应用名:XXX\n - 下架时间:2025-04-18 12:36:52\n - IP:XX(城市A省份)、XX(城市B省份);说明:XX为具体的IP,括号内为IP对应的城市;", + //}) + // + //resp2, err := client.SendFeiShuWebHook(req2) + //if err != nil { + // panic(err) + //} + //fmt.Println(resp2) + + //[ + // [ + // { + // "tag": "text", + // "text": "苹果ID:XXXX" + // } + // ], + // [ + // { + // "tag": "text", + // "text": "游戏ID:XXXX" + // } + // ] + //] + + req3 := CreateSendFeiShuWebHookRequest(SendFeiShuWebHookParam{ + TitleColor: "purple", + Title: "监控报警", + Do: "sendCardText", + Token: "b762f80c-fe4f-4182-b48e-5c78041592bc", + Content: "[{\"tag\":\"div\",\"text\":{\"tag\":\"plain_text\",\"content\":\"苹果ID:XXXX\"}},{\"tag\":\"div\",\"text\":{\"tag\":\"plain_text\",\"content\":\"游戏ID:XXXX\"}}]", + }) + + resp3, err := client.SendFeiShuWebHook(req3) + if err != nil { + panic(err) + } + fmt.Println(resp3.Msg) + fmt.Println(resp3) +} + +func TestClient_SendSms(t *testing.T) { + req := CreateSendSmsRequest(SendSmsParam{ + Mobile: "18320021439", + Type: SmsTypeRegister, + Code: 123456, + Expired: 5, + }) + + sms, err := client.SendSms(req) + if err != nil { + panic(err) + } + + fmt.Println(sms) +} diff --git a/services/sms/email.go b/services/sms/email.go new file mode 100644 index 0000000..54a59e4 --- /dev/null +++ b/services/sms/email.go @@ -0,0 +1,45 @@ +package sms + +import ( + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" +) + +type SendEmailRequest struct { + *requests.JsonRequest + Addresses []string `position:"Json" field:"addresses"` + Subject string `position:"Json" field:"subject"` + Body string `position:"Json" field:"body"` + FromName string `position:"Json" field:"from_name"` +} + +type SendEmailResponse struct { + *responses.BaseResponse +} + +type SendEmailParam struct { + Addresses []string + Subject string + Body string + FromName string +} + +func CreateSendEmailRequest(param SendEmailParam) (req *SendEmailRequest) { + req = &SendEmailRequest{ + JsonRequest: &requests.JsonRequest{}, + Addresses: param.Addresses, + Subject: param.Subject, + Body: param.Body, + FromName: param.FromName, + } + req.InitWithApiInfo(HOST, VERSION, "/email/send") + req.Method = requests.POST + return +} + +func CreateSendEmailResponse() (resp *SendEmailResponse) { + resp = &SendEmailResponse{ + BaseResponse: &responses.BaseResponse{}, + } + return +} diff --git a/services/sms/feishu.go b/services/sms/feishu.go new file mode 100644 index 0000000..5fff2c4 --- /dev/null +++ b/services/sms/feishu.go @@ -0,0 +1,49 @@ +package sms + +import ( + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" +) + +type SendFeiShuWebHookRequest struct { + *requests.JsonRequest + Do string `position:"Json" field:"do"` + Token string `position:"Json" field:"token"` + Content string `position:"Json" field:"content"` + Title string `position:"Json" field:"title"` + TitleColor string `position:"Json" field:"title_color"` +} + +type SendFeiShuWebHookResponse struct { + *responses.BaseResponse + FeishuData string `json:"feishu_data"` +} + +type SendFeiShuWebHookParam struct { + Do string + Token string + Content string + Title string + TitleColor string +} + +func CreateSendFeiShuWebHookRequest(param SendFeiShuWebHookParam) (req *SendFeiShuWebHookRequest) { + req = &SendFeiShuWebHookRequest{ + JsonRequest: &requests.JsonRequest{}, + Do: param.Do, + Token: param.Token, + Content: param.Content, + Title: param.Title, + TitleColor: param.TitleColor, + } + req.InitWithApiInfo(HOST, VERSION, "/feishu/webhook_send") + req.Method = requests.POST + return +} + +func CreateSendFeiShuWebHookResponse() (resp *SendFeiShuWebHookResponse) { + resp = &SendFeiShuWebHookResponse{ + BaseResponse: &responses.BaseResponse{}, + } + return +} diff --git a/services/sms/sms.go b/services/sms/sms.go new file mode 100644 index 0000000..9e178d5 --- /dev/null +++ b/services/sms/sms.go @@ -0,0 +1,51 @@ +package sms + +import ( + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" +) + +type SendSmsRequest struct { + *requests.JsonRequest + Mobile string `position:"Json" field:"mobile"` + Type string `position:"Json" field:"type"` + Expired int64 `position:"Json" field:"expired"` + Code int64 `position:"Json" field:"code"` +} + +type SendSmsResponse struct { + *responses.BaseResponse +} + +type SmsType = string + +const ( + SmsTypeRegister SmsType = "reg" // 注册 +) + +type SendSmsParam struct { + Mobile string // 手机号 + Type SmsType // 验证码类型 + Expired int64 // 过期时间,秒数 + Code int64 // 验证码 +} + +func CreateSendSmsRequest(param SendSmsParam) (req *SendSmsRequest) { + req = &SendSmsRequest{ + JsonRequest: &requests.JsonRequest{}, + Mobile: param.Mobile, + Type: param.Type, + Expired: param.Expired, + Code: param.Code, + } + req.InitWithApiInfo(HOST, VERSION, "/sms/agg/send") + req.Method = requests.POST + return +} + +func CreateSendSmsResponse() (resp *SendSmsResponse) { + resp = &SendSmsResponse{ + BaseResponse: &responses.BaseResponse{}, + } + return +}