kefu/wechatbot/main.go

149 lines
3.5 KiB
Go
Raw Normal View History

2024-12-10 02:50:12 +00:00
package main
import (
"fmt"
"github.com/eatmoreapple/openwechat"
"github.com/joho/godotenv"
"github.com/skip2/go-qrcode"
"github.com/tidwall/gjson"
"github.com/zh-five/xdaemon"
"golangWechat/lib"
"io/ioutil"
"log"
"os"
"strings"
)
var (
UID string
Nickname string
ApiBase string
ApiKey string
ApiModel string
ReplyType string
ReplyOn string
ReplyKeyword string
)
func main() {
// 获取所有的命令行参数
args := os.Args
if len(args) > 1 && args[1] == "-d" {
initDaemon()
}
bot := openwechat.DefaultBot(openwechat.Desktop) // 桌面模式
// 注册登陆二维码回调
bot.UUIDCallback = ConsoleQrCode
// 注册消息处理函数
bot.MessageHandler = MessageHandler
// 登陆
reloadStorage := openwechat.NewFileHotReloadStorage("storage.json")
defer reloadStorage.Close()
err := bot.HotLogin(reloadStorage, openwechat.NewRetryLoginOption())
if err != nil {
log.Println(err)
return
}
// 获取登陆的用户
self, err := bot.GetCurrentUser()
if err != nil {
log.Println(err)
return
}
UID = self.ID()
Nickname = self.NickName
log.Println("当前登录用户:", UID, Nickname, self)
// 阻塞主goroutine, 直到发生异常或者用户主动退出
bot.Block()
}
func ConsoleQrCode(uuid string) {
fmt.Println("打开个人微信扫描下面的二维码")
q, _ := qrcode.New("https://login.weixin.qq.com/l/"+uuid, qrcode.Medium)
fmt.Println(q.ToString(false))
}
func MessageHandler(msg *openwechat.Message) {
initEnv()
if msg.IsText() {
log.Printf("收到消息:%s\n", msg.Content)
if msg.Content == "" {
return
}
isSend := false
//单聊
sender, err := msg.Sender()
senderId := ""
//群聊
if msg.IsSendByGroup() {
sender, err = msg.SenderInGroup()
senderId = lib.Md5(sender.NickName)
if err == nil {
log.Println("消息发送者:" + sender.NickName)
}
if strings.Contains(msg.Content, "@"+Nickname) || lib.ContainsAny(msg.Content, strings.Split(ReplyKeyword, "|")) {
msg.Content = strings.TrimSpace(strings.ReplaceAll(msg.Content, "@"+Nickname, ""))
isSend = true
} else {
isSend = false
}
} else {
if err == nil {
log.Println("消息发送者:" + sender.NickName)
}
if ReplyType != "GROUP" && sender.NickName != Nickname {
senderId = sender.ID()
isSend = true
}
}
if isSend && ReplyOn == "on" && msg.Content != "" {
replyContent, err := lib.AskGPT(ApiBase, ApiKey, ApiModel, senderId, msg.Content)
//data := url.Values{}
//data.Set("visitor_id", senderId)
//data.Set("content", msg.Content)
//data.Set("visitor_name", sender.NickName)
//res, err := lib.PostForm(Api, data)
if replyContent != "" && err == nil {
log.Println(replyContent)
r := gjson.Get(replyContent, "choices.0.message.content").String()
r = lib.TrimHtml(r)
r = strings.TrimSpace(r)
if r == "" {
return
}
if msg.IsSendByGroup() {
r = fmt.Sprintf("@%s %s", sender.NickName, r)
}
msg.ReplyText(r)
}
}
}
}
// 初始化环境变量
func initEnv() error {
// 读取环境变量
err := godotenv.Load(".env")
ApiBase = os.Getenv("API_BASE")
ApiKey = os.Getenv("API_KEY")
ApiModel = os.Getenv("API_MODEL")
ReplyType = os.Getenv("REPLY_TYPE")
ReplyOn = os.Getenv("REPLY_ON")
ReplyKeyword = os.Getenv("REPLY_KEYWORD")
return err
}
// 初始化守护进程
func initDaemon() {
d := xdaemon.NewDaemon("bot.log")
d.MaxError = 5
d.Run()
//记录pid
ioutil.WriteFile("bot.sock", []byte(fmt.Sprintf("%d %d", os.Getppid(), os.Getpid())), 0666)
}