reply.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package core
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/url"
  6. "regexp"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/beego/beego/v2/adapter/httplib"
  11. "github.com/buger/jsonparser"
  12. )
  13. var reply = NewBucket("reply")
  14. type Reply struct {
  15. Rules []string
  16. Type string //text url
  17. Content string
  18. Request struct {
  19. Url string
  20. Method string
  21. Body string // form-data raw
  22. Headers []string
  23. ResponseType string `yaml:"response_type"` //text json image
  24. Get string
  25. Regex string
  26. Template string
  27. Disappear bool
  28. }
  29. Replace [][]string
  30. }
  31. func InitReplies() {
  32. appreciate := Reply{
  33. Rules: []string{"^打赏", "^赞赏"},
  34. Type: "url",
  35. }
  36. recommand := "https://gitee.com/aiancandle/sillyGirl/raw/main/appreciate.jpg"
  37. appreciate.Request.Url = sillyGirl.Get("appreciate", recommand)
  38. appreciate.Request.ResponseType = "image"
  39. appreciate.Request.Disappear = true
  40. Config.Replies = append([]Reply{appreciate}, Config.Replies...)
  41. for _, v := range Config.Replies {
  42. reply := v
  43. var handler func(s Sender) interface{}
  44. if reply.Type != "url" {
  45. handler = func(s Sender) interface{} {
  46. return reply.Content
  47. }
  48. }
  49. handler = func(s Sender) interface{} {
  50. if reply.Request.Disappear {
  51. s.Disappear()
  52. }
  53. Url := reply.Request.Url
  54. body := reply.Request.Body
  55. for k, v := range s.GetMatch() {
  56. Url = strings.Replace(Url, fmt.Sprintf(`{{%d}}`, k+1), v, -1)
  57. body = strings.Replace(body, fmt.Sprintf(`{{%d}}`, k+1), v, -1)
  58. Url = strings.Replace(Url, fmt.Sprintf(`{{encode(%d)}}`, k+1), url.QueryEscape(v), -1)
  59. body = strings.Replace(body, fmt.Sprintf(`{{encode(%d)}}`, k+1), url.QueryEscape(v), -1)
  60. }
  61. data := func() []byte {
  62. var req httplib.BeegoHTTPRequest
  63. if strings.ToLower(reply.Request.Method) == "post" {
  64. req = *httplib.Post(Url)
  65. } else {
  66. req = *httplib.Get(Url)
  67. }
  68. for _, header := range reply.Request.Headers {
  69. ss := strings.Split(header, ":")
  70. if len(ss) > 0 {
  71. req.Header(ss[0], strings.Join(ss[1:], ":"))
  72. }
  73. }
  74. if reply.Request.Body != "" {
  75. req.Body(body)
  76. }
  77. rsp, err := req.Response()
  78. if err != nil {
  79. if reply.Content != "" {
  80. s.Reply(reply.Content)
  81. } else {
  82. s.Reply(err)
  83. }
  84. return nil
  85. }
  86. d, _ := ioutil.ReadAll(rsp.Body)
  87. return d
  88. }
  89. switch reply.Request.ResponseType {
  90. case "image":
  91. if reply.Request.Get != "" {
  92. d := data()
  93. if d == nil {
  94. return nil
  95. }
  96. f, err := jsonparser.GetString(d, strings.Split(reply.Request.Get, ".")...)
  97. if err != nil {
  98. s.Reply(err)
  99. return nil
  100. }
  101. s.Reply(ImageUrl(f))
  102. return nil
  103. }
  104. if reply.Request.Regex != "" {
  105. d := data()
  106. if d == nil {
  107. return nil
  108. }
  109. res := regexp.MustCompile(reply.Request.Regex).FindStringSubmatch(string(d))
  110. if len(res) != 0 {
  111. s.Reply(ImageUrl(res[1]))
  112. }
  113. return nil
  114. }
  115. timeUnix := strconv.FormatInt(time.Now().Unix(), 10)
  116. if strings.Contains(Url, "?") {
  117. Url = Url + "&_=" + timeUnix
  118. } else {
  119. Url = Url + "?_=" + timeUnix
  120. }
  121. s.Reply(ImageUrl(Url))
  122. case "json":
  123. d := data()
  124. if d == nil {
  125. return nil
  126. }
  127. f, err := jsonparser.GetString(d, strings.Split(reply.Request.Get, ".")...)
  128. if err != nil {
  129. s.Reply(err)
  130. return true
  131. }
  132. if appreciate.Request.Url != recommand {
  133. f += "\n" + Tail
  134. }
  135. s.Reply(f)
  136. case "template":
  137. data := data()
  138. if data == nil {
  139. return nil
  140. }
  141. content := reply.Request.Template
  142. for _, re := range regexp.MustCompile(`tfmt[(][^()]+[)]`).FindAllStringSubmatch(content, -1) {
  143. v := re[0]
  144. get := strings.Replace(strings.TrimRight(v, ")"), "tfmt(", "", -1)
  145. f := time.Now().Format(get)
  146. content = strings.Replace(content, v, f, -1)
  147. }
  148. for _, re := range regexp.MustCompile(`gjson[(][^()]+[)]`).FindAllStringSubmatch(content, -1) {
  149. v := re[0]
  150. get := strings.Replace(strings.TrimRight(v, ")"), "gjson(", "", -1)
  151. f, _ := jsonparser.GetString(data, strings.Split(get, ".")...)
  152. content = strings.Replace(content, v, f, -1)
  153. }
  154. for _, re := range regexp.MustCompile(`fjson[(][^()]+[)]`).FindAllStringSubmatch(content, -1) {
  155. v := re[0]
  156. ins := strings.Replace(strings.TrimRight(v, ")"), "fjson(", "", -1)
  157. ps := strings.Split(ins, ",")
  158. get := ps[0]
  159. ptn := ""
  160. con := ""
  161. switch len(ps) {
  162. case 2:
  163. ptn = ps[1]
  164. case 3:
  165. ptn = ps[1]
  166. con = ps[2]
  167. }
  168. i := 0
  169. ptns := []string{}
  170. for {
  171. cptn := ptn
  172. cget := strings.Replace(get, "[i]", fmt.Sprintf(`[%d]`, i), -1)
  173. f, _, _, err := jsonparser.Get(data, strings.Split(cget, ".")...)
  174. i++
  175. if err != nil {
  176. break
  177. }
  178. cptn = strings.Replace(cptn, "[i]", fmt.Sprintf(`%d`, i), -1)
  179. for _, v := range regexp.MustCompile(`\[(\?[^\[\]]*)\]`).FindAllStringSubmatch(cptn, -1) {
  180. g := ""
  181. if v[1] == "?" {
  182. g = string(f)
  183. } else {
  184. g, _ = jsonparser.GetString(f, strings.Split(v[1], ".")[1:]...)
  185. }
  186. cptn = strings.Replace(cptn, fmt.Sprintf(`[%s]`, v[1]), g, -1)
  187. }
  188. ptns = append(ptns, cptn)
  189. }
  190. content = strings.Replace(content, v, strings.Join(ptns, con), -1)
  191. }
  192. for i := range reply.Replace {
  193. if len(reply.Replace[i]) >= 2 {
  194. content = strings.Replace(content, reply.Replace[i][0], reply.Replace[i][1], -1)
  195. } else {
  196. content = strings.Replace(content, reply.Replace[i][0], "", -1)
  197. }
  198. }
  199. for _, re := range regexp.MustCompile(`image[(][^()]+[)]`).FindAllStringSubmatch(content, -1) {
  200. v := re[0]
  201. get := strings.Replace(strings.TrimRight(v, ")"), "image(", "", -1)
  202. f, _ := jsonparser.GetString(data, strings.Split(get, ".")...)
  203. s.Reply(ImageUrl(f))
  204. content = strings.Replace(content, v, "", -1)
  205. }
  206. content = strings.Replace(content, `[d]`, ",", -1)
  207. if appreciate.Request.Url != recommand {
  208. content += "\n" + Tail
  209. }
  210. s.Reply(content)
  211. default:
  212. d := data()
  213. if d == nil {
  214. return nil
  215. }
  216. s.Reply(d)
  217. }
  218. return nil
  219. }
  220. functions = append(functions, Function{
  221. Rules: reply.Rules,
  222. Handle: handler,
  223. })
  224. }
  225. }