From 066f6829bdd1989ed24354f459b916908c8bce05 Mon Sep 17 00:00:00 2001 From: Stanly Date: Tue, 12 Oct 2021 15:04:30 +0800 Subject: [PATCH] Add sms every8d, mitake, smsget --- sms/error.go | 10 +++++++++ sms/every8d.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ sms/mitake.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sms/smsget.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 195 insertions(+) create mode 100644 sms/error.go create mode 100644 sms/every8d.go create mode 100644 sms/mitake.go create mode 100644 sms/smsget.go diff --git a/sms/error.go b/sms/error.go new file mode 100644 index 0000000..806261a --- /dev/null +++ b/sms/error.go @@ -0,0 +1,10 @@ +package sms + +import ( + "fmt" +) + +var ( + ErrResponse = fmt.Errorf("Resposne error.") + ErrNotEnoughCredit = fmt.Errorf("Not enough credit.") +) diff --git a/sms/every8d.go b/sms/every8d.go new file mode 100644 index 0000000..6818ef5 --- /dev/null +++ b/sms/every8d.go @@ -0,0 +1,59 @@ +package sms + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +type Every8D struct { + Username string + Password string +} + +func NewSmsEvery8D(username, password string) *Every8D { + return &Every8D{ + Username: username, + Password: password, + } +} + +func (every8d *Every8D) Send(mobile, msg string) (int, error) { + qs := url.Values{} + qs.Add("UID", every8d.Username) + qs.Add("PWD", every8d.Password) + qs.Add("DEST", mobile) + qs.Add("MSG", url.QueryEscape(msg)) + + client := http.Client{Timeout: 2 * time.Second} + resp, err := client.Get(fmt.Sprintf("https://oms.every8d.com/API21/HTTP/sendSMS.ashx?%s", qs.Encode())) + if err != nil { + return 0, err + } + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return 0, err + } + defer resp.Body.Close() + + data := strings.Split(string(bs), ",") + if len(data) != 5 { + return 0, ErrResponse + } + + credit, err := strconv.ParseFloat(data[0], 64) + if err != nil { + return 0, err + } + + if credit < 0 { + return 0, ErrNotEnoughCredit + } + + return int(credit), nil +} diff --git a/sms/mitake.go b/sms/mitake.go new file mode 100644 index 0000000..ac6c3dd --- /dev/null +++ b/sms/mitake.go @@ -0,0 +1,62 @@ +package sms + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +type Mitake struct { + Username string + Password string +} + +func NewSmsMitake(username, password string) *Mitake { + return &Mitake{ + Username: username, + Password: password, + } +} + +func (mitake *Mitake) Send(mobile, msg string) (int, error) { + qs := url.Values{} + qs.Add("CharsetURL", "UTF8") + qs.Add("username", mitake.Username) + qs.Add("password", mitake.Password) + qs.Add("dstaddr", mobile) + qs.Add("smbody", url.QueryEscape(msg)) + + client := http.Client{Timeout: 2 * time.Second} + resp, err := client.Get(fmt.Sprintf("http://smsb2c.mitake.com.tw/b2c/mtk/SmSend?%s", qs.Encode())) + if err != nil { + return 0, err + } + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return 0, err + } + defer resp.Body.Close() + + if len(strings.Split(string(bs), "\n")) != 6 { + return 0, ErrResponse + } + + qs, err = url.ParseQuery(strings.ReplaceAll(string(bs), "\n", "&")) + if err != nil { + return 0, err + } + + credit, err := strconv.ParseInt(strings.ReplaceAll(qs.Get("AccountPoint"), "\r", ""), 10, 64) + if err != nil { + return 0, err + } else if credit < 0 { + return 0, ErrNotEnoughCredit + } + + return int(credit), nil +} diff --git a/sms/smsget.go b/sms/smsget.go new file mode 100644 index 0000000..1fbf538 --- /dev/null +++ b/sms/smsget.go @@ -0,0 +1,64 @@ +package sms + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" +) + +type SmsGet struct { + Username string + Password string +} + +func NewSmsGet(username, password string) *SmsGet { + return &SmsGet{ + Username: username, + Password: password, + } +} + +func (smsget *SmsGet) Send(mobile, msg string) (int, error) { + qs := url.Values{} + qs.Add("method", "1") + qs.Add("username", smsget.Username) + qs.Add("password", smsget.Password) + qs.Add("sms_msg", url.QueryEscape(msg)) + + resp, err := http.Get(fmt.Sprintf("https://sms-get2.com/api_send.php?%s", qs.Encode())) + if err != nil { + return 0, err + } + defer resp.Body.Close() + + bs, err := ioutil.ReadAll(resp.Body) + if err != nil { + return 0, err + } + + var res struct { + Status bool `json:"stats"` + Code int `json:"error_code,string"` + Msg string `json:"error_msg"` + } + if err := json.Unmarshal(bs, &res); err != nil { + return 0, ErrResponse + } + if res.Status == false || res.Code != 0 { + if res.Code == 9 { + return 0, ErrNotEnoughCredit + } + return 0, ErrResponse + } + + credit, err := strconv.Atoi(strings.Split(res.Msg, "|")[2]) + if err != nil { + return 0, err + } + + return credit, nil +}