50行代码实现微信chatgpt接入

2,379 阅读2分钟

前言

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

阅读须知

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

效果图

bc00a55444eb9e6a56e825b07beaafe.jpg

项目搭建

  1. 使用npm init初始化项目
  2. 安装
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…