256 lines
7.3 KiB
Go
256 lines
7.3 KiB
Go
|
package routers
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/json"
|
|||
|
"errors"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
"github.com/tidwall/gjson"
|
|||
|
"log"
|
|||
|
"net/url"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
"wechathook/models"
|
|||
|
"wechathook/service"
|
|||
|
)
|
|||
|
|
|||
|
var currentWxid string
|
|||
|
var currentWxNickname string
|
|||
|
var contactList map[string]string
|
|||
|
|
|||
|
func init() {
|
|||
|
//当前微信信息
|
|||
|
wechatinfo := Wechat39825Info()
|
|||
|
currentWxid = gjson.Get(wechatinfo, "data.wxid").String()
|
|||
|
currentWxNickname = gjson.Get(wechatinfo, "data.name").String()
|
|||
|
contacts := gjson.Get(Wechat39825ContactList(), "data").Array()
|
|||
|
contactList = make(map[string]string, 0)
|
|||
|
for _, contact := range contacts {
|
|||
|
nickname := contact.Get("nickname").String()
|
|||
|
wxid := contact.Get("wxid").String()
|
|||
|
contactList[wxid] = nickname
|
|||
|
}
|
|||
|
}
|
|||
|
func Wechat39825(c *gin.Context) {
|
|||
|
// 声明一个map变量来存储JSON数据
|
|||
|
var jsonData map[string]interface{}
|
|||
|
// 解析JSON数据
|
|||
|
if err := c.BindJSON(&jsonData); err != nil {
|
|||
|
// 如果解析失败,返回错误信息
|
|||
|
c.JSON(400, gin.H{"error": err.Error()})
|
|||
|
return
|
|||
|
}
|
|||
|
// 将JSON数据转换为字符串
|
|||
|
jsonBytes, _ := json.Marshal(jsonData)
|
|||
|
jsonString := string(jsonBytes)
|
|||
|
|
|||
|
messageType := gjson.Get(jsonString, "type").Int()
|
|||
|
log.Println("收到数据:", jsonString)
|
|||
|
|
|||
|
//好友请求
|
|||
|
if messageType == 37 {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if messageType == 1 {
|
|||
|
|
|||
|
content := gjson.Get(jsonString, "content").String()
|
|||
|
//if messageType == 3 {
|
|||
|
// content, _ = BaiduOCR(gjson.Get(jsonString, "base64Img").String())
|
|||
|
//}
|
|||
|
|
|||
|
displayFullContent := gjson.Get(jsonString, "displayFullContent").String()
|
|||
|
fromUser := gjson.Get(jsonString, "fromUser").String()
|
|||
|
|
|||
|
if currentWxid == fromUser {
|
|||
|
return
|
|||
|
}
|
|||
|
//微信账号白名单
|
|||
|
wechatWhiteList := models.FindSetting("wechatWhiteList").Value
|
|||
|
reply := ""
|
|||
|
//群聊里@
|
|||
|
if strings.Contains(fromUser, "@chatroom") {
|
|||
|
if !strings.Contains(displayFullContent, "在群聊中@了") && !strings.Contains(wechatWhiteList, fromUser) {
|
|||
|
return
|
|||
|
}
|
|||
|
wxidContent := strings.Split(content, ":\n")
|
|||
|
wxid := wxidContent[0]
|
|||
|
content := strings.Trim(wxidContent[1], "\n")
|
|||
|
content = strings.Replace(content, "@"+currentWxNickname, "", -1)
|
|||
|
log.Println("解析数据:", fromUser, displayFullContent, wxid, content)
|
|||
|
|
|||
|
if models.FindSettingDefault("groupKeywordStatus", "yes") != "no" {
|
|||
|
reply = service.GetReplyFromLocal(content)
|
|||
|
}
|
|||
|
|
|||
|
if reply == "" && models.FindSettingDefault("groupAIStatus", "yes") != "no" {
|
|||
|
reply, _ = service.GetReplyByAPI(fromUser, contactList[fromUser], "", content)
|
|||
|
}
|
|||
|
if reply != "" {
|
|||
|
SendWechat39825AtMsg(wxid, fromUser, reply)
|
|||
|
images := service.ExtractMarkdownImagePaths(reply)
|
|||
|
if len(images) != 0 {
|
|||
|
filePath, _ := service.DownloadImageToDailyDir(images[0].Path, "./resource", images[0].Desc)
|
|||
|
if filePath != "" {
|
|||
|
SendWechat39825AtMsg(wxid, fromUser, service.GetRootPath()+"\\"+filePath)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
//私聊
|
|||
|
//if wechatWhiteList != "" && !strings.Contains(wechatWhiteList, fromUser) {
|
|||
|
// return
|
|||
|
//}
|
|||
|
if models.FindSettingDefault("personKeywordStatus", "yes") != "no" {
|
|||
|
reply = service.GetReplyFromLocal(content)
|
|||
|
}
|
|||
|
if reply == "" && models.FindSettingDefault("personAIStatus", "yes") != "no" {
|
|||
|
reply, _ = service.GetReplyByAPI(fromUser, contactList[fromUser], "", content)
|
|||
|
}
|
|||
|
if reply != "" {
|
|||
|
SendWechat39825Msg(fromUser, reply)
|
|||
|
images := service.ExtractMarkdownImagePaths(reply)
|
|||
|
if len(images) != 0 {
|
|||
|
filePath, _ := service.DownloadImageToDailyDir(images[0].Path, "./resource", images[0].Desc)
|
|||
|
if filePath != "" {
|
|||
|
SendWechat39825Msg(fromUser, service.GetRootPath()+"\\"+filePath)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
c.JSON(200, gin.H{
|
|||
|
"message": "pong",
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// 发送微信消息
|
|||
|
func SendWechat39825AtMsg(wxids, chatRoomId, msg string) (string, error) {
|
|||
|
if msg == "" {
|
|||
|
return "", errors.New("回复内容为空!")
|
|||
|
}
|
|||
|
if service.IsWindowsPath(msg) {
|
|||
|
SendWechat39825File(chatRoomId, msg)
|
|||
|
return "", nil
|
|||
|
}
|
|||
|
sleepTime, _ := service.GetRandomValue(models.FindSettingDefault("delayTime", "0"))
|
|||
|
time.Sleep(time.Duration(sleepTime) * time.Second)
|
|||
|
url := "http://127.0.0.1:19088/api/sendAtText"
|
|||
|
data := map[string]interface{}{
|
|||
|
"wxids": wxids,
|
|||
|
"chatRoomId": chatRoomId,
|
|||
|
"msg": msg,
|
|||
|
}
|
|||
|
respBytes, err := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("发送信息:", respString, msg)
|
|||
|
if err != nil {
|
|||
|
return "", err
|
|||
|
}
|
|||
|
return respString, nil
|
|||
|
}
|
|||
|
|
|||
|
// 发送微信消息
|
|||
|
func SendWechat39825Msg(wxid, msg string) (string, error) {
|
|||
|
if msg == "" {
|
|||
|
return "", errors.New("回复内容为空!")
|
|||
|
}
|
|||
|
if service.IsWindowsPath(msg) {
|
|||
|
SendWechat39825File(wxid, msg)
|
|||
|
return "", nil
|
|||
|
}
|
|||
|
sleepTime, _ := service.GetRandomValue(models.FindSettingDefault("delayTime", "0"))
|
|||
|
time.Sleep(time.Duration(sleepTime) * time.Second)
|
|||
|
url := "http://127.0.0.1:19088/api/sendTextMsg"
|
|||
|
data := map[string]interface{}{
|
|||
|
"wxid": wxid,
|
|||
|
"msg": msg,
|
|||
|
}
|
|||
|
respBytes, err := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("发送信息:", respString, msg)
|
|||
|
if err != nil {
|
|||
|
return "", err
|
|||
|
}
|
|||
|
return respString, nil
|
|||
|
}
|
|||
|
|
|||
|
// 发送微信文件
|
|||
|
func SendWechat39825File(wxid, filePath string) (string, error) {
|
|||
|
if filePath == "" {
|
|||
|
return "", errors.New("回复内容为空!")
|
|||
|
}
|
|||
|
sleepTime, _ := service.GetRandomValue(models.FindSettingDefault("delayTime", "0"))
|
|||
|
time.Sleep(time.Duration(sleepTime) * time.Second)
|
|||
|
|
|||
|
url := "http://127.0.0.1:19088/api/sendFileMsg"
|
|||
|
data := map[string]interface{}{
|
|||
|
"wxid": wxid,
|
|||
|
"filePath": filePath,
|
|||
|
}
|
|||
|
if service.IsImagePath(filePath) {
|
|||
|
url = "http://127.0.0.1:19088/api/sendImagesMsg"
|
|||
|
data = map[string]interface{}{
|
|||
|
"wxid": wxid,
|
|||
|
"imagePath": filePath,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
respBytes, err := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("发送信息:", respString, filePath)
|
|||
|
if err != nil {
|
|||
|
return "", err
|
|||
|
}
|
|||
|
return respString, nil
|
|||
|
}
|
|||
|
func Wechat39825Info() string {
|
|||
|
url := "http://127.0.0.1:19088/api/userInfo"
|
|||
|
data := map[string]interface{}{}
|
|||
|
respBytes, _ := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("当前微信信息:", respString)
|
|||
|
return respString
|
|||
|
}
|
|||
|
func Wechat39825ContactList() string {
|
|||
|
url := "http://127.0.0.1:19088/api/getContactList"
|
|||
|
data := map[string]interface{}{}
|
|||
|
respBytes, _ := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("当前微信联系人:", respString)
|
|||
|
return respString
|
|||
|
}
|
|||
|
func Wechat39825Hook(c *gin.Context) {
|
|||
|
url := "http://127.0.0.1:19088/api/hookSyncMsg"
|
|||
|
data := map[string]interface{}{
|
|||
|
"port": "19099",
|
|||
|
"ip": "127.0.0.1",
|
|||
|
"url": "http://localhost:8089/wechat39825",
|
|||
|
"timeout": "3000",
|
|||
|
"enableHttp": true,
|
|||
|
}
|
|||
|
respBytes, _ := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("发送Hook信息:", respString)
|
|||
|
c.Writer.Write(respBytes)
|
|||
|
}
|
|||
|
func Wechat39825Contacts(c *gin.Context) {
|
|||
|
resp := Wechat39825ContactList()
|
|||
|
c.Writer.Write([]byte(resp))
|
|||
|
}
|
|||
|
func Wechat39825Remark(c *gin.Context) {
|
|||
|
url := "http://127.0.0.1:19088/api/getDBInfo"
|
|||
|
data := map[string]interface{}{}
|
|||
|
respBytes, _ := service.PostJSON(url, data)
|
|||
|
respString := string(respBytes)
|
|||
|
log.Println("当前微信数据库信息:", respString)
|
|||
|
}
|
|||
|
func BaiduOCR(imgbase64 string) (string, error) {
|
|||
|
b := service.BaiduOCR{
|
|||
|
API_KEY: "NrtkiynNnqkQOwm6isip58gS",
|
|||
|
SECRET_KEY: "CO9594vqWsXVdhQEfXSNlDeHu5Jk7lWE",
|
|||
|
}
|
|||
|
r, err := b.OCR(url.QueryEscape(imgbase64))
|
|||
|
log.Println(r, err)
|
|||
|
return r, err
|
|||
|
}
|