|
|
package handle
|
|
|
|
|
|
import (
|
|
|
"WechatGateWay/api"
|
|
|
"WechatGateWay/global"
|
|
|
"WechatGateWay/third_part"
|
|
|
"WechatGateWay/utils"
|
|
|
"encoding/xml"
|
|
|
"fmt"
|
|
|
"log"
|
|
|
"net/http"
|
|
|
)
|
|
|
|
|
|
// cmdExec 根据白名单命令来执行
|
|
|
func cmdExec(msgContent MsgContent, timestamp, nonce string, w http.ResponseWriter) (replyContent string) {
|
|
|
var cmdString string
|
|
|
switch msgContent.Content {
|
|
|
case "last":
|
|
|
cmdString = global.HistoryCmds[len(global.HistoryCmds)-1]
|
|
|
case "history":
|
|
|
cmdString = utils.SlicePrint(global.HistoryCmds)
|
|
|
case "删除图片":
|
|
|
//通过文本消息删除上一张图片
|
|
|
lastImg := GetLastWechatLog(msgContent.FromUsername, "image")
|
|
|
err := utils.DeleteFile(lastImg.Content)
|
|
|
if err != nil {
|
|
|
log.Println("删除图片失败: ", lastImg.Content)
|
|
|
return
|
|
|
} else {
|
|
|
log.Println("图片已删除: ", lastImg.Content)
|
|
|
return
|
|
|
}
|
|
|
case "删除文本":
|
|
|
//通过文本消息删除上一条文本消息
|
|
|
lastText := GetLastWechatLog(msgContent.FromUsername, "text")
|
|
|
textMd5 := utils.Md5String(lastText.Content)
|
|
|
go RecordWechatBlockWords(lastText.Content, textMd5, msgContent.FromUsername)
|
|
|
return
|
|
|
case "虚拟货币", "ETH", "eth", "BTC", "btc", "trx", "TRX", "BNB", "bnb":
|
|
|
priceBTC := api.GetBinanceLatestPrice("BTCUSDT")
|
|
|
priceETH := api.GetBinanceLatestPrice("ETHUSDT")
|
|
|
priceTRX := api.GetBinanceLatestPrice("TRXUSDT")
|
|
|
priceBNB := api.GetBinanceLatestPrice("BNBUSDT")
|
|
|
replyContent = fmt.Sprintf("BTC价格: %f \nETH价格: %f \nTRX价格: %f \nBNB价格: %f", priceBTC, priceETH, priceTRX, priceBNB)
|
|
|
replyImageDraw(msgContent, timestamp, nonce, w, "BTCUSDT")
|
|
|
replyImageDraw(msgContent, timestamp, nonce, w, "ETHUSDT")
|
|
|
replyImageDraw(msgContent, timestamp, nonce, w, "TRXUSDT")
|
|
|
replyImageDraw(msgContent, timestamp, nonce, w, "BNBUSDT")
|
|
|
return
|
|
|
|
|
|
case "gold", "黄金":
|
|
|
goldPrice := api.GetCMBGoldLatestPrice("AU100G")
|
|
|
replyContent = fmt.Sprintf("黄金价格: %f", goldPrice)
|
|
|
return
|
|
|
case "ip", "百度统计":
|
|
|
todayPvCount, todayVisitorCount, todayIpCount := api.GetLatestBaiduReportInfo("sre.ink")
|
|
|
replyContent = fmt.Sprintf("今日百度统计: PV %d, VC %d IP %d", todayPvCount, todayVisitorCount, todayIpCount)
|
|
|
return
|
|
|
default:
|
|
|
cmdString = msgContent.Content
|
|
|
}
|
|
|
global.HistoryCmds = append(global.HistoryCmds, msgContent.Content)
|
|
|
replyContent, err := utils.CMDShellTrick(cmdString)
|
|
|
if err != nil {
|
|
|
replyContent = "/:,@!执行失败:\n" + msgContent.Content
|
|
|
} else {
|
|
|
replyContent = "/::D执行成功:\n" + replyContent
|
|
|
//aiAnswer = "执行命令:" + msgContent.Content
|
|
|
}
|
|
|
|
|
|
return
|
|
|
}
|
|
|
func aiReply(msgContent MsgContent) (replyContent string) {
|
|
|
var replyContentAi string
|
|
|
if _, ok := global.EmojMap[msgContent.Content]; ok {
|
|
|
//系统表情消息 取字典意思丢ai回复
|
|
|
replyContentAi = third_part.AiChat(global.EmojMap[msgContent.Content])
|
|
|
} else {
|
|
|
//普通文本消息直接丢ai
|
|
|
replyContentAi = third_part.AiChat(msgContent.Content)
|
|
|
}
|
|
|
//对ai结果 有表情包的上表情包
|
|
|
if emoj, ok := utils.MapKey(global.EmojMap, replyContentAi); ok {
|
|
|
replyContent = emoj + replyContentAi
|
|
|
} else {
|
|
|
replyContent = replyContentAi
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
func replyText(msgContent MsgContent, timestamp, nonce string, w http.ResponseWriter) {
|
|
|
var replyContent string
|
|
|
if global.EnableCmdExec && utils.SliceContain(global.CMDList, msgContent.Content) && msgContent.FromUsername == "QiaoYang" {
|
|
|
//开启了命令执行功能,并且消息内容包含了命令
|
|
|
log.Println("收到命令消息")
|
|
|
replyContent = cmdExec(msgContent, timestamp, nonce, w)
|
|
|
} else {
|
|
|
log.Println("ai msg")
|
|
|
replyContent = aiReply(msgContent)
|
|
|
}
|
|
|
|
|
|
//文本消息审核
|
|
|
if WordsBlocked(utils.Md5String(replyContent)) {
|
|
|
replyContent = "***(过于文明,无法显示)"
|
|
|
}
|
|
|
|
|
|
//构造回复消息
|
|
|
replyMsg, _ := xml.Marshal(ReplyTextMsg{
|
|
|
ToUsername: msgContent.FromUsername,
|
|
|
FromUsername: msgContent.ToUsername,
|
|
|
CreateTime: msgContent.CreateTime,
|
|
|
MsgType: "text",
|
|
|
Content: replyContent,
|
|
|
})
|
|
|
encryptMsg, cryptErr := global.WxCrypt.EncryptMsg(string(replyMsg), timestamp, nonce)
|
|
|
if cryptErr != nil {
|
|
|
log.Println("回复加密出错", cryptErr)
|
|
|
return
|
|
|
} else {
|
|
|
log.Println(string(encryptMsg))
|
|
|
l, err := w.Write(encryptMsg)
|
|
|
if err != nil {
|
|
|
log.Println("返回消息失败")
|
|
|
return
|
|
|
} else {
|
|
|
go RecordWechatLog(msgContent.FromUsername, msgContent.ToUsername, msgContent.CreateTime, msgContent.MsgType, replyContent)
|
|
|
log.Println("成功写入", l)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|