Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

171 lines
4.6KB

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. )
  8. const idProcEcho = "Echo"
  9. var procEcho = chatProcedure{
  10. echoInit,
  11. echoClean,
  12. echoStart,
  13. echoServe,
  14. echoSummary,
  15. echoInto,
  16. }
  17. func echoInit(ss *openIDSessionData) {
  18. ss.setProcedure(idProcEcho)
  19. ss.refreshExpire(600)
  20. }
  21. func echoClean(ss *openIDSessionData) {
  22. ss.Procedure = ""
  23. log.Println(*ss)
  24. }
  25. func echoStart(ss *openIDSessionData, in InWechatMsg) {
  26. ss.setKvPair("started at", time.Now().Format("2006/03:04:05"))
  27. }
  28. func echoServe(ss *openIDSessionData, in InWechatMsg) {
  29. if in.header.MsgType == "text" {
  30. if in.body.(TextMsg).Content == "结束Echo" {
  31. in.replyText("echo 正式结束")
  32. echoSummary(ss)
  33. echoClean(ss)
  34. return
  35. }
  36. }
  37. ss.refreshExpire(600)
  38. echoCommand(ss, in)
  39. }
  40. func echoSummary(ss *openIDSessionData) {
  41. msg := ss.getVal("started at")
  42. msg = msg + "\n" + ss.getVal("msg")
  43. kfSendTxt(ss.OpenID, msg)
  44. }
  45. func echoInto(ss *openIDSessionData) {
  46. kfSendTxt(ss.OpenID, "10 分钟没有输入之后 Echo将自动结束,\n输入 [结束Echo] 清除Echo模式")
  47. }
  48. func echoCommand(ss *openIDSessionData, in InWechatMsg) {
  49. openID := in.header.FromUserName
  50. str, err := BuildTextMsg(openID, "default")
  51. log.Println("echoCommand :" + in.header.MsgType)
  52. switch in.body.(type) {
  53. case TextMsg:
  54. m := in.body.(TextMsg)
  55. str, err = BuildTextMsg(openID, m.Content+"\n\n关键词 [转接] 将后续信息都转接到 客服 测试版")
  56. msg := ss.getVal("msg")
  57. msg = msg + m.Content
  58. ss.setKvPair("msg", msg)
  59. in.replyXML(str)
  60. case PicMsg:
  61. m := in.body.(PicMsg)
  62. str = buildPicMsg(openID, m.MediaId)
  63. in.replyXML(str)
  64. case VoiceMsg:
  65. m := in.body.(VoiceMsg)
  66. str = buildVoiceMsg(openID, m.MediaId)
  67. in.replyXML(str)
  68. kfSendTxt(openID, "翻译结果:"+m.Recognition)
  69. case VideoMsg:
  70. m := in.body.(VideoMsg)
  71. str = buildVideoMsg(openID, "e2iNEiSxCX5TV1WbFd0TQMn5lilY3bylh1--lDBwi7I", "航拍春日哈工大", m.MediaId)
  72. in.replyXML(str)
  73. case ShortVideoMsg:
  74. m := in.body.(ShortVideoMsg)
  75. str = buildVideoMsg(openID, "e2iNEiSxCX5TV1WbFd0TQMn5lilY3bylh1--lDBwi7I", "航拍春日哈工大", m.MediaId)
  76. in.replyXML(str)
  77. case LocationMsg:
  78. m := in.body.(LocationMsg)
  79. mid := location2MediaID(m.Location_X, m.Location_Y)
  80. str, _ = BuildTextMsg(openID, fmt.Sprintf("long=%f, lat=%f, scale=%d", m.Location_X, m.Location_Y, m.Scale))
  81. in.replyXML(str)
  82. str = buildPicMsg(openID, mid)
  83. url := location2URL(m.Location_X, m.Location_Y)
  84. kfSendTxt(openID, url)
  85. case LinkMsg:
  86. m := in.body.(LinkMsg)
  87. str, _ = BuildTextMsg(openID, m.Url)
  88. in.replyXML(str)
  89. kfSendTxt(openID, m.Title+m.Description)
  90. case EventMsg:
  91. echoEvents(in)
  92. default:
  93. str, err = BuildTextMsg(openID, "text message")
  94. }
  95. if err != nil {
  96. log.Println("build response failed")
  97. }
  98. return
  99. }
  100. func echoEvents(in InWechatMsg) {
  101. openID := in.header.FromUserName
  102. str := ""
  103. m := in.body.(EventMsg)
  104. log.Println("Event = " + m.Event)
  105. switch m.Event {
  106. case "LOCATION":
  107. mid := location2MediaID(m.Latitude, m.Longitude)
  108. str = buildPicMsg(openID, mid)
  109. case "CLICK":
  110. str, _ = BuildTextMsg(openID, m.EventKey)
  111. case "subscribe":
  112. str, _ = BuildTextMsg(openID, m.EventKey)
  113. case "unsubscribe":
  114. str, _ = BuildTextMsg(openID, m.EventKey)
  115. case "SCAN":
  116. str, _ = BuildTextMsg(openID, m.EventKey)
  117. case "VIEW":
  118. str, _ = BuildTextMsg(openID, m.EventKey)
  119. case "kf_create_session":
  120. kfSendTxt(openID, m.KfAccount)
  121. //str, _ = BuildTextMsg(openID, m.KfAccount) // response msg is ignored by wechat
  122. case "kf_close_session":
  123. kfSendTxt(openID, m.KfAccount+"\n close type ="+m.CloseType)
  124. //str, _ = BuildTextMsg(openID, m.KfAccount+"\n close type ="+m.CloseType) //response msg is ignored by wechat
  125. case "scancode_waitmsg":
  126. log.Println(m.ScanCodeInfo.ScanResult)
  127. log.Println(m.ScanCodeInfo.ScanType)
  128. msg := fmt.Sprintf("ScanResult =%s, ScanType=%s", m.ScanCodeInfo.ScanResult, m.ScanCodeInfo.ScanType)
  129. kfSendTxt(openID, msg)
  130. case "pic_photo_or_album":
  131. msg := fmt.Sprintf("Count = %d ", m.SendPicsInfo.Count)
  132. log.Println(m.SendPicsInfo.Count)
  133. for _, v := range m.SendPicsInfo.PicList.Item {
  134. log.Println(v.PicMd5Sum)
  135. kfSendTxt(openID, v.PicMd5Sum)
  136. }
  137. kfSendTxt(openID, msg)
  138. default:
  139. str, _ = BuildTextMsg(openID, " unknown event:"+m.Event)
  140. }
  141. in.replyXML(str)
  142. return
  143. }
  144. func location2MediaID(lat, long float64) (mediaID string) {
  145. url := fmt.Sprintf("https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&markers=color:red|label:S|%f,%f&zoom=17&size=1280x2014", lat, long, lat, long)
  146. file, _, _ := saveURL(url)
  147. mediaID = uploadImage(file)
  148. os.Remove(file)
  149. return
  150. }
  151. func location2URL(lat, long float64) (url string) {
  152. url = fmt.Sprintf("http://maps.google.com/maps?z=12&t=m&q=loc:%f+%f", lat, long)
  153. log.Println(url)
  154. return
  155. }