node打造微信个人号机器人的方法示例


Posted in Javascript onApril 26, 2018

现在,日常生活已经离不开微信,本文将会抛砖引玉演示如何使用 wechaty 操作微信个人号做一些有意思的东西,可以实现自动通过好友请求、关键词回复、自动拉群等功能。大大提高了社群运营的效率。

wechaty( https://chatie.io/wechaty/)是一款开源的微信个人号SDK,进行了一系列的封装,提供简单好用的接口,然后开发者可以在其之上进行微信机器人的开发。你可以用它来做很多事:

1)管理和维护好友; 2)快速有序地处理聊天信息 3)微信群管理 4)实现自动回复 5)……

一、快速上手

wechaty 项目主页写着 6行代码创建一个微信机器人,那么我们就来试一试。 注意:Node.js version >= 8.5

The World's Shortest ChatBot Code: 6 lines of JavaScript

const { Wechaty } = require('wechaty')

Wechaty.instance() // Singleton
.on('scan', (url, code) => console.log(`Scan QR Code to login: $[code]\n${url}`))
.on('login', user => console.log(`User ${user} logined`))
.on('message', message => console.log(`Message: ${message}`))
.start()

这6行代码实现了登录微信个人号并打印出所收到的消息。

wechaty 可以通过Docker和NPM两种方式运行,本文使用npm方式

node bot.js 启动这个个人号机器人,这时命令行会打印出一个链接,我们将它在浏览器中打开可以看到这是个二维码,扫码即可登录(注:2017年年底随着微信逐步关停微信网页版登录支持,之后后注册的微信号不支持网页微信的登录。老夫花了105RMB买了个号来用,心疼我的钱包3秒钟)

User Contact<刘星> logined // 扫码登录
Message: Message<JavaScript之禅> // 接收微信消息

机器人体验在文末。 示例代码地址: Github

二、自动通过好友请求

通过前面的示例代码,可以发现这个库的简洁强大了吧。接着我们来实现第一个小功能:自动通过好友请求

//···
.on('friend', async (contact, request) => {
if (request) {
if (/JavaScript|JS/i.test(request.hello)) {
logMsg = 'accepted because verify messsage is "JS之禅"'
request.accept()
} else {
logMsg = 'not auto accepted, because verify message is: ' + request.hello
}
} else {
logMsg = 'friend ship confirmed with ' + contact.get('name')
}
})
//···

这里我们通过监听 friend 事件。可以获取到谁发了什么好友请求。这里我们验证了添加好友时的请求,在收到好友请求内容为【 JS 】或者【JavaScript】时 就会自动通过好友请求了。

每次都复制链接到浏览器打开二维码在扫码一点儿都不方酷也不方便在服务器上使用。这时我们可以用 qrcode-terminal 这个包 直接在命令行中打印出二维码。

//···
const QrcodeTerminal = require('qrcode-terminal')
//···
.on('scan', (url, code) => {
let loginUrl = url.replace('qrcode', 'l')
QrcodeTerminal.generate(loginUrl)
console.log(url)
})
//···

再运行 node bot.js 命令行将直接打印出二维码,方便了很多。

三、自动回复

现在来实现第二个小功能:关键词自动回复。

//···
.on('message', async (message) => {
const contact = message.from()
const content = message.content()
const room = message.room()
if (room) {
console.log(`Room: ${room.topic()} Contact: ${contact.name()} Content: ${content}`)
} else {
console.log(`Contact: ${contact.name()} Content: ${content}`)
}

// 不处理自己发的消息
if (message.self()) {
return
}

if (/JavaScript|Js|js/.test(content)) {
message.say('关注公众号 JavaScript之禅')
}
})
//···

在上面 我们监听 message 来做消息处理。message 可以接收到所有的消息,我们可以判断是不是群聊消息、根据消息回复相应内容。如发送【 js 】将会收到设置好的消息,实现自动回复。

四、自动拉群

前面说到了消息关键词自动回复,把消息处理和群管理结合起来,我们就可以实现根据关键字自动拉群了

//···
.on('message', async (message) => {
const contact = message.from()
const content = message.content()
const room = message.room()
if (room) {
console.log(`Room: ${room.topic()} Contact: ${contact.name()} Content: ${content}`)
} else {
console.log(`Contact: ${contact.name()} Content: ${content}`)
}

if (message.self()) {
return
}


if (/JavaScript|Js|js/.test(content)) {
message.say('关注公众号 JavaScript之禅没?')
}
// 自动拉群
if (/加群/.test(content)) {
let keyroom = await Room.find({ topic: 'test' })
if (keyroom) {
await keyroom.add(contact)
await keyroom.say('欢迎新朋友!', contact)
}
}
})
//···

上面的代码通过 Room 来操作群聊。 此时回复 【加群】即可被自动拉入群中。当然了,我们还可以做得更多如使用 Room.del 来讲某个群员踢出去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
拖动布局之保存布局页面cookies篇
Oct 29 Javascript
解决JS浮点数运算出现Bug的方法
Mar 12 Javascript
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
May 15 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
May 12 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
Nuxt.js踩坑总结分享
Jan 18 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
Mar 17 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 Javascript
js实现图片上传即时显示效果
Sep 30 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 Javascript
Vue 使用中的小技巧
Apr 26 #Javascript
基于Vue实现拖拽功能
Jul 29 #Javascript
vuex操作state对象的实例代码
Apr 25 #Javascript
微信小程序商品详情页的底部弹出框效果
Nov 16 #Javascript
你点的 ES6一些小技巧,请查收
Apr 25 #Javascript
vue 组件使用中的一些细节点
Apr 25 #Javascript
Vue中使用vue-i18插件实现多语言切换功能
Apr 25 #Javascript
You might like
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
python实现dict版图遍历示例
2014/02/19 Python
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
python实现雨滴下落到地面效果
2018/06/21 Python
np.random.seed() 的使用详解
2020/01/14 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
python遍历路径破解表单的示例
2020/11/21 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
strstr()的简单实现
2013/09/26 面试题
校长岗位职责
2013/11/26 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
班组长岗位职责
2014/03/03 职场文书
个人承诺书
2014/03/26 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
工作犯错保证书
2015/05/11 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
SQL Server中的游标介绍
2022/05/20 SQL Server