149 lines
3.5 KiB
Go
149 lines
3.5 KiB
Go
|
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)
|
|||
|
}
|