skip to content
Logo 裁晨

50行代码实现微信chatgpt接入

/ 3 min read

Table of Contents

前言

最近看到很多 chatgpt 接入微信的项目,遂自己简单实现一下

阅读须知

  • node:v16.14.2
  • pnpm 8.2.0
  • typescript ^5.0.4
  • 需要自己有 openai 的账号,以及生成 key

效果图

bc00a55444eb9e6a56e825b07beaafe.jpg

项目搭建

  1. 使用npm init初始化项目
  2. 安装
Terminal window
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: http://wechaty.js.org/docs/ openai:https://beta.openai.com/account/api-keys