子どもに嫌われないように小言をCLOVAに代弁してもらった

#「そろそろご飯出来るよ～」
の後に秘められた母親の言葉を代弁してくれるclovaスキルを作りました。

#なぜ作ろうと思ったのか
どこの家庭でもある夕飯時の一コマでもある
「そろそろご飯できるよ～」という一見やさしそうに見える声掛けの裏には

●片づけなさい
●机をふきなさい
●箸や食器の準備を手伝いなさい

などなど、実は沢山の意味が含まれています。

これを毎日言い続けて「うるさいな～」と思われない為に、clovaに代弁してもらおうという企画です。
きっとclovaから声を掛ければ子どもたちも動いてくれるはず！

clova 頼みます！

#LINE CLOVAの設定
CLOVAの設定方法については今後再利用できるように別記事にさせていただきました。
[CLOVAの設定方法](https://qiita.com/misa_m/items/76d3a43bb3b82d389ff2)

#登録した呼び出し名は
・ねぇCLOVA、夕飯出来たよを起動して
・ねぇCLOVA、夕飯出来たよをひらいて
・ねぇCLOVA、夕飯出来たよにつないで
・ねぇCLOVA、夕飯出来たよ

この4パターンです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/034b27f6-4f30-b6db-125d-1afa6de16856.png)


これ以外のサンプル対話だとうまく起動しない事もあるので要注意です。

#node.jsを利用
node.jsを利用して、対話が出来るように設定をします。

##新規ファイル作成
routine.jsというファイル名を作りました。

```
npm init -y
```
初期化を忘れずに

##CLOVA CEK/express/body-parserをインストール

```
npm i @line/clova-cek-sdk-nodejs express body-parser
```

作成したコードは

```javascript
const clova = require('@line/clova-cek-sdk-nodejs');
const express = require('express');

const clovaSkillHandler = clova.Client
    .configureSkill()

//起動時に喋る
.onLaunchRequest(responseHelper => {
    responseHelper.setSimpleSpeech({
        lang: 'ja',
        type: 'PlainText',
        value: '夕飯が出来たよルーティンを代行します',
    });
})

//ユーザーからの発話が来たら反応する箇所
.onIntentRequest(async responseHelper => {
    const intent = responseHelper.getIntentName();
    const sessionId = responseHelper.getSessionId();

    console.log('Intent:' + intent);
    if (intent === 'DinnerActingIntent') {
        const slots = responseHelper.getSlots();
        console.log(slots);
        //デフォルトのスピーチ内容を記載 - 該当スロットがない場合をデフォルト設定
        let speech = {
            lang: 'ja',
            type: 'PlainText',
            value: `まだ登録されていないエリアです。`
        }
        if (slots.time === '夕飯') {
            speech.value = `${slots.time}がそろそろ出来ますよ。片づけは出来ていますか？お箸やお皿を準備して、積極的にお母さんのお手伝いをしてあげてくださいね`;
        } else if (slots.time === '昼食') {
            speech.value = `${slots.time}がそろそろ出来ますよ。片づけは出来ていますか？お箸やお皿を準備して、積極的にお母さんのお手伝いをしてあげてくださいね`;
        } else if (slots.time === '昼食') {
            speech.value = `${slots.time}がそろそろ出来ますよ。片づけは出来ていますか？お箸やお皿を準備して、積極的にお母さんのお手伝いをしてあげてくださいね`;
        }
        responseHelper.setSimpleSpeech(speech);
        responseHelper.setSimpleSpeech(speech, true);
    }
})

//終了時
.onSessionEndedRequest(responseHelper => {
        const sessionId = responseHelper.getSessionId();
    })
    .handle();


const app = new express();
const port = process.env.PORT || 3000;

//リクエストの検証を行う場合。環境変数APPLICATION_ID(値はClova Developer Center上で入力したExtension ID)が必須
const clovaMiddleware = clova.Middleware({ applicationId: 'YOUR_EXTENSION_IDに書き換え' });
app.post('/clova', clovaMiddleware, clovaSkillHandler);

app.listen(port, () => console.log(`Server running on ${port}`));
~~~

自分の情報へ書き換える箇所は３つです。

1.「YOUR_EXTENSION_IDに書き換え」という箇所は作成したCLOVAスキルのExtension IDを入力します。

```javascript

//リクエストの検証を行う場合。環境変数APPLICATION_ID(値はClova Developer Center上で入力したExtension ID)が必須
const clovaMiddleware = clova.Middleware({applicationId: 'YOUR_EXTENSION_IDに書き換え'});
app.post('/clova', clovaMiddleware, clovaSkillHandler);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/0cdd9930-78a9-7f0e-c4d7-f0b16bd9d40d.png)

2.インテントを自分で作成したインテントへ変更

```javascript
console.log('Intent:' + intent);
    if (intent === 'DinnerActingIntent') {
        const slots = responseHelper.getSlots();
        console.log(slots);
        //デフォルトのスピーチ内容を記載 - 該当スロットがない場合をデフォルト設定
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/99682ca8-f5ee-8682-e288-f46fa9bfb649.png)


3.カスタムインテントで作成した自分のスロットへ変更

```javascript
if (slots.time === '夕飯') {
            speech.value = `${slots.time}がそろそろ出来ますよ。片づけは出来ていますか？お箸やお皿を準備して、積極的にお母さんのお手伝いをしてあげてくださいね`;
        } else if (slots.time === '昼食') {
            speech.value = `${slots.time}がそろそろ出来ますよ。片づけは出来ていますか？お箸やお皿を準備して、積極的にお母さんのお手伝いをしてあげてくださいね`;
        } else if (slots.time === '昼食') {
            speech.value = `${slots.time}がそろそろ出来ますよ。片づけは出来ていますか？お箸やお皿を準備して、積極的にお母さんのお手伝いをしてあげてくださいね`;
        }
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/869e540e-3a0a-b78b-3dcd-da0c820ef38d.png)


##実行

```
node routine.js
```
で実行した後、ngrokを立ち上げます。

```
npx ngrok http 3000
```

ngrokで発行されたURLをCLOVA Developerへ登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/5eaba1f6-3fc8-512e-258b-cd14e272c07c.png)

【サーバー設定】の中にある【ExtensionサーバーのURL】という箇所へURLを入力します。
その際、最後に【/clova】を忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/82ac452f-407c-9f8f-2383-b4e2af0cb75e.png)


#CLOVA Developerでまずはテスト
返答返ってきました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/add07e69-02d7-c824-0c9f-11d08b0f339c.png)

#CLOVAでテスト
「すいませんわかりませんでした」と返ってきてしまいました。
[解決した方法の備忘録](https://qiita.com/misa_m/items/b0c77a9adde1ba06e9ca)

呼び出しサブを変える事で解決！

[CLOVAスキルの動画をtweetしました!](https://twitter.com/HanamiWeb/status/1335431661261975554)