Actions on GoogleのIntegrationsで色んなBot作れる🤗🤗楽しい！すごい！という話(MessangerBot作成編)

去年は読んでるだけでしたが、今年は参加します！Life is Tech!Androidコースでメンターをしているみーたんです！
８日目ですが、既に色んな方向性から様々な技術の話が聞けて楽しいですね！
Life is Tech!のメンターをしている大学生は、色んなバックグラウンドを持った人がたくさんいるので、これからの投稿もすごく楽しみです！:couple_ww:

-----------

さて、２０１７年ももうすぐ終わってしまいますが、去年はChatBotブームで**会話型**のインターフェースが流行るぞ〜〜と思っていると、今年は**スマートスピーカー**が流行りましたね！
特に、2017年下半期にはGoogleHome、AmazonAlexaが日本語に対応、日本に上陸したり、Clova WAVEが発売されるなど、日本語に対応した様々なスマートスピーカーが登場しましたね。

プログラミングを学んでいる身としては、使う妄想より作る妄想が膨らんでしまいます。どんなふうに使えるかな〜と色々夢が膨らみますね！:earth_africa:

Actions on GoogleのIntegrationsを使うと簡単に色々なBotがつくれて感動したので今回はGoogleHomeの中身？である、**Actions on Google**でBotを作ってみたいと思います！！！

# Actions on Googleでできること
タイトルにはBotを作れると書きましたが、Actions on Googleではまず、Actions on Googleのスキル(?)が作れます。（それもBotに含むのでしょうか？）
GoogleHomeはもちろん、Android端末に「OK,Google」と話しかけて起動するのもこれです。
なので、GoogleHomeで動くスキルは、GoogleHomeを持っていなくてもAndroidを持っていればためせるということですね！(iPhoneにもアプリがあるみたいです！すごすぎる！)

# プロジェクト作成
<img width="1280" alt="スクリーンショット 2017-12-08 15.58.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/a7c9735a-b295-9623-0f26-07b063d65e96.png">
https://developers.google.com/actions/

右上のACTIONS CONSOLEをクリックして進みましょう

<img width="1093" alt="スクリーンショット 2017-12-08 16.01.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/1601163c-a6d0-ff60-be44-58fa732c28e3.png">

Add/import projectをクリックしてプロジェクトを作ります。

<img width="527" alt="スクリーンショット 2017-12-08 16.05.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/eeb87ef3-ec07-70b6-eb82-5e2e981b3920.png">

Project nameとCountryを入力してCREATEしてください。

<img width="1264" alt="スクリーンショット 2017-12-08 16.06.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/2ad77079-7e0e-f9bf-4a4c-e832948e1e94.png">

色々なアプリが選べますが、今回は左の**Dialogflow**を使います。
BUILDをクリックして

<img width="692" alt="スクリーンショット 2017-12-08 16.08.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/fed76719-827d-9dc7-d15e-d5ab4eac51c2.png">

CREATE ACTION ON DIALOGFLOWをクリックしましょう。

## 初期設定
コンソール画面に飛ぶと、最初の画面でデフォルトの言語設定/タイムゾーンの設定が出来ます。
<img width="665" alt="スクリーンショット 2017-12-08 16.12.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/c1297e18-286d-233f-f5b5-51bebaadcd01.png">
日本語対応しています！
会話したい言語を選んでください。今回は日本語で進めます。タイムゾーンも東京で。

設定が終わったらCREATEを押しましょう。

# 機能
<img width="920" alt="スクリーンショット 2017-12-08 16.14.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/6016b332-315b-9fce-931b-aad2af341c5a.png">

## intents
intetnsは、「こう言ったらこう言ってください」の指定ができるプロパティーです。
初めから入っている`Default Welcome Intent`は、OK,Googleをして一番初めに話してもらう内容です。

## Entities
Entitiesは単語帳といったかんじで、そこに登録した単語を識別出来ます。
例えば、私のQiitaのユーザーネームは@MII-CHANGですが、これが私、okabe miyuu、ないしはみーたんということも、ここにまとめて１人の人物として登録することが出来ます。
後で詳しく説明します。

## Integrations
これが今回私が特に感動したIntegrationsです。
<img width="651" alt="スクリーンショット 2017-12-08 16.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/7190d666-406a-7ac2-d938-c11e26c7d546.png">
なんでも作れる！！

Actions on Googleの１つのProjectで色々なサービスに同じ内容のBotを作ることが出来ます。

## Fulfillment
こう言ったらこう言うくらいの簡単なスクリプトだとコードを書かずに作れてしまうのですが、もうちょっと複雑なことをしたいとき、ここでwebhookを設定できます。
<img width="905" alt="スクリーンショット 2017-12-08 16.30.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/350ef6c8-b2ce-d66c-dcb6-835f4e5730ed.png">

自分のサーバーのURLを指定してもいいし、ブラウザ内にエディタがあるので、Node.JSならここに貼り付けて動きます（FireBaseに勝手にデプロイされます）

#プログラミングレスで簡単なアプリを作る
まずはIntentとEntitiesを使ってコードを書かずに簡単なアプリを作ってみようと思います

##Intentだけで動かす
まずはIntentだけで動く物を作ってみます。
### Intentを作る
- IntentsメニューからCREATE INTENTをおして新しいIntentを作りましょう。
<img width="902" alt="スクリーンショット 2017-12-08 16.41.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/e4a2b6b6-feee-33db-f4c4-a8f8b8617ab5.png">
名前はQiestionとしました。

### User saysの設定
- User saysにユーザーが言ってくると想定される言葉を書きます。
今回は、**みーたんの好きな食べ物を教えてくれるスキル**を作りたいと思います。
- 私の好きな食べ物を聞く時にする質問で想定される物をUser saysに登録していきます。
<img width="637" alt="スクリーンショット 2017-12-08 17.39.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/d1b9401f-eeb3-4bb9-6900-21c1e17d382b.png">


### Responseの設定
- Responseに解答を書きます。
<img width="628" alt="スクリーンショット 2017-12-08 17.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/5f7dbea0-631a-4c6d-d234-1a1fdc315682.png">

複数登録すると１度質問を受けた時にこの中からランダムで１つ選んで答えてくれます。

一旦これで動かしてみます。右上のSAVEを押して保存しましょう。

### 動かしてみる
- Integrationsに移動し、GoogleAssistantのSETTINGSをクリックしましょう。
<img width="798" alt="スクリーンショット 2017-12-08 17.10.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/9e8a2eaf-7cc3-1d7b-3c9b-f4a48ec2929e.png">
- Welcome Intent
Welcome Intentは上に書いたように最初に話されるセリフです。今回は何も変更していないのでこのままにします。
- Additional triggering intents
他に作ったIntentを登録する項目です。先程作ったQuestion Intentを設定しましょう。

UPDATE DRAFTしてください。動かしてみましょう。

#### 実機
AndroidスマホやGoogleHomeがあれば、現在Actions on Googleにログイン中のアカウントと同じアカウントでログインすることで開発中のスキルを試すことが出来ます。

#### シミュレーター
コンソール（https://console.actions.google.com/）
に戻ってシミュレーターで動かすことも出来ます。

#### テスト
開発画面の右にTry it Now!というところがあります。ここにUser saysに登録した内容を入力すると、簡易的に応答を受けることも出来ます。

今回は実機（スマホ）で動かしました。
Google Accistantを開いて「テスト用アプリにつないで」と発言します。
どうしても、テスト用アプリに接続してと言いがちで苦戦しました。接続してだと認識されないので、しっかり
「テスト用アプリに**つないで**」と発言しましょう。

![タイトルなし.gif](https://qiita-image-store.s3.amazonaws.com/0/93899/7c3ca721-6e85-a127-5b87-f63493dc45d5.gif)

## Entityを使ってみる
Entitiesは単語帳だという話をしました。
みーたんの呼び名を色々変えるためにEntitiesに設定してみましょう。

### Entitiesを作る
Entitiesに移動してCREATE ENTITYしましょう
<img width="661" alt="スクリーンショット 2017-12-08 18.12.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/42c4b3a4-f264-b7b0-5c92-e16f930bf5d9.png">

NameというEntitiyにしました。

### IntentでEntityに登録した内容のものを関連付ける
今回"みーたん"という言葉に、"岡部""岡部さん"を仲間にました。
先程"みーたん"でしか名前を認識しなかったIntentに、Entityを関連付けて"みーたん"でも"岡部"でも"岡部さん"でも反応するようにします。

- Actionの項目をこのように設定します。
<img width="615" alt="スクリーンショット 2017-12-08 18.04.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/1373e244-49f8-c89c-8fd0-71c0590597ac.png">

- User saysのみーたんの部分を選択すると、@Nameが出てくるのでクリックします。
![タイトルなし1.gif](https://qiita-image-store.s3.amazonaws.com/0/93899/714525ad-f74a-3d57-d760-90d42ff1c34c.gif)
こんな感じで全部に色をつけましょう。

### 動かしてみる
![タイトル.gif](https://qiita-image-store.s3.amazonaws.com/0/93899/92144553-ef92-9e0c-9249-a5854d26ffbc.gif)

どんな名前でも私の好きな食べ物を表示してくれるようになりましたね！

## Node.JSでちょこっと複雑なアプリを作る
私の好きな食べ物だけを答えるアプリがコードを書かずともできました。
では、ちょこっと条件分岐させて、私の好きな動物も教えてもらえるようにしましょう。
### FavoriteCategoryのEntityを作る
<img width="651" alt="スクリーンショット 2017-12-08 20.13.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/5a30bba5-63a4-2ec5-7263-6be33825acde.png">
食べ物と動物を判定するために新たにEntityを作りました。

### Intentの質問を編集する
<img width="630" alt="スクリーンショット 2017-12-08 20.15.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/672cc559-e6fc-fe16-7b35-d2d0f90f7acf.png">
好きな動物と食べ物を聞くUserSaysを作り

<img width="638" alt="スクリーンショット 2017-12-08 20.15.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/f21383ee-8111-2061-cc36-2d321190def5.png">
それぞれにEntityを関連付けます。

### webhookを使うようにする
<img width="617" alt="スクリーンショット 2017-12-08 20.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/c368de0f-b138-4ba8-02dd-4ce75066fd88.png">
今回コードを書いて動かすため、Use webhookにチェックを入れましょう。

###Fulfillmentを編集する
今回は、ブラウザのエディタに直接コードを書いていきます。
ENABLEDにしてください。
<img width="646" alt="スクリーンショット 2017-12-08 20.17.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/fe098b70-20d5-012f-2a99-a67718604ad8.png">

ENABLEDにすると、サンプルコードがでてきます。サンプルコードのはじめのほうを参考にしたプログラムを書きました。

```javascript:index.js
'use strict';

const functions = require('firebase-functions');
const {
  DialogflowApp
} = require('actions-on-google');

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {

  const app = new DialogflowApp({
    request,
    response
  });

  let favoriteCategory = app.getArgument('FavoriteCategory');
  let foodList = ['唐揚げ', 'カレー', 'オムライス', '漬物'];
  let animalList = ['犬', 'キリン', 'ゾウ', 'トカゲ'];
  let favorite = 'default';
  switch (favoriteCategory) {
    case '食べ物':
      favorite = foodList[Math.floor(Math.random() * foodList.length)]
      break;
    case '動物':
      favorite = animalList[Math.floor(Math.random() * animalList.length)];
      break;
  }
  app.ask(favorite + 'がすきです');
});

```

サンプルなので、簡単に配列とcase文を使ってやりましたが、かっこよくないです:frowning2:
FavoriteCategoryの結果を見て、それぞれの配列の中から１こランダムで変数に入れて、それをGoogleAssistantに喋らせるという内容です。

コードが書けたら、左下のDeployボタンを押しましょう。
`package.json`の内容はデフォルトのままで足ります。

### 動かしてみる

![タイト.gif](https://qiita-image-store.s3.amazonaws.com/0/93899/4abea915-1ab7-e7c6-9294-a5e2810b2748.gif)

"動物"と"食べ物"を判定してそれぞれにあった内容の結果を話してくれました！

#Integrations
<img width="651" alt="スクリーンショット 2017-12-08 16.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/60da0836-7fe9-6b86-2f48-97dae2809162.png">
Integrationsを使うと、今Google Assistant用に作ったアプリが簡単に他のSNSなどで動かせます。
今回はFacebookで動かしてみます。

## Facebook botを作る
これはこの記事では書きません。調べるとたくさん出てきます！
FacebookPageを作ると誰でもbotが作れます。

## IntegrationsでFacebookMessangerをONにする
Integrationsのページに行き、Messengerの項目をONにして、SETTINGSを開いてください。
<img width="799" alt="スクリーンショット 2017-12-08 20.26.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/93899/7c062101-9770-7f9c-90aa-fdbca6d36f9c.png">
このような画面が開くと思います。

## 設定の内容
### Callback URL
Facebook botのwebhookにこのURLを追加します。
### VerifyToken
facebook側に設定したVerifyTokenを入れます。webhookの設定をする時に一緒に設定するものです。
### Page Access Token
Facebook botのアクセストークンを入れてください。

## 動かしてみる
![タイ.gif](https://qiita-image-store.s3.amazonaws.com/0/93899/ea9a598f-b34a-b954-b42b-ce2c202c8871.gif)


無事、Facebook botでも同じ内容が動きました！！！
Actions on Googleで1つスキルを作れば、色んなプラットフォームでbotを作れちゃうなんてすごいですね！！！

#まとめ
ちょっと投稿が遅くなっちゃいましたがいかがでしたでしょうか！:muscle:
個人的にアドベントカレンダー初挑戦だったので緊張しましたが、次に良いバトンが回せればと思います！！
botが流行った時にオウムとかを作ってみて満足していたのですが、声で操作できるものと組み合わせると色々と夢が広がりますね！
私は毎朝身支度をしながらその日の天気をGoogle Assistantに聞いていますが、何でも声で操作できたら便利ですね〜〜

次は同じくAndroidコースのメンターをしていてマイクラコースのメンターもしている！ほーりー（@HALU5071）です！
どんな記事か楽しみ！