我把chatGpt接入了微信群聊

語言: CN / TW / HK

先看效果:

聊天.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":"[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後,我們就能獲得網址:

然後我們把這個網址填入到外掛的地方

這樣就大功告成啦!!!趕快動手試試吧,讓你的群也充滿歡聲笑語!

專案程式碼:

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