前言
VoceChat
是一款支持独立部署的个人云社交媒体聊天服务。15MB 的大小可部署在任何的服务器上,部署简单,很少需要维护。还可以内嵌到网站中,数据由自己掌握,比较安全。
技术选型:vocechat,智普ai,docker一键部署,便捷食用。项目效果如下:点击查看
一、搭建聊天室
使用docker一键部署,浏览器访问http://服务器ip:3009/
,介绍一下docker命令行,Docker 中启动一个名为"vocechat-server"的容器,它将容器内部的端口3000映射到主机的端口3009,并且在容器退出时自动重新启动。
docker run -d --restart=always \
-p 3009:3000 \
--name vocechat-server \
privoce/vocechat-server:latest
二、接入机器人与Webhook
机器人可以将消息发送到Vocechat,机器人可以配置Webhook;
Webhook可以监听Vocechat推送所有该机器人相关的消息数据,可以在这里调用智普API,实现智能对话
import express from "express";
import axios from "axios";
const app = express()
const port = process.env.PORT || 4080
import dotenv from 'dotenv-safe'
dotenv.config({
allowEmptyValues: true
})
app.use(express.json()) // 把消息体解析为json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
// 通过测试
app.get('/demo', async (req, res) => {
res.status(200).send({ msg: 'scuccess' })
})
app.post('/demo', async (req, res) => {
// 先发送一个200,表示收到了,避免后端再次发送
res.status(200).send({ msg: 'scuccess' })
let { from_uid: fromUid, created_at: createdAt, detail: { content, properties: { content_type: contentDetailType, mentions, name }, content_type: contentType, }, mid, target } = req.body;
// 发送消息
await sendMessage(fromUid, `get your message`)
// 指定关键词
if (content === 'ping') {
await sendMessage(fromUid, `pong`)
}
})
// 请自行模块化
async function sendMessage(fromUid, message) {
const endpoint = `${process.env.BASE_URL}/api/bot/send_to_user/${fromUid}`
const apiKey = process.env.BOT_API_KEY
const response = await axios.post(endpoint, `${message}`, {
headers: {
"Content-Type": "text/markdown",
"x-api-key": apiKey,
"accept": 'application/json; charset=utf-8',
},
})
// 返回消息id,当前无用
return response.data
}
async function getZhiPuRes(msg) {
const endpoint = `https://open.bigmodel.cn/api/paas/v4/chat/completions`
const apiKey = '切换key'
const params = {
"model": "glm-4",
"messages": [
{
"role": "user",
"content": msg
}
]
}
const response = await axios.post(endpoint, JSON.stringify(params), {
headers: {
"Content-Type": "application/json",
"Authorization": apiKey,
},
})
return response.data.choices.map(item => item.message.content).join("")
}
app.listen(port, () => {
console.log(`service working on port ${port}`)
})
三、问题
- node服务部署到服务器无法访问:因为linx系统搭建了宝塔面板,需要在安全->添加端口规则。在阿里云中防火墙添加是没办法直接生效的
四、后续改进
- 支持发送图片,文件
- 接入语音聊天