handle_tools.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package mokuai
  2. import (
  3. "bytes"
  4. "crypto/tls"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. gomail "gopkg.in/gomail.v2"
  9. "io/ioutil"
  10. "math/rand"
  11. "net/http"
  12. "regexp"
  13. "strings"
  14. "time"
  15. )
  16. type monitormail struct {
  17. Smtpurl string `gorm:"smtpurl" json:"smtpurl"` // smtp服务器
  18. Smtpport int `gorm:"smtpport" json:"smtpport"` // smtp 端口
  19. Smtpuser string `gorm:"smtpuser" json:"smtpuser"` // 邮箱账号
  20. Smtpname string `gorm:"smtpname" json:"smtpname"` // 发件人别名
  21. Smtppasswd string `gorm:"smtppasswd" json:"smtppasswd"` // 邮箱密码/授权码
  22. Smtpssl int `gorm:"smtpssl" json:"smtpssl"` // 是否启用SSL . (1. 启用 )
  23. Sendmail string `gorm:"sendmail" json:"sendmail"` // 发送到的邮箱
  24. }
  25. // 钉钉通知 文本内容 Sign方式
  26. // webhook_url 文本型 机器人webhook URL ;
  27. // text 文本型 通知的消息内容 ;
  28. // secret 文本型 机器人安全设置内的加签 ;
  29. // atMobiles 文本型 被@人的手机号,多个用|隔开 ; (与 ”是否@所有人“ 互斥)
  30. // isAtAll 布尔型 ,是否@所有人。 (与 ”被@人的手机号“ 互斥 ,两者都有此为优先)
  31. func Tools_DingToInfo(webhook_url, text, secret, atMobiles string, isAtAll bool) bool {
  32. timestamp := time.Now().UnixNano() / 1e6
  33. stringToSign := fmt.Sprintf("%d\n%s", timestamp, secret)
  34. sign := Hash_hmacSha256_en(stringToSign, secret)
  35. url := fmt.Sprintf("%s&timestamp=%d&sign=%s", webhook_url, timestamp, sign)
  36. var mobilezu []string
  37. if Text_FindKeyword(atMobiles, "|") != -1 {
  38. mobilezu = Text_GetSplitText(atMobiles, "|")
  39. } else {
  40. mobilezu = append(mobilezu, atMobiles)
  41. }
  42. content, data, at := make(map[string]string), make(map[string]interface{}), make(map[string]interface{})
  43. content["content"] = text
  44. at["atMobiles"] = mobilezu
  45. at["isAtAll"] = isAtAll
  46. data["msgtype"] = "text"
  47. data["text"] = content
  48. data["at"] = at
  49. b, _ := json.Marshal(data)
  50. resp, err := http.Post(url,
  51. "application/json",
  52. bytes.NewBuffer(b))
  53. if err != nil {
  54. fmt.Println("DingToInfo ERROR :", err)
  55. return false
  56. }
  57. defer resp.Body.Close()
  58. // body, _ := ioutil.ReadAll(resp.Body)
  59. // fmt.Println(string(body))
  60. return true
  61. }
  62. // 获取本机公网出口IP . 失败返回空
  63. // n 为 访问哪个接口获取。 0为随机 ; 1. h.myip.top ; 2. myip.top ; 3. myip.zzznb.cc ; 4. HTTP ip检测接口 ;
  64. func Tools_GetPublicIP_Api(n int) string {
  65. if n == 0 {
  66. n = int(Text_GetRandNumInRange(1, 4))
  67. }
  68. var resp *http.Response
  69. var err error
  70. if n == 1 {
  71. resp, err = http.Get("http://h.myip.top/")
  72. if err != nil {
  73. return ""
  74. }
  75. } else if n == 2 {
  76. resp, err = http.Get("http://myip.top/")
  77. if err != nil {
  78. return ""
  79. }
  80. } else if n == 3 {
  81. resp, err = http.Get("http://myip.zzznb.cc/")
  82. if err != nil {
  83. return ""
  84. }
  85. } else if n == 4 {
  86. resp, err = http.Get("http://106.15.239.72/myip")
  87. if err != nil {
  88. return ""
  89. }
  90. }
  91. defer resp.Body.Close()
  92. lin, _ := ioutil.ReadAll(resp.Body)
  93. ip := ""
  94. linzu := Text_GetSplitText(string(lin), ",")
  95. for _, v := range linzu {
  96. if Text_FindKeyword(v, "ip") != -1 {
  97. ip = Text_GetBetween(Text_GetRightText(v, ":"), "\"", "\"")
  98. }
  99. }
  100. return ip
  101. }
  102. // 检测IP正确性
  103. func Tools_ChkIp(ip string) bool {
  104. r, _ := regexp.Compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$")
  105. if !r.MatchString(ip) {
  106. return false
  107. }
  108. return true
  109. }
  110. // 随机生成mac
  111. func Tools_RandMac() string {
  112. var m [6]byte
  113. rand.Seed(time.Now().UnixNano())
  114. for i := 0; i < 6; i++ {
  115. mac_byte := rand.Intn(256)
  116. m[i] = byte(mac_byte)
  117. rand.Seed(int64(mac_byte))
  118. }
  119. return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", m[0], m[1], m[2], m[3], m[4], m[5])
  120. }
  121. // 发送邮件
  122. func Tool_sendmail(euser monitormail, mailSubject, mailBody string) (isOk bool, err error) {
  123. if mailSubject == "" {
  124. return false, errors.New("mailSubject is Null")
  125. }
  126. if mailBody == "" {
  127. return false, errors.New("mailBody is Null")
  128. }
  129. if euser.Smtpurl == "" {
  130. return false, errors.New("Smtpurl is Null")
  131. }
  132. if euser.Smtpport <= 0 {
  133. return false, errors.New("Smtpport is Null")
  134. }
  135. if euser.Sendmail == "" {
  136. return false, errors.New("Sendmail is Null")
  137. }
  138. if euser.Smtpuser == "" {
  139. return false, errors.New("Smtpuser is Null")
  140. }
  141. m := gomail.NewMessage()
  142. if euser.Smtpname != "" {
  143. m.SetHeader("From", euser.Smtpname+"<"+euser.Smtpuser+">")
  144. } else {
  145. m.SetHeader("From", euser.Smtpuser)
  146. }
  147. u := strings.Split(euser.Sendmail, ",")
  148. m.SetHeader("To", u...)
  149. m.SetHeader("Subject", mailSubject)
  150. m.SetBody("text/html", mailBody)
  151. /* if files != "" { // 添加附件
  152. f := strings.Split(files, ",")
  153. for _, i := range f {
  154. m.Attach(i)
  155. }
  156. }*/
  157. //
  158. d := gomail.NewDialer(euser.Smtpurl, euser.Smtpport, euser.Smtpuser, euser.Smtppasswd)
  159. if euser.Smtpssl == 1 {
  160. // 开启SSL协议认证
  161. d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
  162. }
  163. // Send the email to Bob, Cora and Dan.
  164. err = d.DialAndSend(m)
  165. if err == nil {
  166. isOk = true
  167. } else {
  168. isOk = false
  169. }
  170. return
  171. }