周末抽空实现一个群抽奖机器人, 源代码100行左右,本来打算在100行以内实现, 但是影响可读性,让它自由生长好了。
代码地址: tans/luckybot
目前wechaty是微信机器人解决方案中比较成熟的,wechaty更像是一个sdk,背后主要靠token提供商来提供机器人托管服务, 当然也有免费的解决方案。使用wechaty的好处是把微信接口和业务逻辑分离,机器人尽管把业务逻辑实现就好。
通过开发群抽奖机器人, 很好的体验上手wechaty。
机器人使用CoffeeScript(编译成JS)开发
初始化 和 启动
{ PuppetPadlocal } = require "wechaty-puppet-padlocal"
{ Wechaty, ScanStatus } = require "wechaty"
bot = new Wechaty(
name: "luckybot"
puppet: new PuppetPadlocal { token }
)
bot.start()
机器人很适合node.js的生态开发,基于事件,异步处理,单进程。配合pm2进程管理, 可以很方便的在服务器托管启动机器人。
扫码登陆
bot.on "scan", (qrcode, status) ->
if status is ScanStatus.Waiting and qrcode
require("qrcode-terminal").generate qrcode, small: true
监听scan事件,把二维码打印到终端。手机扫码即可自动完成登陆
延时处理
sleep = ->
new Promise (resolve) ->
setTimeout resolve, _.random(1.2, 3.2) * 1000
测试过程中, 发现机器人居然秒回消息。担心微信的风控于是简单实现一个随机的sleep
抽奖逻辑
抽奖代码不贴了,感兴趣可以翻一番源代码。 主要是产品设计的时候,把UI交互变成命令行,这对于开发者比较简单,但是用户接受度如何还是有待验证。
比如 创建抽奖活动。 如果在ui界面,会有输入框输入抽奖人数,奖品,活动名字。 然后还有保存按钮,查看参与抽奖人数等等。如果是机器人实现,应该变成命令式,这时候要尽量简化。把整个ui交互转化成一句话:
发起抽奖|抽2人
通过识别关键字,创建群抽奖活动, 然后机器人继续主持活动进行, 提示大家发送参与抽奖关键字参与。
整个流程基于对话和文本。 感觉产品的设计又回到了80年代的命令行程序开发。
流程引导,信息提示,异常纠正,权限分离。成为机器人开发时候需要特别关注的细节。
抽奖流程:
- 发起抽奖
- 参与抽奖
- 开奖
最后贴上开发时候的测试图:

网友评论