前言
最近看到很多chatgpt接入微信的项目,遂自己简单实现一下
阅读须知
- node:v16.14.2
- pnpm 8.2.0
- typescript ^5.0.4
- 需要自己有openai的账号,以及生成key
效果图
项目搭建
- 使用
npm init
初始化项目 - 安装
pnpm i ts-node-dev
pnpm i wechaty
pnpm i wechaty-puppet-wechat
pnpm i qrcode-terminal
pnpm i axios
pnpm i https-proxy-agent
wechaty是一个开源的的对话机器人SDK,使用wechaty-puppet-wechat
使用uos协议实现微信登录
qrcode-terminal实现登录时在命令行生成二维码
axios发送请求
https-proxy-agent实现axios代理,openai需要代理才能访问 3. 代码实现 创建main.ts文件,并导入
import { WechatyBuilder } from "wechaty";
import Axios from "axios";
import HttpsProxyAgent from "https-proxy-agent";
import qrcodeTerminal from "qrcode-terminal";
初始化wechaty
const wechaty = WechatyBuilder.build({
name: "wechat-bot",
puppetOptions: { uos: true },
puppet: "wechaty-puppet-wechat",
});
实现登录以及消息监听方法
wechaty
.on("scan", (qrcode, status) => {
//创建二维码,扫码登录
qrcodeTerminal.generate(qrcode, { small: true });
})
.on("login", (user) => console.log(`User ${user} logged in`))
.on("error", (error) => console.log(error))
.on('message', message => console.log(`Message: ${message}`))
});
//启动
wechaty.start();
实现axios代理,以及请求openai方法
官方有提供openai包以方便node Api调用
const httpsAgent = HttpsProxyAgent(`http://127.0.0.1:33210`);
const axios = Axios.create({
proxy: false,
httpsAgent,
});
async function chatApi(message: string): Promise<string> {
const result = await axios.post(
"https://api.openai.com/v1/chat/completions",
{
model: "gpt-3.5-turbo",
messages: [{ role: "system", content: message }],
},
{
headers: {
Authorization:
"Bearer xxxxxxxx",
},
}
);
console.log(result.data.choices[0].message);
return result.data.choices[0].message.content;
}
在message监听中获取好友消息并实现请求调用,并返回ai的回复
wechaty
.on("message", async (message) => {
//判断一下不是自己发的消息才进行
if (message.self()) {
console.log("this message is sent by myself!");
} else {
//判断消息类型
if (message.type() === wechaty.Message.Type.Text) {
const txt = await chatApi(message.text());
//回复消息
message.say(txt);
}
}
});
wechaty.start();
4.全部代码
import { WechatyBuilder } from "wechaty";
import Axios from "axios";
import HttpsProxyAgent from "https-proxy-agent";
import qrcodeTerminal from "qrcode-terminal";
const wechaty = WechatyBuilder.build({
name: "wechat-bot",
puppetOptions: { uos: true },
puppet: "wechaty-puppet-wechat",
});
wechaty
.on("scan", (qrcode, status) => {
qrcodeTerminal.generate(qrcode, { small: true });
})
.on("login", (user) => console.log(`User ${user} logged in`))
.on("error", (error) => console.log(error))
.on("message", async (message) => {
// const contact = message.talker();
// const name = contact.name();
if (message.self()) {
console.log("this message is sent by myself!");
} else {
if (message.type() === wechaty.Message.Type.Text) {
const txt = await chatApi(message.text());
message.say(txt);
}
}
});
wechaty.start();
const httpsAgent = HttpsProxyAgent(`http://127.0.0.1:33210`);
const axios = Axios.create({
proxy: false,
httpsAgent,
});
async function chatApi(message: string): Promise<string> {
const result = await axios.post(
"https://api.openai.com/v1/chat/completions",
{
model: "gpt-3.5-turbo",
messages: [{ role: "system", content: message }],
},
{
headers: {
Authorization:
"Bearer xxxxxxxxxxx",
},
}
);
console.log(result.data.choices[0].message);
return result.data.choices[0].message.content;
}
参考文档
wechaty: wechaty.js.org/docs/ openai:beta.openai.com/account/api…