首页 > 编程语言 >客服系统机器人源码-微信专属个人助理可对接GPT

客服系统机器人源码-微信专属个人助理可对接GPT

时间:2023-07-04 23:57:39浏览次数:48  
标签:API err api 微信 msg 源码 GPT gin

我们大家都见过很多微信机器人,对接了GPT以后效果非常好,可以作为微信群里的助理,帮助我们回答各种问题

 

现在我来分享一下微信机器人的源码,该源码是golang开发,可以实现模拟个人微信桌面版登录,监听到微信的各种消息。

下面就是完整代码

package main

import (
    "fmt"
    "github.com/eatmoreapple/openwechat"
    "github.com/gin-gonic/gin"
    "github.com/joho/godotenv"
    "github.com/tidwall/gjson"
    "log"
    "net/http"
    "net/url"
    "os"
    "strings"
)

func main() {
    myUID := ""
    myNicname := ""
    // 读取环境变量
    err := godotenv.Load(".env")
    api := os.Getenv("API_BASE")
    entId := os.Getenv("API_ENT_ID")
    kefuName := os.Getenv("API_KEFU_NAME")
    replyType := os.Getenv("REPLY_TYPE")
    replyOn := os.Getenv("REPLY_ON")
    bot := openwechat.DefaultBot(openwechat.Desktop) // 桌面模式
    // 注册消息处理函数
    bot.MessageHandler = func(msg *openwechat.Message) {

        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 = Md5(sender.NickName)
                if err == nil {
                    log.Println("消息发送者:" + sender.NickName)
                }
                if strings.Contains(msg.Content, "@"+myNicname) && !strings.Contains(msg.Content, "结束") {
                    msg.Content = strings.TrimSpace(strings.ReplaceAll(msg.Content, "@"+myNicname, ""))
                    isSend = true
                } else {
                    isSend = false
                }
            } else {
                if err == nil {
                    log.Println("消息发送者:" + sender.NickName)
                }
                if replyType != "GROUP" && sender.NickName != myNicname {
                    senderId = sender.ID()
                    isSend = true
                }
            }
            if isSend && replyOn == "on" {
                data := url.Values{}
                data.Set("ent_id", entId)
                data.Set("visitor_id", senderId)
                data.Set("content", msg.Content)
                data.Set("nickname", sender.NickName)
                data.Set("kefu_name", kefuName)
                res, err := PostForm(api, data)
                if err == nil {
                    log.Println(res)
                    r := gjson.Get(res, "result.content").String()
                    if r == "" {
                        return
                    }
                    r = TrimHtml(r)
                    if msg.IsSendByGroup() {
                        r = fmt.Sprintf("@%s\u2005\u2005\u2005 %s", sender.NickName, r)
                    }
                    msg.ReplyText(r)
                }
            }

        }
    }
    // 注册登陆二维码回调
    bot.UUIDCallback = openwechat.PrintlnQrcodeUrl

    // 登陆
    reloadStorage := openwechat.NewFileHotReloadStorage("storage.json")
    defer reloadStorage.Close()
    err = bot.PushLogin(reloadStorage, openwechat.NewRetryLoginOption())
    if err != nil {
        fmt.Println(err)
        return
    }

    // 获取登陆的用户
    self, err := bot.GetCurrentUser()
    if err != nil {
        fmt.Println(err)
        return
    }
    myUID = self.ID()
    myNicname = self.NickName
    log.Printf("当前登录用户:%s,uid:%s \n", myNicname, myUID)
    // 获取所有的好友
    //friends, err := self.Friends()
    //fmt.Println(friends, err)
    // 创建 Gin 引擎
    router := gin.Default()
    //启用跨域中间件
    router.Use(func(c *gin.Context) {
        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "GET,POST,OPTIONS,DELETE,PUT")
        c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, Origin")
        if c.Request.Method == "OPTIONS" {
            c.AbortWithStatus(204)
            return
        }
        c.Next()
    })
    router.LoadHTMLGlob("templates/*")
    router.GET("/main", func(c *gin.Context) {
        c.HTML(http.StatusOK, "main.html", gin.H{})
    })
    //配置信息
    router.GET("/configs", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "code": 200,
            "result": gin.H{
                "api_base":      api,
                "api_kefu_name": kefuName,
                "api_ent_id":    entId,
                "reply_type":    replyType,
                "reply_on":      replyOn,
            },
        })
    })
    //修改配置
    router.POST("/saveConfigs", func(c *gin.Context) {
        api = c.PostForm("api_base")
        kefuName = c.PostForm("api_kefu_name")
        entId = c.PostForm("api_ent_id")
        replyType = c.PostForm("reply_type")
        replyOn = c.PostForm("reply_on")
        data := map[string]string{
            "API_BASE":      api,
            "API_KEFU_NAME": kefuName,
            "API_ENT_ID":    entId,
            "REPLY_TYPE":    replyType,
            "REPLY_ON":      replyOn,
        }
        err := WriteToEnvFile(data, ".env")
        if err != nil {
            log.Println(err)
        }
        c.JSON(200, gin.H{
            "code": 200,
        })
    })
    router.GET("/firends", func(c *gin.Context) {
        friends, _ := self.Friends()
        c.JSON(200, gin.H{
            "code":   200,
            "result": friends,
        })
    })
    router.POST("/sendMsg", func(c *gin.Context) {
        username := c.PostForm("username")
        content := c.PostForm("content")
        friends, _ := self.Friends()
        for _, f := range friends {
            if f.UserName == username {
                f.SendText(content)
                break
            }
        }
        c.JSON(200, gin.H{
            "code": 200,
        })
    })
    // 启动服务器
    go router.Run(":8084")
    // 获取所有的群组
    //groups, err := self.Groups()
    //fmt.Println(groups, err)
    Open("http://127.0.0.1:8084/main")
    // 阻塞主goroutine, 直到发生异常或者用户主动退出
    bot.Block()
}

利用一个第三方库实现模拟桌面版微信登录,并监听微信消息

读取了本地的.env配置文件,该配置文件里面是

API_BASE=https://gofly.v1kf.com/2/wechatRobotMessage
API_KEFU_NAME=taoshihan
API_ENT_ID=5
REPLY_TYPE=GROUP
REPLY_ON=on

该配置的详细解释可以查看运行后的配置页面

消息会回调给我自己的机器人接口,这个接口可以换成你们自己开发的,消息格式可以参考代码里回调接口部分

 

标签:API,err,api,微信,msg,源码,GPT,gin
From: https://www.cnblogs.com/taoshihan/p/17527402.html

相关文章

  • SpringBoot源码初学者(一):SpringBoot功能扩展接口的使用与源码分析
     在长期的源码学习中,我一直没有找到一个讲解SpringBoot源码的文章,适合刚开始阅读源码的新手,包括我之前的写的一些文章,说实话SpringBoot的源码的确不适合新手,跳转多、结构复杂混乱,很容易迷乱其中。长时间的学习当中,也总结出这些文章的部分问题:没有说明用法,直接讲解源码,其实很......
  • Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?
    Photobyhippopx.com我们知道HashMap的底层是由数组,链表,红黑树组成的,在HashMap做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算hash值,因为长度扩大以后,hash值也随之改变。如果是简单的Node对象,只需要重新计算下标放进去就可以了,如果是链表和红黑......
  • AI 实战篇 |基于 AI开放平台实现 人脸识别对比 功能,超详细教程【附带源码】
    ......
  • 【本周特惠课程】深度学习6大模型部署场景(Pytorch+NCNN+MNN+Tengine+TensorRT+微信小
    前言欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下:第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用。第2层:掌握CV算法最底层的能力,包括模型设计基础,图像分类,模型分析。第3层:掌握CV算法最核心的方向,包括图像分......
  • 校验 GPT-4 真实性的三个经典问题:快速区分 GPT-3.5 与 GPT-4
    现在已经有很多ChatGPT的套壳网站,以下分享验明GPT-4真身的三个经典问题,帮助你快速区分套壳网站背后到底用的是GPT-3.5还是GPT-4。大家可以在这个网站测试:https://ai.hxkj.vip,免登录可以问三条,登录之后无限制。咱们使用免登录的额度测试就已经够用了测试问题1:Whatist......
  • 微信小程序配置自动更新,微信小程序自动升级
    我们开发完小程序,发布新版本之后,用户如果想体验新版本,需要把小程序从使用列表删除,在重新搜索之后,再次打开,新的版本才会生效。但是, 随着我们更新次数的增加,这种方式就很不友好,用户体验下降,所以在开发中,我们就要考虑配置小程序自动更新。首先,我们需要了解下小程序的运行机制,小程序......
  • 2023最新ChatGPT网站源码/支持用户付费套餐+赚取收益
    第一步-配置APIKEY:在"index.php"最顶部配置自己的APIKEY,不然网站无法使用!第一步-配置数据库:lib/config.php第三步-导入数据库第四步-PHP选择:7.3第五步-访问网页即可!下载链接:https://pan.saipancloud.com/s/Ij6NFbKhdI解压密码:UUdlNGWEacOclJWP      ......
  • 全新ChatGPT3.5小程序开源后端+前端源码
    首发ChatGPT3.5小程序开源vue!这一版本ui比较好看回复速度也快了小程序是java的带后台本来准备给你们带上接口的然后么后台是和接口连接的我改什么内容你们前段都会显示所以开源自己搭建下吧,腾讯云买个国外服务器就可以了几十块钱!而且最近openkey封号比较频繁所以大家自己......
  • 直播源码开发,js 数据的创建时间是否大于30天或相隔天数
    直播源码开发,js数据的创建时间是否大于30天或相隔天数//获取当前时间varday=newDate();//数据库的数据创建时间vartime=creationTime;//把当前时间数据库时间转换成毫秒数varstarDate=Date.parse(time);varendDate=Date.parse(day);//当前时间毫秒数减去创建时间......
  • 直播平台搭建源码,multiple-select 单选框多选框的用法
    直播平台搭建源码,multiple-select单选框多选框的用法         <divclass="row">            <divclass="col-sm-11">              <divclass="input-group">            ......