使用FaaS创建钉钉机器人

echosoar 原创发表于 2020/04/19 14:39:49
#serverless
FaaS(Function as a Service)是一种在Serverless架构中使客户开发、运行和管理应用程序,而无需构建和维护开发和运行的基础架构。
由于我在工作和生活中经常使用钉钉,所以就希望能够在钉钉上面有一个能够记录和提醒我该做什么的机器人,同时考虑到成本、开发的便捷性,毅然地采用了阿里云的函数计算,毕竟部署在上面的函数每月前100w次调用不要钱,真香。
首先在钉钉上创建一个只有一个人的群组,当然默认创建群组是至少三个人才可以的,那么就也可以先随便拉两个人(工具人)一起创建群,创建好马上把他们踢出,因为进群的通知是在群内,所以直到被踢出了,他们也不知道曾经被拉进了某一个群里面。
然后在群智能助手面板中可以添加自定义机器人,同时需要开启消息推送功能,钉钉会提供一个 Webhook 地址,在任何地方只要向这个 Webhook 发送数据,那么消息就会推送到这个钉钉群内。
image.png
接下来就可以创建函数了,在这里我们使用 Midway FaaS 这个淘宝开源的Serverless框架,因为它提供了一个非常便捷好用的本地开发、部署工具,同时拥有IoC等能够帮助便捷开发的功能。
# 安装CLI工具
$ npm i @midwayjs/faas-cli -g
# 创建函数项目
$ f create
创建好了函数项目之后就可以编写功能实现了:
import { Func, Inject, Provide } from '@midwayjs/decorator';
import { FaaSContext, FunctionHandler } from '@midwayjs/faas';
import * as assert from 'assert';
import * as TableStore from 'tablestore';
import { TBStore } from './config';

const tb =  new TableStore.Client(TBStore);

@Provide()
@Func('index.handler')
export class IndexService implements FunctionHandler {

  @Inject()
  ctx: FaaSContext;  // context

  async handler() {
    const params = this.ctx.body;
    assert(params.msgtype && params.msgtype == 'text' && params.text, 'Not Found');
    const text = params.text.content || '';
    const user = params.senderNick;
    const doingInfo = /^\s*([a-z])(\s|$)/i.exec(text);
    if (doingInfo && doingInfo[1]) {
      switch(doingInfo[1]) {
        case 'a':
          return this.addTask(tb, user, text);
        case 'c':
          return this.complete(tb, user, newText);
        case 'h':
          return this.help();
        case 'l':
          return this.list(tb, user)l
        case 't':
          return this.todo(tb, user);
      }
    return this.addTask(tb, user, text);
  }
}
编写完代码之后通过CLI工具可以快速的将这个函数发布到阿里云:
$ f deploy
通过工具可以很快的发布上去,发布完成之后就会有一个可以http访问的链接,这个时候再把这个链接配置到钉钉机器人中:
image.png
下面就是在钉钉中测试这个机器人的功能,如上面的代码中所写,当信息为h的时候机器人会返回help帮助信息。
image.png