project,

微信群内抽奖机器人(wechaty_lottery)

陈述句 陈述句 Follow Jul 23, 2020 · 3 mins read
微信群内抽奖机器人(wechaty_lottery)

背景

目前群内抽奖的方法主要有两种:红包最佳手气和第三方抽奖小程序 而这两种方法从形式到结果的通知都不够直观便捷,不适合高频快速的运营 所以有了制作群内抽奖机器人的想法

功能

通过关键词触发机器人随机抽取群内一人获奖,已除去发奖人与机器人

逻辑

  • 通过”抽奖+空格”格式触发抽奖机器人,例如”抽奖 抱枕”,”抽奖 一等奖”等
  • 机器人被触发后获取当前群内成员数组,并去除机器人和发奖人
  • 等概率随机抽取一人,在群内消息通知中奖信息并同时@发奖人和中奖人
  • 截图

依赖

  • wechaty:wechaty核心库
  • wechaty-puppet-padplus:wechaty iPad协议
  • qrcode-terminal: 终端输出二维码

运行

克隆项目

git clone https://github.com/csjuXYZ/wechaty_lottery.git
cd wechaty_lottery

安装依赖

npm install

启动项目

npm run serve

开发

import { Message }  from 'wechaty'
    // 配置文件
import config  from './config'
    // 机器人名字
const name = config.name

// 消息监听回调
module.exports = bot => {
        return async function onMessage(msg) {
            // 判断消息来自自己,直接return
            if (msg.self()) return
                // 输出消息简介
                //   console.log("=============================")
                //   console.log(`msg : ${msg}`)
                //   console.log(
                //       `from: ${msg.from() ? msg.from().name() : null}: ${
                //   msg.from() ? msg.from().id : null
                // }`
                //   )
                //   console.log(`to: ${msg.to()}`)
                //   console.log(`text: ${msg.text()}`)
                //   console.log(`isRoom: ${msg.room()}`)
                //   console.log("=============================")

            // 判断此消息类型是否为文本
            if (msg.type() == Message.Type.Text) {
                // 判断消息类型来自群聊
                if (msg.room()) {
                    // 获取群聊
                    const room = await msg.room()

                    // 收到消息,提到自己
                    if (await msg.mentionSelf()) {
                        // 获取提到自己的名字
                        // let self = await msg.to()
                        // self = "@" + self.name()
                        // 获取消息内容,拿到整个消息文本,去掉 @+名字
                        // let text = msg.text().replace(self, "")
                        return
                    } else {
                        // 收到消息,是关键字 “抽奖”
                        if (await lottery(msg)) return
                    }

                } else {
                    //私聊消息
                }
            } else {
                console.log("消息不是文本!")
            }
        }
    }
    /**
     * @description 回复信息是关键字 “抽奖”
     * @param {Object} msg 消息对象
     * @return {Promise} true-是 false-不是
     */
async function lottery(msg) {
    //判断文字消息是否以抽奖+空格开头
    if (msg.text().indexOf("抽奖 ") == 0) {
        const room = await msg.room()
        let member = await room.memberAll()
            // 获取群内成员数组,去除机器人以及发奖人
        member = member.filter(v => (!v.self()) && (v != msg.from()))

        // 随机从成员数组中抽取一个
        let target = member[Math.floor(Math.random() * member.length)]

        room.say(msg.text() + "\n---\n" + "\n中奖的人是:" + ((await room.alias(target)) || target.name()), msg.from(), target)

        return true
    }
    return false
}

致谢

感谢wechaty团队提供微信机器人SDK
感谢句子互动提供的iPad协议版token

Author: csjuXYZ Code: wechaty_lottery

Join Newsletter
Get the latest news right in your inbox. We never spam!
Written by 陈述句
前端开发与街头摄影