我把chatGpt接入了微信群聊

lxf2023-03-19 07:23:01

先看效果:

我把chatGpt接入了微信群聊

准备工作

下面让我们开始完成这个机器人接入:

所需资源:

  1. 可爱猫机器人
  2. openApi密钥
  3. 一个微信小号

openApi密钥获取

注册流程:www.v2ex.com/t/900126?p=…

上面讲的很清楚啦,按照步骤就行

有账号之后去这里获取api key:

beta.openai.com/account/api…

我把chatGpt接入了微信群聊

这样就获取到了调用chatGpt所需要的机器人

可爱猫资源下载:

www.123pan.com/s/Tio9-tCzv…提取码:juej

这里我们通过其中的ihttp插件进行开发

我把chatGpt接入了微信群聊

开发文档:doc.vwzx.com/web/#/6?pag…

下载好后,安装微信,并打开可爱猫

我把chatGpt接入了微信群聊

然后登录微信

我把chatGpt接入了微信群聊

到此准备工作就暂时完成啦,下面开始让我们用node写一个服务,供机器人调用

开发node服务

这里我才用的是express开发

首先新建server.js,并定义一个接口

let express = require('express');
let app = express();
app.post('/api/list', async function (req, res) {
  //这里写接口处理逻辑
}
/**
* 监听8090端口
*/
app.listen('8090');

下面开始在接口里面写我们的处理逻辑:

这里讲一下插件原理:插件会把接受到的消息用json字符串的形式传递给我们,我们要做的就是根据json字符串返回的信息,返回对应的json代表的事件。

我把chatGpt接入了微信群聊

我把chatGpt接入了微信群聊

具体请看作者定义的开发文档:

doc.vwzx.com/web/#/6?pag…

接下来我们写处理逻辑:

因为我们从app.post里的req拿到的是chunk参数流,不是json消息,所以我这里定义了一个函数处理

function parseBodyData(req){
    return new Promise((resolve,reject)=>{
        if (req.body?.data) {
            //能正确解析 json 格式的post参数
            resolve(bodyData)
        } else{
            var body = '', jsonStr;
            req.on('data', function (chunk) {
                body += chunk; //读取参数流转化为字符串
            });
            req.on('end', function () {
                //读取参数流结束后将转化的body字符串解析成 JSON 格式
                try {
                    jsonStr = JSON.parse(body);
                } catch (err) {
                    jsonStr = null;
                }
                resolve(jsonStr);
                // jsonStr ? res.send({"status":"success", "name": jsonStr.data.name, "age": jsonStr.data.age}) : res.send({"status":"error"});
            });
        }
    })

}
module.exports = {
    parseBodyData
}

这样我们就能获得json字符串了

{
    "event":"EventGroupMsg",//事件标示(当前值为群消息事件)
    "robot_wxid":"wxid_5hxa04j4z6pg22",//机器人wxid
    "robot_name":"",//机器人昵称,一般为空
    "type":1,//1/文本消息 3/图片消息 34/语音消息  42/名片消息  43/视频 47/动态表情 48/地理位置  49/分享链接  2000/转账 2001/红包  2002/小程序  2003/群邀请
    "from_wxid":"18900134932@chatroom",//群id,群消息事件才有
    "from_name":"微群测",//群名字
    "final_from_wxid":"sundreamer",//发该消息的用户微信id
    "final_from_name":"遗忘悠剑o",//微信昵称
    "to_wxid":"wxid_5hxa04j4z6pg22",//接收消息的人id,(一般是机器人收到了,也有可能是机器人发出的消息,别人收到了,那就是别人)
    "msg":"图片https://b3logfile.com/bing/20201024.jpg",//消息内容(string/array) 使用时候根据不同的事件标示来定义这个值,字符串类型或者数据类型
    "money":0.01 //金额,只有"EventReceivedTransfer"事件才有该参数
}

接下来我们在接口逻辑里调用这个函数

let { parseBodyData } = require('./utils.js');
let { getOpenAiReply } = require('./openai/index.js')
let express = require('express');
let app = express();
app.post('/api/list', async function (req, res) {
  //正确解析json 格式的post参数
    let data = await parseBodyData(req)
  let reg = /wxid=(.*)]/g
  reg.test(data.msg)
  let callSomeoneId = RegExp.$1  //获取当前发送消息人的wxID
  //要@机器人才聊天
	if (data?.msg?.indexOf('@at') > -1 && callSomeoneId == data.robot_wxid) { 
            const newMsg = data.msg.substr(data.msg.lastIndexOf('  ')).trim()
            let robotAnswer = await getOpenAiReply(newMsg) //调用chatGpt获取回复
            console.log(robotAnswer, 'robotAnswer')
            return res.json(
                {
                    "success": true,//true时,http-sdk才处理,false直接丢弃
                    "message": "successful!",
                    "event": "SendGroupMsgAndAt",//告诉它干什么,SendImageMsg是发送图片事件
                    "robot_wxid": data.robot_wxid,//用哪个机器人发
                    "to_wxid": '',//发到哪里?群/好友
                    "member_wxid": data.final_from_wxid,
                    "member_name": data.final_from_name,
                    "group_wxid": data.from_wxid,
                    "msg": robotAnswer,//发送的内容
                }
            )
        }
   
  
}
/**
* 监听8090端口
*/
app.listen('8090');

这里我定义了个getOpenAiReply函数,获取chatGpt的回答,代码如下

import remark from 'remark'
import stripMarkdown from 'strip-markdown'
import { Configuration, OpenAIApi } from 'openai'
import  dotenv from 'dotenv'
const env = dotenv.config().parsed // 环境参数
console.log(env,'envenvenv');
const configuration = new Configuration({
  apiKey: env.OPENAI_API_KEY,
})
 const openai = new OpenAIApi(configuration)

 async function getOpenAiReply(prompt) {
  console.log('