smsbao.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package smsplat
  2. import (
  3. "fmt"
  4. "net/url"
  5. "one.com/kettle/htp"
  6. "one.com/kettle/sms"
  7. "one.com/kettle/utl"
  8. "strconv"
  9. "strings"
  10. )
  11. const (
  12. url_SENDSMS = "http://api.smsbao.com/sms"
  13. query_SENDSMS = "u=%s&p=%s&m=%s&c=%s"
  14. url_BALANCE = "http://www.smsbao.com/query"
  15. query_BALANCE = "u=%s&p=%s"
  16. )
  17. func NewSmsBao(username, password string) sms.ISms {
  18. return &smsBao{
  19. username: username,
  20. password: password,
  21. c: htp.NewClient(),
  22. }
  23. }
  24. type smsBao struct {
  25. username, password string
  26. c *htp.Client
  27. }
  28. func (self *smsBao) Send(phone, msg string) error {
  29. uri := fmt.Sprintf(url_SENDSMS+"?"+query_SENDSMS, url_SENDSMS,
  30. self.username, self.password, phone, url.QueryEscape(msg))
  31. var err error = nil
  32. data, err := self.c.Get(uri)
  33. if err != nil {
  34. return err
  35. }
  36. if string(data) != "0" {
  37. err = sms.ErrSmsNoMoney
  38. }
  39. return err
  40. }
  41. //TODO: this implement is error. // @see official docs
  42. func (self *smsBao) SendTpl(phone, tpl, params string) error {
  43. return self.Send(phone, tpl)
  44. }
  45. func (self *smsBao) GetBalance() (float64, error) {
  46. return 0, utl.ErrNotImplement
  47. }
  48. func (self *smsBao) GetAvailable() (int64, error) {
  49. uri := fmt.Sprintf(url_BALANCE+"?"+query_BALANCE, self.username, self.password)
  50. clt := htp.NewClient()
  51. data, err := clt.Get(uri)
  52. if err != nil {
  53. return 0, err
  54. }
  55. sbody := fmt.Sprintf("%s", data)
  56. lines := strings.Split(sbody, "\n")
  57. if len(lines) < 2 {
  58. return 0, sms.ErrSmsProviderReturnBadValue
  59. }
  60. if lines[0] != "0" {
  61. return 0, sms.ErrSmsProviderReturnBadValue
  62. }
  63. parts := strings.Split(lines[1], ",")
  64. if len(parts) < 2 {
  65. return 0, sms.ErrSmsProviderReturnBadValue
  66. }
  67. remains, err := strconv.ParseInt(parts[1], 10, 64)
  68. if err != nil {
  69. return 0, err
  70. }
  71. return remains, nil
  72. }
  73. func (self *smsBao) Name() string {
  74. return "smsbao.com"
  75. }