我把chatGpt接入了微信群聊
先看效果:
準備工作
下面讓我們開始完成這個機器人接入:
所需資源:
- 可愛貓機器人
- openApi金鑰
- 一個微信小號
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":"[email protected]",//群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後,我們就能獲得網址:
然後我們把這個網址填入到外掛的地方
這樣就大功告成啦!!!趕快動手試試吧,讓你的群也充滿歡聲笑語!