LoginSignup
1
4

More than 3 years have passed since last update.

「AlexaスキルとSlackで買いものを便利に」をやってみた

Posted at

はじめに

はじめまして。oka-shiです。

Alexaに買いたいものを伝えるとSlackに通知される「スラックスキル」を作成してみました。元ネタは、下記のよーぐると様のブログとなります。
 AlexaスキルとAWS Lambda, Slackを使って我が家の買いもの管理を便利にした話

Alexa初心者でも簡単に実装できたので、参考にしたサイト、Alexaスキル設定、Lambda→Slackへの連携 などをまとめてみました。

対象読者

  • Alexaスキルを作ってみたい方
  • Lambda(Node.js 10.x版)→Slackへの連携をやりたい方

説明すること

  • スラックスキルの概要
  • Alexaスキル作成の前にやること
  • Alexaスキル作成のポイント
  • Lambda(Node.js 10.x版)→Slackへの連携設定
  • Alexa初心者がつまずいたトコ

説明しないこと

  • スラックスキルの詳細
  • Alexaの初期設定や基礎知識
  • Node.jsの全般

目次

  • 0. スラックスキルとは
  • 1. Alexaスキル作成の前にやること
  • 2. Alexaスキル作成のポイント
    ・スロットタイプ設定
    ・インテント - サンプル発話設定
    ・インテント - インテントスロット設定
  • 3. Lambda(Node.js 10.x版)→Slackへの連携設定
    ・Slack側:Webhook URLを取得する
    ・Lambda側:Webhook URLを設定する
    ・Lambda→Slackへの連携確認
  • 4. Alexa初心者がつまずいたトコ
    ・Lambda(Node.js 10.x版)のHTTPS通信について
    ・AlexaスキルのLambdaのデバッグログについて
  • 5. まとめ
  • 参考サイト

0. スラックスキルとは

Alexaに買いたいものを伝えるとSlackに通知される、買いものリスト通知スキルです。イメージを図にするとこんな感じです。
ポイントは、買いものリストをSlackで一元管理しているトコです。買いものリストは誰が片付けても良いので、家族で分担できるのがいいですね。

■買いものリスト通知のイメージ

買いもの通知.jpg

スラックスキルの詳細を知りたい方は、よーぐると様のブログを参照頂ければと思います。
また、Alexaスキルのしくみに興味がある方は、Alexa道場 S02 EP02 Alexaスキルのしくみ が丁寧で分かりやすいと思います。

1. Alexaスキル作成の前にやること

Alexaスキルを作成する前に、初期設定、Alexa開発者アカウント、基礎知識が必要となるため、参考にしたサイトを記載します。
基礎知識は、Alexa道場がとても理解しやすかったのでオススメです。本記事のレベルであれば、「Season 1 : はじめてのAlexaスキル開発」~「Season 3 : スロットを使いこなそう」を見ておけば十分でした。

2. Alexaスキル作成のポイント

Alexaスキル作成におけるポイントとして、インテントとスロットの設定が必要となります。
買いものリスト通知の「スラックスキル」の場合、Alexa道場のハンズオン「コーヒーショップスキル」をベースにすると簡単に作成することができます。
以降、「コーヒーショップスキル」からの差分を記載します。

スロットタイプ設定

Alexaに「買いたいもの」を認識させるために、スロットタイプを設定します。
oka-shi家の買いたいものは食料品が多いので、AMAZON.Foodを指定しました。

image.png

インテント - サンプル発話設定

Alexaに会話の中から「買いたいもの」を識別してもらうために、インテントのサンプル発話を設定します。
サンプル発話に買いたいもののキーワード{things}を埋め込むことで、「買いたいもの」を抽出できるようになり、Lambda側へ送信できるようになります。

image.png

{things} を買っておいて
{things} 買っておいて
{things} を買っといて
{things} 買っといて
{things} って書いて
{things} を書いて
{things} を登録して
{things} を入れて
{things} を追加して
{things} が欲しい
{things} が食べたい

インテント - インテントスロット設定

買いたいもののキーワード{things}とスロットタイプを関連付けます。

image.png

3. Lambda(Node.js 10.x版)→Slackへの連携設定

LambdaからSlackへの連携は、SlackのWebhook URLを使用して行います。

Slack側:Webhook URLを取得する

別記事の「Slack側:Webhook URLを取得する」を参照下さい。
  BizDevOpsサービス導入ガイド GitLab + Slack編

Lambda側:Webhook URLを設定する

SlackのWebhook URLに向けて、JSON形式のメッセージを指定して、HTTPSプロトコルでリクエストします。
コードは、下記サイトを参考にさせて頂きました。

コード上のpathは、Slack側から取得したWebhook URLを指定すればOKです。

また、Slackに投稿するメッセージ設定ですが、usernameやicon_emojiを指定してもユーザ名やアイコンを変更できない仕様になったそうなので、指定を削除しました。

index.js
const ToBuyIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'ToBuyIntent';
    },
    handle(handlerInput) {
        // thingsスロット(=買うもの)を取得
        const slots = handlerInput.requestEnvelope.request.intent.slots;
        let things = slots.things.value;

        // Alexaの発話
        const speakOutput = `${things}ですね。わかりました。`;

        // Slackに投稿するためのパラメータをCloudWatch Logsへ出力
        console.log(`Slackに${things}を投稿しました。`);

        // メッセージ設定
        var data = JSON.stringify({"text": `${things}を買っておいてね。`});

        // オプション情報設定
        var  options = {
            hostname: 'hooks.slack.com',
            port: 443,
            path: '/services/AAAAAAAA/BBBBBBBB/CCCCCCCCCCCCCCC',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(data)
            }
        };

        // リクエスト
        const https = require('https');
        var req = https.request(options, (res) =>{
            if(res.statusCode===200){
                console.log("OK:"+res.statusCode);
            }else{
                console.log("Status Error:"+res.statusCode);
            }
        });

        // そもそもなエラー時
        req.on('error',(e)=>{
            console.error(e);
        });

        // データ送信
        req.write(data);
        // 終わり
        req.end();

        return handlerInput.responseBuilder
            .speak(speakOutput)
            //.reprompt('add a reprompt if you want to keep the session open for the user to respond')
            .getResponse();
    }
};

Lambda→Slackへの連携確認

alexa developer consoleのAlexaシミュレータを使うことで、Slackへの連携を確認することができます。

今回、スロットタイプにAMAZON.Foodを指定しただけですが、食料品以外のキーワードも自動で認識してくれるようです。Alexaは賢くて良い子ですね。

Alexaシミュレータのイメージ

image.png

Slackの買いものリストのイメージ

image.png

4. Alexa初心者がつまずいたトコ

Lambda(Node.js 10.x版)のHTTPS通信について

AlexaスキルとAWS Lambda, Slackを使って我が家の買いもの管理を便利にした話を参考に、HTTPS通信をrequire("request-promise")を実行したところ、以下のエラーとなりました。

Unknown application error occurred Runtime.ImportModuleError
Runtime.ImportModuleError: Error: Cannot find module 'request-promise'

今回は、動かすことを優先したかったので、HTTPS通信はrequire('https')で実装しました。Node.js v10.23.0 Documentationは、きちんと読めていないのでリンクを残しておきます。

AlexaスキルのLambdaのデバッグログについて

AlexaスキルのLambdaのデバッグログは、alexa developer consoleからCloudWatch Logsへ遷移しないと表示できないようです。
また、CloudWatch Logsへ遷移した場合でも、以下のエラーが表示されることがありました。

フェデレーションログイン: VoiceHubSSORole/VoiceHubSSORole

ログストリームの説明中にエラーが発生しました。
The specified log group does not exist.

ロググループが存在しません
特定のロググループ: /aws/lambda/xxxxx-xxxx-xxxx-xxxx-xxxxxxxx はこのアカウントまたはリージョンに存在しません。

原因は、alexa developer consoleのLogs選択で、CloudWatch Logsを出力していないリージョン(Defaultのバージニア北部)を指定していたためです。
私の場合は、alexa developer consoleのLogsでオレゴンを選択すれば、正しく表示されました。

image.png

5. まとめ

買いものリスト通知の「スラックスキル」を使ってみた感想ですが、声だけで買いたいものをSlackに通知できるのは便利でした。

  • 料理をしている際に食材や調味料が少なくなったことに気づいたら、料理を続けながら声だけで買いものを依頼できる。
  • 幼児がアイスやお菓子を食べたくなった際に、声だけでおやつを依頼できる。
  • 病気の際にも使えると思います。あと介護でも使えそうですね。

また、買いものリストをSlackで一元管理しているので、家族で買いものを分担できるのがいいですね。(大事なことなので)

Alexaスキルを作ってみた感想ですが、AWS公式のAlexa道場が分かりやすく、Alexa初心者でもサクサク作れて楽しかったです。AWSは公式のWebinarが充実していたり、情報を上げて頂ける方が多いので、キャッチアップをやりやすいのがいいですね。

参考サイト

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4