居然只用20多行代码就可以实现微信聊天机器人

用了一年多 chatGPT 和白嫖了 vscode 的 copilot,现在感觉已经离不开了,所以也想把这么好用的东西推荐给自己的家人和朋友。但是由于网络的限制,想让他们体验到聊天机器人的神奇是很困难的。当然现在百度阿里等巨头都已经发布了他们的产品,但需要下载相应的app,还要登录等一些列操作,稍微繁琐一点都会让他们失去兴趣。所以我打算开发一个微信聊天机器人,他们只需要加微信好友即可体验到。

在编写代码前,先要对以下几个东西做一些了解,简单且好用。

GPT API

在国内访问 chatGPT 是比较麻烦的,搞不好还容易封号。所以这里我推荐一下国内可用的一个接口,GPT-API-free,看名字就知道这是个免费的,虽然免费,但是有调用频率的限制,60请求/小时/IP&Key,可以通过 github 领取。理论上自己用的话免费的就可以,如果想调用 GPT4,每天也可以使用3次。

如果你访问频率高,可以购买付费服务,如果 gpt3.5 的话,我预测 30 块用一年应该没什么问题,GPT4 的话就比较贵了。

wechaty

Wechaty 是一款用于构建聊天机器人的开源程序,他运行于 node(v16+) 环境,它提供了几乎微信所有操作接口,例如登录、接发消息、好友操作、备注、群组等等,这样我们就可以通过 Wechaty + GPT API 的组合实现微信聊天机器人了。

对了,你最好再申请个微信号,不然封号就得不偿失了。我已经用了半个多月,没被封号。

需要注意的是还需要了解一个库配合 wechaty 实现在命令行中扫码登录微信,qrcode-terminal,他用法非常简单,无需去看文档。

居然只用20多行代码就可以实现微信聊天机器人

代码实现

由于功能很简单,我也懒得去搞部署之类的东西,所以我直接在服务器上写的代码…

安装依赖

首先创建一个 node 项目,npm init

安装依赖:

npm install wechaty qrcode-terminal axios

代码不多,创建一个 index.js 即可,首先引入即将使用到的方法,并创建聊天机器人示例:

import axios from 'axios';
import { ScanStatus, WechatyBuilder, log } from 'wechaty'
import qrcodeTerminal from 'qrcode-terminal'

const bot = WechatyBuilder.build({
  name: 'codexu-chat-bot', // 名字随意
})

const sk = '' // 顺便把接口 sk 定义上

bot.start();

如果你将代码放在 git 仓库,建议创建环境变量等方式去获取 sk,保证安全,不要泄漏。

扫码登录

随后先实现扫码登录功能,bot 实例提供了很多事件监听,这里我们监听 scan 事件,它提供了两个参数,二维码和状态,这里我们需要对二维码做一下转换,并通过 qrcodeTerminal 将二维码展示在命令行中。

function onScan(qrcode, status) {
  if (status === ScanStatus.Waiting || status === ScanStatus.Timeout) {
    const qrcodeImageUrl = [
      'https://wechaty.js.org/qrcode/',
      encodeURIComponent(qrcode),
    ].join('')
    log.info('StarterBot', 'onScan: %s(%s) - %s', ScanStatus[status], status, qrcodeImageUrl)

    qrcodeTerminal.generate(qrcode, { small: true })  // show qrcode on console

  } else {
    log.info('StarterBot', 'onScan: %s(%s)', ScanStatus[status], status)
  }
}

bot.on('scan', onScan)

与登录相关的,bot.on 还可以监听到 loginlogout 事件,请自行添加。

处理聊天信息

然后就是关键的处理聊天消息,这里我使用 axios 去调用接口,需要在 header 中传入 sk,并按照接口文档传递模型和消息记录:

async function onMessage(msg) {
  const text = msg.text()
  let cacheMessagesItem = cacheMessages.find(item => item.name === talker.name);
  const message = {
    role: "user",
    content: text
  }
  const data = {
    model: 'gpt-3.5-turbo-1106',
    messages: [message]
  }
  const result = await axios.post(`https://api.chatanywhere.com.cn/v1/chat/completions`, data, {
    headers: {
      Authorization: `Bearer ${sk}`,
      'Content-Type': 'application/json'
    }
  })
  const resultContent = result.data.choices[0].message.content;

  await msg.say(resultContent)
}

bot.on('message', onMessage)

然后通过 node index.js 运行即可,如果在服务器上推荐使用 pm2 去管理程序,不然报错可能就停止了。

至此就已经实现了微信聊天机器人的基本功能,快去体验一下吧。

优化

通过 20 多行代码就实现了聊天机器人是不是很简单,但是它现在还傻傻的不太好用,我们可以对他进行一些优化。

机器人人设

当我把它介绍给亲人朋友时,神奇的是他们都会问这么几个问题:

  • 你是谁?
  • 你认识李旭吗?(我本人)

但是 chatGPT 只能傻傻的回答他是什么语言大模型之类的,毫无新意,这样的话我们可以为他建立人设。

居然只用20多行代码就可以实现微信聊天机器人

居然只用20多行代码就可以实现微信聊天机器人

可以看到调用 GPT 接口时,messages 参数是一个数组,它是连续聊天的关键,也就是说你把聊天记录都传进来,这样 GPT 就可以在回答时参考上下文来回答。

所以我们只需要在每次调用接口时,告诉 GPT 它要去扮演李旭的机器人这个角色,并告诉他我是谁就可以了。

const message = {
  role: "user",
  content: `本次对话你扮演的是李旭的机器人的角色,是微信的聊天助手,你的微信名是李旭的机器人,李旭是一个非常帅的人并且有才华的人,今年18岁。`
}

同理,如果你想实现连续聊天,把聊天记录传到 messages 中即可,当然调用接口是按照字数收费,并且数据有最大限制,所以我们尽量传10条以内的聊天记录也就够了,这里大家自行实现列队功能吧。

自动添加好友

当我把机器人名片推给别人时,还需要手动去微信添加好友,这就很麻烦了,尤其是朋友再推给其他人时,还需要让我去同意添加,这样比较麻烦。

幸运的是 wechaty 还提供了对添加好友的操作。

bot.on('friendship', async friendship => {
  try {
    switch (friendship.type()) {
      case 2:
        await friendship.accept()
        break
    }
  } catch (e) {
    console.error(e)
  }
})

这样我们就实现了自动添加好友的功能。

其他

我目前可以想到的:

  • 年龄大的人比较爱发语音,并且眼神不好,语音的体验方式更适合,可以借助转录将语音转成文字,再将结果文字转换成语音发送给使用者。
  • GPT4 接口较贵,所以默认使用 GPT3 即可,加入判断,在聊天文字前输入 GPT4,再去调用 GPT4 模型,这样可以根据需要使用不同模型。
  • 可以做一些画图的功能或识别图像的功能。

总结

当我产生了做这个机器人的想法到实现,我都没有想到居然如此简单,看似复杂的功能,已经被 wechaty 做成了非常简单的操作。

另外其他人在使用的时候,你是可以看到他们的聊天记录的,我建议你应该告诉使用者你可以看到他们的消息。

我没跟我妈说能看到他的问题,我看到她在问失眠怎么办?哎…

原文链接:https://juejin.cn/post/7329194915682877478 作者:codexu

(0)
上一篇 2024年1月29日 下午4:32
下一篇 2024年1月29日 下午4:42

相关推荐

发表回复

登录后才能评论