node 打造微信个人号机器人

作者: 刘星
日期: 2018年4月25日

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

wechaty(https://github.com/Chatie/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来讲某个群员踢出去。

更多参见官方文档:https://chatie.io/wechaty

四、总结

本文通过 wechaty 实现了三个小功能向大家介绍了 wechaty 这个库的基本使用,还有更多功能等着去探索。大家可以根据自己的需要定制出强大的个人微信号机器人。

文档信息

版权声明:署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0)

原文链接:https://www.liuxing.io/blog/node-wechat-robot/

发表日期:2018年04月25日


相关文章

Node.js 使用 Nodemailer 发送邮件

电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。 在很多项目中,我们都会遇到邮件注册,邮件反馈等需求。在 node 中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用。Nodemailer包就可以帮助我们快速实现发送邮件的功能。

2017年12月02日

Koa 快速入门教程(一)

Koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架,采用了async和await的方式执行异步操作。

2017年11月18日

JSON 入门教程

JSON 的全称是”JavaScript Object Notation”,意思是 JavaScript 对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式,类似 XML 但比 XML 更小、更快,更易解析

2017年4月05日

最近更新

Curl 使用指南

Curl 是一个常用的命令行数据传输工具, 可以方便的从命令行创建网络请求

2021年5月04日

JavaScript 中的分号

JavaScript 代码到底加不加分号。本文带你了解 JavaScript 的分号自动插入机制,以及哪些情况必须加分号

2021年5月02日