为了方便通知,我们给小爱音箱接入了系统的业务语音通知

需求来源

我们的业务系统告警信息之前是使用类似 企业微信 钉钉 飞书 等工具进行群消息的机器人通知的,但文字信息提醒还是不够明显,同事们也没有随时盯着电脑或者手机。

办公室有很多的小爱同学,于是我们考虑要不要通过小爱同学用语音来把系统的告警信息通知到办公室的同事们?

需求分析

我们使用小爱同学的 API 来实现主动说话,然后起一个 WebApi 提供给系统来调用:

之前我们就基于 mi-service-lite 这个库实现了:

js 复制代码
const http = require("http")
const { MiServiceConfig, getMiIOT, getMiNA } = require("mi-service-lite");

const config = {
  userId: "", // 小米的 UserId,不是登录账号
  password: "", // 小米账号的密码
  did: "", // 设备ID或者名称,如果不填,则账号下所有的小爱都会说话。。。
};
async function init(){
    const mina = await getMiNA(config)
    const miot = await getMiIOT(config)
    async function say(str) {
      miot.doAction(3, 4);
      miot.doAction(5, 3, str);
      // action 可以查询文档: https://home.miot-spec.com/#google_vignette
    }
    const server = http.createServer(async (req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      if (req.method !== 'POST') {
        res.end('Post Only!\n');
        return
      }
      let body = '';
      req.on('data', chunk => {
        body += chunk.toString();
      });
      req.on('end', () => {
        say(body)
        res.end('Success!\n');
      });
    });
    const PORT = 18080;
    server.listen(PORT, () => {
      console.log(`Server is running at http://localhost:${PORT}`);
    });
}
init()

然后我们的业务系统只需要请求这个Web服务即可通知小爱说话了。

系统代码设计

如我们之前文章里设计的 "如何使用WebHook的架构设计来扩展和开放你的业务系统",我们只需要添加一个通知方式:

java 复制代码
public enum WebHookType implements IDictionary {
    /**
     * <h2>企业微信</h2>
     */
    WORK_WECHAT(1, "企业微信"),

    /**
     * <h2>飞书</h2>
     */
    FEI_SHU(2, "飞书"),

    /**
     * <h2>钉钉</h2>
     */
    DING_TALK(3, "钉钉"),

    /**
     * <h2>邮件</h2>
     */
    EMAIL(4, "邮件"),

    /**
     * <h2>WebHook</h2>
     */
    WEB_HOOK(5, "WebHook"),

    /**
     * <h2>小爱同学</h2>
     */
    XIAO_AI(6, "小爱同学"),
    ;

    private final int key;
    private final String label;
}

添加完枚举之后,我们去抽象工厂 AbstractEventFactory 中支持小爱同学的调用,并添加一个抽象方法让需要通知的业务方去自行实现:

java 复制代码
// ... 其他代码
Object object = switch (webHookType) {
    case WORK_WECHAT -> getWorkWechatMarkDown(notifyHook);
    case FEI_SHU -> getFeishuMarkDown(notifyHook);
    case DING_TALK -> getDingTalkMarkDown(notifyHook);
    case EMAIL -> getEmailBody(notifyHook);
    case WEB_HOOK -> getWebHookBody(notifyHook);
    // 添加小爱的支持,直接使用 `getWebHookContent()` 的返回值作为朗读内容
    case XIAO_AI -> getWebHookContent(notifyHook);
};
// ...

后端搞定,前端也枚举支持一下:

ts 复制代码
export class WebHookTypeEnum extends AirEnum {
  static readonly WORK_WECHAT = new WebHookTypeEnum(1, '企业微信')
  // ... 添加小爱同学支持
  static readonly XIAO_AI = new WebHookTypeEnum(6, '小爱同学')
}

前端搞定,如图:

保存后,接下来我们在 创建供应商 成功后,就会触发小爱同学说话啦~

此处假设你听到了语音

小爱同学:"管理员创建了供应商:123"

总结

就是玩~

Bye

相关推荐
zwjapple2 小时前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
tan180°4 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
像风一样自由20204 小时前
HTML与JavaScript:构建动态交互式Web页面的基石
前端·javascript·html
aiprtem5 小时前
基于Flutter的web登录设计
前端·flutter
浪裡遊5 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
优创学社25 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术5 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理5 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
GISer_Jing5 小时前
0704-0706上海,又聚上了
前端·新浪微博
止观止5 小时前
深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案
前端·pnpm·前端工程化·包管理器