微信接入ChatGPT,使用Node+ChatGPT+Wechaty做一个微信机器人

news2024/10/7 13:19:34

目录

前言

准备工作

起步

实践

写在最后


前言

接上篇文章:站在巨人的肩膀上,用Node+ChatGPT模块实现一个接口_DieHunter1024的博客-CSDN博客

我将ChatGPT模块的使用介绍了一下,使用自己的session发送请求达到调用ChatGPT进行聊天的目的,这篇文章会结合Wechaty去实现一个微信机器人

在开始编码之前,我们先了解一下wechaty

Wechaty是一个支持接入微信的聊天机器人,只需6行代码即可实现一个机器人,其跨平台性,多编程语言支持,使其在众多开源的bot项目中大放光彩。

关于它的使用,官方给的文档已经非常详细了,这里就不做描述

准备工作

  • node环境(v16+)
  • wechaty
  • qrcode-terminal(在控制台显示二维码)

起步

首先使用pnpm/npm/yarn安装以上依赖

创建一个wechaty server

const { WechatyBuilder } = require("wechaty");

const wechaty = WechatyBuilder.build();
wechaty
  .on("scan", (c, status) => {
    // status: 2代表链接等待调用,3代表链接已打开,这个链接实际上是提供一个登录的二维码供扫描
    if (status===2) {
      console.log(c)
    }
  })
  .on("login", (user) => console.log(`用户 ${user} 登录成功`))
  .on("message", (message) => console.log(`收到消息: ${message}`));
wechaty.start();

注意:在使用wechaty时一定要在node v16+环境下运行,我的电脑是win7,不支node13+的,所以我使用强制使用高版本node的方式在win7中运行了node18,这样做的话会导致下面这个报错

这是由于高版本(14.6版本后才增加这个函数)的node取os.hostname()时找不到当前计算机的用户名

突然给电脑换系统又不太现实,所以我的快速的解决方式是增加以下代码(有其他补充,还请大佬指教)

Object.defineProperty(require("os"), "hostname", {
  value: () => {
    // 防止win7环境下,高版本node取不到os模块的hostname函数结果
    return "my-pc-host-name";
  },
});

const os = require("os");
console.log(os.hostname());

到这一步,我们还需要一个二维码的工具qrcode-terminal,将url转换为二维码,提供给手机微信扫描,代码如下:

Object.defineProperty(require("os"), "hostname", {
  value: () => {
    // 防止win7环境下,高版本node取不到os模块的hostname函数结果
    return "my-pc-host-name";
  },
});
const qrcode = require("qrcode-terminal");
const { WechatyBuilder } = require("wechaty");

const wechaty = WechatyBuilder.build();
wechaty
  .on("scan", (c, status) => {
    // status: 2代表等待,3代表扫码完成
    status === 2 && qrcode.generate(c, { small: true }, console.log);
  })
  .on("login", (user) => console.log(`用户 ${user} 登录成功`))
  .on("message", (message) => console.log(`收到消息: ${message}`));
wechaty.start();

效果:

确认登录

 

发送消息

接收消息

 

实践

大家如果使用过socket的话,应该比较容易理解,这个模块消息的传递是基于发布订阅的

接下来,我们把这个机器人完善一下,配合这篇文章实现的接口,将机器人完整的功能实现一下

Object.defineProperty(require("os"), "hostname", {
  value: () => {
    // 防止win7环境下,高版本node取不到os模块的hostname函数结果
    return "my-pc-host-name";
  },
});

const qrcode = require("qrcode-terminal");
const { WechatyBuilder, ScanStatus } = require("wechaty");
const { sessionToken } = require("./session");
const request = require("request");
const wechaty = WechatyBuilder.build();
const url = "http://127.0.0.1:1024/sendMsg";
const sendChatGPT = (msg) => {
  const { promise, reject, resolve } = defer();
  request.post(
    url,
    {
      json: {
        msg,
        sessionToken,
      },
    },
    (error, res, body) => {
      if (error) return reject(error);
      console.log(body.msg);
      resolve(body.msg);
    }
  );
  return promise;
};
/**
 * @name:
 * @description: promise扁平处理
 * @return {*}
 */
const defer = () => {
  let resolve, reject;
  return {
    promise: new Promise((_resolve, _reject) => {
      resolve = _resolve;
      reject = _reject;
    }),
    resolve,
    reject,
  };
};

const onMessage = async (msg) => {
  // console.log(`收到消息: ${msg.toString()}`);
  const msgText = await msg.text();
  if (msgText) {
    try {
      const gptMsg = await sendChatGPT(msgText);
      msg.say(gptMsg);
    } catch (error) {
      msg.say(error);
    }
  }
};
const onLogout = (user) => {
  console.log(`用户 ${user} 退出成功`);
};
const onLogin = (user) => {
  console.log(`用户 ${user} 登录成功`);
};
const onError = console.error;
const onScan = (code, status) => {
  // status: 2代表等待,3代表扫码完成
  status === ScanStatus.Waiting &&
    qrcode.generate(code, { small: true }, console.log);
};

wechaty
  .on("scan", onScan)
  .on("login", onLogin)
  .on("logout", onLogout)
  .on("error", onError)
  .on("message", onMessage);
wechaty.start();

效果:

这里由于选择的是text而不是富文本的方式,所以中间的代码块没有显示出来,但是简单的问答还是能够实现的

写在最后

感谢你看到了最后,如果文章对你有帮助的话,还请点赞支持一下博主,非常感谢

源码:ChatGPT-Wechaty-Bot: 使用ChatGPT+Wechaty实现的一个对话机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划——背包问题(2)

文章目录多重背包的单调队列优化例题思路代码二维费用背包问题例题背包问题装法的总结:至多、恰好、至少背包最多装V体积背包恰好装V体积背包最少装V体积例题求解方案数初始化和循环顺序例题求解具体方案思路例题考察思维的一些题目多重背包与分组背包机器分配金明的…

原生JS开发手机端H5项目总结(FamilyChallenge)

一、 插件文件 (可多选) JQuery (操作dom)lottie.js (播放动效)preload-0.6.2.min.js(资源预加载)jweixin-1.6.0.js (h5跳转微信小程序)TweenMax.min.js &am…

Lidar based off-road negative obstacle detection and analysis(论文翻译)

(机翻 自己留作资料的 大家辩证使用 论文地址:https://ieeexplore.ieee.org/document/6083105) Abstract: 无人驾驶地面车辆 (UGV) 要想在越野地形中高速行驶,就必须实时分析和了解周围的地形:它必须知道它打算去哪里&…

备忘录模式

一、备忘录模式 1、定义 备忘录模式(Memento Pattern)又称作快照模式(Snapshot Pattern),指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复…

你好,Cartesi Rollups Alpha 0.8.0

支持 Arbitrum 和 Optimism 部署,并使内部增强。我们通过这个新版本支持在Optimism和Arbitrum L2 链上的部署,为 Cartesi Rollups DApp 开发人员带来了更低的延迟和更低的gas费用。我们致力于提高 Cartesi 技术的多样性和性能提升,并且通过 R…

【MySQL】视图

文章目录视图基本使用视图规则与限制视图 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据,视图的数据变化会影响到基表,基表的数据变化也会影响到视图, 主要作用是,将表的内容,常用需要的部分创建一个部分,这样使用视图的时候,可以减…

CAS:1407166-70-4,NODA-GA-NHS ester大环化合物供应

基本信息 名称: NODA-GA-NHS ester 2,2′-(7-(1-carboxy-4-((2,5-dioxopyrrolidin-1-yl)oxy)-4-oxobutyl)-1,4,7-triazonane-1,4-diyl)diacetic acid CAS编号:1407166-70-4 分子式:C19H28N4O10,HPF6,TFA 分子量&a…

HTTP MIME类型

文章目录HTTP MIME类型HTTP MIME类型 HTTP 请求头中的 Accept 头是客户端用来告诉服务器,客户端可以处理什么类型的内容,这种内容类型使用 MIME 类型来表示。借助内容协商机制,服务器可以从诸多 MIME 中选择一项进行应用,并使用 …

Java精品项目源码第145期食品检测管理系统

Java精品项目源码第145期食品检测管理系统 大家好,小辰哥又来啦,今天给大家介绍一个错的基于SSM的食品检测管理系统。 文章目录Java精品项目源码第145期食品检测管理系统前言一、项目运行1.运行环境2.截图前言 提示:以下是本篇文章正文内容…

大数据-玩转数据-Linux部署redis集群

一、下载安装包 访问https://redis.io/download 到官网进行下载。这里下载最新版本. 或直接下载 wget http://download.redis.io/releases/redis-6.2.7.tar.gz 二、安装环境 redis是C语言开发,安装redis需要先将官网下载的源码进行编译,编译依赖gcc环…

数据结构——线性表

线性表的基本操作 对于不同的应用,线性表的基本操作是不同的,上诉操作是最基本的,对于实际问题中涉及的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。如要使得A A U B,就是要将存在于集合B中但不存在于集合A中的…

Java项目:SSM实现茶叶电商销售商城

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录; 管理员角…

软件设计与体系结构——结构型模式

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔空间 结构型模式(Structural Pattern)描述如何将类或对象按某种布局组成更大的结构。就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构 结构型模式可以分为类结构型…

(附源码)ssm教学督导管理系统 毕业设计 292346

ssm教学督导管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采SSM技术和mysql数据库来完成对系统的…

Springboot传参详解

作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注&…

有关SGI STL的alloc

在STL的使用者层面上,空间配置器一般是隐藏的,使用者不需要知道其具体实现细节即 可进行使用;但是从STL的实现角度来说,由于整个STL的操作对象都存放在容器之内,而容器 需要配置一定的空间来进行存放数据,因…

Mybatis:动态SQL(8)

动态SQL1. 动态sql简介2. if3. where4. trim5. choose、when、otherwise6. foreachforeach实现批量添加foreach实现批量删除7. SQL片段8. 总结1. 动态sql简介 Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句…

I-04Python中与C语言STL部分模板的类似模块

C语言中,我们打ACM可以用<vector>、<stack>等模板来快速实现一些经典的数据结构,可我在很多地方都没找到Python中类似于C里面的STL模板这么好用的东西.于是我在Python的标准库里面总结了些模块来直接实现类似的功能(当然也可能是我真的没找到,如果各位来客有知道的…

【浅学Java】SpringMVC程序开发

SpringMVC程序开发1. 认识SpringMVC1.1 SpringMVC是什么1.2 SpringMVC的定义1.3 MVC和SpringMVC的关系经典问题&#xff1a;Spring / SpringBoot / SpringMVC有什区别2. 学习SpringMVC的思路3. Spring MVC的创建和连接3.0 创建方法3.1 使用到的一些注解3.2 返回一个页面3.3 关于…

Qt实现全局鼠标事件监听器-Windows

Qt实现全局鼠标事件监听器-Windows版&#x1f347; 文章目录Qt实现全局鼠标事件监听器-Windows版&#x1f347;1、概述&#x1f348;2、实现效果&#x1f349;3、实现方式&#x1f34a;4、关键代码&#x1f34b;5、源代码&#x1f34c;更多精彩内容&#x1f449;个人内容分类汇…