Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

amazon echoで会社の受付システムを作ってみました

More than 3 years have passed since last update.

先日h-takaumaさんの記事を見て、自分もalexaで会社の受付システムを作ってみました
Google Homeで受付システム作ってみた

また、JavaScriptやamazon lambda触った経験が全くないので、間違いなどあればぜひ教えてください!

構成流れ

image.png

完成動画

必要なもの

  • amazon developer アカウント
  • amazon Echo
  • slack アカウント(チャンネルの権限持つ)

それでは作ってみよう!

alexa skillの簡単な動作や開発手順はここを参考にしました
https://github.com/alexa/skill-sample-nodejs-trivia/blob/ja-JP/instructions/1-voice-user-interface.md

対話モデルのIntents設定

image.png

以下のケースに対応するためのintentを追加しました
- 約束のある方
- 面接で来た方(学生)
- 配送業者
- 来客の人数

slack側のやること

チャンネルにIncoming WebHooksを作ります

QQ20171211-135530@2x.png

WorkSpaceメンバーのidを取得します

https://api.slack.com/changelog/2017-09-the-one-about-usernames
<@userID> でメンバーにメンションを飛ばすことができます。

https://api.slack.com/methods/users.list/test
ここでチャンネルのメンバーidを取得できる。
QQ20171211-142501@2x.png

amazon lambda側

name.json を作ります

担当者の名字、フルネーム両方対応できるように、両方用意します。

name.json
[
    {  "name" : "AA",  "full_name" : "AABB",  "slack_name" : "aabb"  },
   {  "name" : "CC",  "full_name" : "CCDD",  "slack_name" : "ccdd"  },
   and more...
]

index.jsを作ります

//require
var Alexa = require('alexa-sdk');
var slackjson = require('./slack.json');
var namejson = require('./name.json');
var rp = require('request-promise');

基本枠は「skill-sample-nodejs-trivia」を参照すれば良い

学生の時の例

var firstHandlers = Alexa.CreateStateHandler(STATUS.FIRSTMODE, {
    "Unhandled": function(){
        ...
    },

    "GetAnswerIntent": function (){
        ....//約束のある方
    },

    "GetAnswerFromStudentIntent": function (){
        studentRequest.call(this, false);

        rp(options).then((response) => {
            this.emit(':tell', '担当者に伝えました、少々お待ち下さい');
        }, (error) => {
            this.emit(':tell', '通信失敗しました,もう一度お願いします');
        });
    },

    "GetAnswerFromDeliveryIntent": function (){
        ....//配送業者
    }, 
    "AMAZON.StopIntent": function(){
      this.emit("stop");
    }
});

function studentRequest(frist) {
    var to_user_message = "<@slackid> 面接の学生がきました。"
    options = {
        method: 'POST',
        uri: slack_webhook,//先のslack_webhook
        body: {
            text: to_user_message
        },
        json: true
    }; 
}

slackにpostする内容は、Incoming WebHooksを設定する時のSetup Instructionsを参照すれば良い

上記の作業が終わったら、zipファイルを作成し、lambdaにアップロードしてテストclearなら完成です!

image.png

めっちゃはまった所

最初のpostの書き方:

    "GetAnswerFromStudentIntent": function () {
        studentRequest.call(this, false);
        rp(options); //ここでpost
        this.emit(':tell', '担当者に伝えました、少々お待ち下さい');
    },

この書き方だと、postのレスポンスが返る前に this.emit() を実行していて、ひどい時には前回起動したスキルのレスポンスをemitしたりしました。
検索した結果、以下のissueを見つけました。
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/issues/44

どうやら非同期処理をしていることが原因のようでした。

まとめ

初めてJavaScriptとLambdaを触りましたが、思った以上に楽しかったです。
次の目標はslack message buttonを追加して、担当者が対応したことを確認できる感じにしたいです。
API Gatewayで作れるらしいので、調べてみます。

ikarosu_chihaya
私の熱いエンジニア活動 エンカツ 始まります
mfac
実際に人を動かすことを特徴とした位置情報連動型ゲーム及びサービスを開発しています。
http://www.mobilefactory.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away