跳到正文
裁晨的Blog

50行代码实现微信chatgpt接入

最近看到很多chatgpt接入微信的项目,遂自己简单实现一下,需要自己有 openai 的账号,以及生成 key...

技术 1 分钟阅读

最近看到很多 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