先看效果:
准备工作
下面让我们开始完成这个机器人接入:
所需资源:
- 可爱猫机器人
- openApi密钥
- 一个微信小号
openApi密钥获取
注册流程:www.v2ex.com/t/900126?p=…
上面讲的很清楚啦,按照步骤就行
有账号之后去这里获取api key:
beta.openai.com/account/api…
这样就获取到了调用chatGpt所需要的机器人
可爱猫资源下载:
www.123pan.com/s/Tio9-tCzv…提取码:juej
这里我们通过其中的ihttp插件进行开发
开发文档:doc.vwzx.com/web/#/6?pag…
下载好后,安装微信,并打开可爱猫
然后登录微信
到此准备工作就暂时完成啦,下面开始让我们用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代表的事件。
具体请看作者定义的开发文档:
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('