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) }