diff --git a/echoServer.go b/echoServer.go new file mode 100644 index 0000000..0337a24 --- /dev/null +++ b/echoServer.go @@ -0,0 +1,122 @@ +package main + +import ( + "fmt" + "log" + "os" +) + +func echoCommand(openID string, in InWechatMsg) (state chatState, processed bool) { + processed = true + str, err := BuildTextMsg(openID, "default") + log.Println(in.header.MsgType) + switch in.body.(type) { + case TextMsg: + m := in.body.(TextMsg) + str, err = BuildTextMsg(openID, m.Content+"\n\n关键词 [转接] 将后续信息都转接到 客服") + if m.Content == "转接" { + processed = false + } + + case PicMsg: + m := in.body.(PicMsg) + str = buildPicMsg(openID, m.MediaId) + + case VoiceMsg: + m := in.body.(VoiceMsg) + str = buildVoiceMsg(openID, m.MediaId) + kfSendTxt(openID, "翻译结果:"+m.Recognition) + case VideoMsg: + m := in.body.(VideoMsg) + str = buildVideoMsg(openID, "e2iNEiSxCX5TV1WbFd0TQMn5lilY3bylh1--lDBwi7I", "航拍春日哈工大", m.MediaId) + case ShortVideoMsg: + m := in.body.(ShortVideoMsg) + str = buildVideoMsg(openID, "e2iNEiSxCX5TV1WbFd0TQMn5lilY3bylh1--lDBwi7I", "航拍春日哈工大", m.MediaId) + case LocationMsg: + m := in.body.(LocationMsg) + mid := location2MediaID(m.Location_X, m.Location_Y) + //str, _ = BuildTextMsg(openID, fmt.Sprintf("long=%f, lat=%f, scale=%d", m.Location_X, m.Location_Y, m.Scale)) + str = buildPicMsg(openID, mid) + url := location2URL(m.Location_X, m.Location_Y) + kfSendTxt(openID, url) + + case LinkMsg: + m := in.body.(LinkMsg) + kfSendTxt(openID, m.Title+m.Description) + str, _ = BuildTextMsg(openID, m.Url) + case EventMsg: + return echoEvents(openID, in) + default: + str, err = BuildTextMsg(openID, "text message") + } + + state.OpenID = openID + state.Procedure = "" + state.response = str + log.Println(str) + if err != nil { + log.Println("build response failed") + processed = false + } + //state is any state that + return +} + +func echoEvents(openID string, in InWechatMsg) (state chatState, processed bool) { + processed = true + str := "" + m := in.body.(EventMsg) + log.Println("Event = " + m.Event) + switch m.Event { + case "LOCATION": + mid := location2MediaID(m.Latitude, m.Longitude) + str = buildPicMsg(openID, mid) + case "CLICK": + str, _ = BuildTextMsg(openID, m.EventKey) + case "subscribe": + str, _ = BuildTextMsg(openID, m.EventKey) + case "unsubscribe": + str, _ = BuildTextMsg(openID, m.EventKey) + case "SCAN": + str, _ = BuildTextMsg(openID, m.EventKey) + case "VIEW": + str, _ = BuildTextMsg(openID, m.EventKey) + case "kf_create_session": + kfSendTxt(openID, m.KfAccount) + //str, _ = BuildTextMsg(openID, m.KfAccount) // response msg is ignored by wechat + case "kf_close_session": + kfSendTxt(openID, m.KfAccount+"\n close type ="+m.CloseType) + //str, _ = BuildTextMsg(openID, m.KfAccount+"\n close type ="+m.CloseType) //response msg is ignored by wechat + case "scancode_waitmsg": + log.Println(m.ScanCodeInfo.ScanResult) + log.Println(m.ScanCodeInfo.ScanType) + msg := fmt.Sprintf("ScanResult =%s, ScanType=%s", m.ScanCodeInfo.ScanResult, m.ScanCodeInfo.ScanType) + kfSendTxt(openID, msg) + case "pic_photo_or_album": + msg := fmt.Sprintf("Count = %d ", m.SendPicsInfo.Count) + log.Println(m.SendPicsInfo.Count) + for _, v := range m.SendPicsInfo.PicList.Item { + log.Println(v.PicMd5Sum) + kfSendTxt(openID, v.PicMd5Sum) + } + kfSendTxt(openID, msg) + default: + str, _ = BuildTextMsg(openID, " unknown event:"+m.Event) + } + state.response = str + return +} + +func location2MediaID(lat, long float64) (mediaID string) { + 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) + file, _, _ := saveURL(url) + mediaID = uploadImage(file) + os.Remove(file) + return +} + +func location2URL(lat, long float64) (url string) { + url = fmt.Sprintf("http://maps.google.com/maps?z=12&t=m&q=loc:%f+%f", lat, long) + log.Println(url) + return +}