当前位置:   article > 正文

Wechaty | NodeJS基于wechaty-puppet-hostie协议手撸一个企业级微信机器人助手_如何开发puppet

如何开发puppet

需求背景

目前所在企业是一家创新型汽车后市场互联网科技有限公司,拓展汽车后市场B2C、B2B和O2O业务。

前期打造链接线下6家自营大型汽车专业维修中心,12家自营汽车配件、汽保设备销售中心,3000余家加盟汽修、汽配企业及10余万个人客户的服务平台;

由于客户维系和供应商咨询等都是基于微信群聊的。每天要在成百上千的群聊中提供服务。需要实时在群内产品报价,车架号识别,图片识别,关键字反馈。数据推送等等功能。这样的需求情况下,人力成本是巨大的。

而我作为一名前端开发工程师,平时也喜欢写技术博客和交朋友,为此我也创建了微信技术交流群和微信公众号,一般我都会在文章下面贴出公众号和我的个人二维码,给有兴趣的小伙伴们添加微信然后我再拉他们进群这些,但是不停的同意微信好友验证,再发送群邀请真的是太痛苦了,相信很多做公众号的小伙伴都和我一样,作为一名开发,这种重复劳动是绝对不能忍受的基于这种情况和公司业务情况,调研发现了并了解到了wechaty,发现其提供的功能能够覆盖到企业和个人微信,并且能够自己定制化开发符合自己需求的功能。

介绍

Wechaty 是什么

微信个人号功能非常强大和灵活,是一个非常适合用来做ChatBot的载体。它可以灵活不受限制的发送语音短信、视频、图片和文字,支持多人群聊。但是使用微信个人微信号作为ChatBot,需要通过非官方的第三方库接入微信。因为截至2018年底,微信尚无任何官方的ChatBot API发布。

Wechaty 是一个开源的的对话机器人 SDK,支持 个人号 微信。它是一个使用Typescript 构建的Node.js 应用。支持多种微信接入方案,包括网页,ipad,ios,windows, android 等。同时支持Linux, Windows, Darwin(OSX/Mac) 和 Docker 多个平台。

在GitHub上可以找到很多支持微信个人号接入的第三方类库,其中大多都是基于Web Wechat的API来实现的,如基于Python的WeixinBot,基于Node.js的Wechaty等。少数支持非Web协议的库,大多是商业私有闭源的,Wechaty是少有的开源项目支持非Web协议的类库。

只需要6行代码,你就可以 通过个人号 搭建一个 微信机器人功能 ,用来自动管理微信消息。

import {
    Wechaty } from 'wechaty'

Wechaty.instance()
.on('scan',        qrcode  => console.log('扫码登录:' + qrcode))
.on('login',       user    => console.log('登录成功:' + user))
.on('message',     message => console.log('收到消息:' + message))
.on('friendship',  friendship => console.log('收到好友请求:' + friendship))
.on('room-invite', invitation => console.log('收到入群邀请:' + invitation))
.start()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

更多功能包括

  • 消息处理:关键词回复
  • 群管理:自动入群,拉人,踢人
  • 自动处理好友请求
  • 智能对话:通过简单配置,即可加入智能对话系统,完成指定任务
  • … 请自行开脑洞
    所有你能想到的交互模式。在微信上都有实现的可能。

每日定时拉取天气预报。

每天给你心爱的人发送早安和晚安信息。

什么成语接龙啦。快问快答等等功能

当然wechaty的功能服务并不是免费的

200/月的费用,如果你是个人开发可能会斟酌一二。但是你可以通过社区申请一个长达15天的免费token来尝试使用和开发一个小型机器人,从而决定你是否需要购买使用。

关于申请的地址我放在了这里Wechaty Token 申请及使用文档和常见问题

基于wechaty-puppet-hostie开发企业级微信机器人

目录结构

├── config
│   └── index.js // 配置文件
├── package.json
├── service
│   ├── bot-service
│   │   ├── error-service.js
│   │   ├── friendship-service.js
│   │   ├── heartbeat-service.js
│   │   ├── login-service
│   │   │   ├── function-service.js
│   │   │   └── index.js
│   │   ├── logout-service.js
│   │   ├── message-service
│   │   │   ├── function-service.js
│   │   │   └── index.js
│   │   ├── ready-service
│   │   │   ├── function-service.js
│   │   │   └── index.js
│   │   ├── room-invite-service.js
│   │   ├── room-join-service.js
│   │   ├── room-leave-service.js
│   │   ├── room-topic-service.js
│   │   └── scan-service
│   │       └── index.js
│   ├── common-service
│   │   ├── chatbot-service.js
│   │   ├── ding-service.js
│   │   └── oss-service.js
│   └── redis-service
│       └── index.js
├── src
│   └── main.js // 入口
├── store
│   └── index.js // 全局存储对象
├── utils
│   ├── oss.js // 阿里云oss认证
│   └── redis.js // redis认证登录
└── yarn.lock
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

src/main.js

const {
    Wechaty } = require('wechaty')                                          // 机器人木偶

const {
    onScan } = require("../service/bot-service/scan-service")               // 当机器人需要扫码登陆的时候会触发这个事件。
const {
    onLogin } = require("../service/bot-service/login-service")             // 当机器人成功登陆后,会触发事件,并会在事件中传递当前登陆机器人的信息
const {
    onLogout } = require("../service/bot-service/logout-service")           // 当机器人检测到登出的时候,会触发事件,并会在事件中传递机器人的信息。
const {
    onReady } = require("../service/bot-service/ready-service")             // 当所有数据加载完成后,会触发这个事件。在wechaty-puppet-padchat 中,它意味着已经加载完成Contact 和Room 的信息。
const {
    onMessage } = require("../service/bot-service/message-service")         // 当机器人收到消息的时候会触发这个事件。
const {
    onRoomInvite } = require("../service/bot-service/room-invite-service")  // 当收到群邀请的时候,会触发这个事件。
const {
    onRoomTopic } = require("../service/bot-service/room-topic-service")    // 当有人修改群名称的时候会触发这个事件。
const {
    onRoomJoin } = require("../service/bot-service/room-join-service")      // 当有人进入微信群的时候会触发这个事件。机器人主动进入某个微信群,那个样会触发这个事件。
const {
    onRoomleave } = require("../service/bot-service/room-leave-service")    // 当机器人把群里某个用户移出群聊的时候会触发这个时间。用户主动退群是无法检测到的。
const {
    onFriendship } = require("../service/bot-service/friendship-service")   // 当有人给机器人发好友请求的时候会触发这个事件。
const {
    onHeartbeat } = require('../service/bot-service/heartbeat-service')     // 获取机器人的心跳。
const {
    onError } = require('../service/bot-service/error-service')             // 当机器人内部出错的时候会触发error 事件。


const {
    wechatyToken } = require('../config/index') // 机器人token
const {
    globalData } = require('../store/index') // 全局对象

globalData.bot = new Wechaty({
   
    puppet: 'wechaty-puppet-hostie',
    puppetOptions: {
   
        token: wechatyToken
    }
});

globalData.bot
    .on('scan', onScan)
    .on('login', onLogin)
    .on('logout', onLogout)
    .on('ready', onReady)
    .on('message', onMessage)
    .on('room-invite', onRoomInvite)
    .on('room-topic', onRoomTopic)
    .on('room-join', onRoomJoin)
    .on('room-leave', onRoomleave)
    .on('friendship', onFriendship)
    .on('heartbeat', onHeartbeat)
    .on('error', onError)
    .start()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

具体功能实现及代码

  • 扫码登录
    通过node启动后,触发onScan事件,将登录二维码打印在控制台,扫码登录
const QrcodeTerminal = require('qrcode-terminal');
const {
    ScanStatus } = require('wechaty-puppet')

/**
 * @method onScan 当机器人需要扫码登陆的时候会触发这个事件。 建议你安装 qrcode-terminal(运行 npm install qrcode-terminal) 这个包,这样你可以在命令行中直接看到二维码。
 * @param {*} qrcode 
 * @param {*} status 
 */
const onScan = async (qrcode, status) => {
   
    try {
   
        if (status === ScanStatus.Waiting) {
   
            console.log(`========================
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/233867
推荐阅读
相关标签