我把chatGpt接入了微信群聊

先看效果:

聊天.gif

准备工作

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

所需资源:

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

openApi密钥获取

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

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

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

https://beta.openai.com/account/api-keys

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

可爱猫资源下载:

https://www.123pan.com/s/Tio9-tCzv3提取码:juej

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

开发文档:https://doc.vwzx.com/web/#/6?page_id=123

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

然后登录微信

到此准备工作就暂时完成啦,下面开始让我们用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代表的事件。

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

https://doc.vwzx.com/web/#/6?page_id=123

接下来我们写处理逻辑:

因为我们从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('🚀🚀🚀 / prompt', prompt)
  const response = await openai.createCompletion({
    model: 'text-davinci-003',
    prompt: prompt,
    temperature: 0.9, // 每次返回的答案的相似度0-1(0:每次都一样,1:每次都不一样)
    max_tokens: 4000,
    top_p: 1,
    frequency_penalty: 0.0,
    presence_penalty: 0.6,
    stop: [' Human:', ' AI:'],
  })

  const reply = markdownToText(response.data.choices[0].text)
  console.log('🚀🚀🚀 / reply', reply)
  return reply
}

function markdownToText(markdown) {
  return remark()
    .use(stripMarkdown)
    .processSync(markdown ?? '')
    .toString()
}
module.exports={
  getOpenAiReply
}

这里参考的是这个git项目:https://github.com/wangrongding/wechat-bot?utm_source=gold_browser_extension

可以看作者的readme去理解

上面就实现了整个机器人调用chatgpt的过程,接下来让我们把这个服务接入

接入到微信机器人

由于我是本地起到服务,所以我用了一个内网传透代理,代理到本地我们的服务端口8090

我用的是natapp,具体使用可以百度一下 natapp内网传透,我这里找了个教程:https://www.pudn.com/news/628bb32a16e0ca71414723be.html

启动natapp后,我们就能获得网址:

然后我们把这个网址填入到插件的地方

这样就大功告成啦!!!赶快动手试试吧,让你的群也充满欢声笑语!

项目代码:

https://github.com/webfamer/wx-chatgpt

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容