博舍

使用Node+Wechaty做一个机器人 如何制作一个智能机器人教程图片

使用Node+Wechaty做一个机器人

目录

前言

准备工作

起步

实践

写在最后

前言

这篇文章将结合Wechaty去实现一个机器人

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

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

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

准备工作node环境(v16+)wechatyqrcode-terminal(在控制台显示二维码)起步

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

创建一个wechatyserver

const{WechatyBuilder}=require("wechaty");constwechaty=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时一定要在nodev16+环境下运行,我的电脑是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";},});constos=require("os");console.log(os.hostname());

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

Object.defineProperty(require("os"),"hostname",{value:()=>{//防止win7环境下,高版本node取不到os模块的hostname函数结果return"my-pc-host-name";},});constqrcode=require("qrcode-terminal");const{WechatyBuilder}=require("wechaty");constwechaty=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";},});constqrcode=require("qrcode-terminal");const{WechatyBuilder,ScanStatus}=require("wechaty");const{sessionToken}=require("./session");constrequest=require("request");constwechaty=WechatyBuilder.build();consturl="http://127.0.0.1:1024/sendMsg";constsendChatGPT=(msg)=>{const{promise,reject,resolve}=defer();request.post(url,{json:{msg,sessionToken,},},(error,res,body)=>{if(error)returnreject(error);console.log(body.msg);resolve(body.msg);});returnpromise;};/***@name:*@description:promise扁平处理*@return{*}*/constdefer=()=>{letresolve,reject;return{promise:newPromise((_resolve,_reject)=>{resolve=_resolve;reject=_reject;}),resolve,reject,};};constonMessage=async(msg)=>{//console.log(`收到消息:${msg.toString()}`);constmsgText=awaitmsg.text();if(msgText){try{constgptMsg=awaitsendChatGPT(msgText);msg.say(gptMsg);}catch(error){msg.say(error);}}};constonLogout=(user)=>{console.log(`用户${user}退出成功`);};constonLogin=(user)=>{console.log(`用户${user}登录成功`);};constonError=console.error;constonScan=(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而不是富文本的方式,所以中间的代码块没有显示出来,但是简单的问答还是能够实现的

写在最后

本文介绍了如何使用wechaty接入node,实现机器人的功能

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇