Actions on GoogleでGoogleHome向けTwitter検索アプリを作ってみる【Fulfillment作成編】

前回記事からの続きになります。未読の方は本記事を読みすすめる前に読んでいただくことをおすすめします。

Fulfillment

FulfillmentはGoogle Assistantアプリの実処理を行うHTTPWebサービスです。
Google Assistantがユーザーが話した文章を解析した結果(Intentやパラメータ)をリクエストして受け取り、必要な処理を行ったのち、会話の次の内容をレスポンスとして返します。

Google Assistantのフォーマットに従ったWebサービスであれば何で作られていても問題ないのですが、今回はActions on Googleのオフィシャルサイトが推奨するCloud Functions For Firebaseを使用して作成します。

※今回作成しているFulfillmentはTwitter APIへのアクセスが必要ですが、Firebaseの無料版であるSparkプランではCloud FunctionsからのアウトバウンドアクセスはGoogleのサービスしか許されていません・・・。
申し訳ないのですが今回の記事のとおりに動かす場合は従量課金版のBlazeプランへのアップグレードをお願いしますm(_ _)m(お試しで使う分にはお金はほとんどかかりません。)

作成手順

1.前々回の記事で作成したプロジェクトのProject IDを確認します。Actions On GoogleのプロジェクトのOverview画面で確認できます。

2.今回はTwitter APIを使用して検索を行うので、TwitterのAPI Key(Consumer Key,Consumer Secret,Access Token Key,Access Token Secret)を取得してください。(参考サイト

3.Node.jsとnpmをインストールします。(公式サイト

4.Cloud Functionを作成するフォルダ(場所は任意です)を作成し、そちらに移動して下さい。

5.Firebase CLIをインストールします。

npm install -g firebase-tools

6.Firebaseにログインをします。コマンド実行後にブラウザでGoogleへのログイン画面が表示されますので、ログインを行ってください。

firebase login

7.Firebaseのセットアップを行います。まず以下のコマンドを実行します。

firebase init functions

実行後、以下のような表示がされますので、先ほど確認したProject IDが表示されましたらそれを選択してください。

? Select a default Firebase project for this directory: (Use arrow keys)
❯ [don't setup a default project]
TwitterSearch (【確認したProject ID】)
[create a new project]

先ほど確認したProject IDが表示されない場合は[don’t setup a default project]を選択してください。

次に以下の表示が出ましたらYを選択してください。

? Do you want to install dependencies with npm now?(Y/n)

8.7で[don’t setup a default project]を選択した場合には以下のコマンドを実行します。

firebase use 【確認したProject ID】

9.カレントフォルダにfunctionsというフォルダが作成されますので、そちらに移動してください。

10. npmでtwitter,actions-on-googleをインストールします

npm install twitter actions-on-google --save

11.functionsフォルダにあるindex.jsを以下の内容に置き換えてください。
このプログラムはユーザーが話した文章から取得されたパラメータ(search about ○○の部分)をハッシュタグとしてツイートを検索し、検索結果の最初のツイートをレスポンスとして返すという内容になっています。

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
// response.send("Hello from Firebase!");
// });
'use strict';

process.env.DEBUG = 'actions-on-google:*';
const App = require('actions-on-google').ApiAiApp;
const functions = require('firebase-functions');

const WELCOME_INTENT = 'input.welcome';
const SEARCH_WORD_INTENT = 'searchWord';
const SEARCH_WORD_ARGUMENT = 'searchWord';

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

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

function welcomeIntent(app) {
app.ask('Welcome to Twitter Search! Say a search word.');
}

function searchWordIntent(app) {
const searchWord = app.getArgument(SEARCH_WORD_ARGUMENT);
var twitter = require('twitter');

var client = new twitter({
//2で取得したTwitterAPIトークンやキーに置き換えてください。
consumer_key: 'XXXXXXXXXX',
consumer_secret: 'XXXXXXXXXX',
access_token_key: 'XXXXXXXXXX',
access_token_secret: 'XXXXXXXXXX',
});
console.log('Search Word is ' + searchWord);

client.get('search/tweets', {q: '#' + searchWord}, function(error, tweets, response) {
console.log('Search Word is ' + searchWord);
app.tell(tweets.statuses[0].text.replace(/http\S+/gi, '').replace(/#\S+/g, '').replace(/@\S+/g, ''));
});
}

const actionMap = new Map();
actionMap.set(WELCOME_INTENT, welcomeIntent);
actionMap.set(SEARCH_WORD_INTENT, searchWordIntent);
app.handleRequest(actionMap);
}
);

12.次に以下のコマンドを実行し、作成したfunctionをデプロイします。

firebase deploy --only functions

コマンド終了後に表示されるFunction URLを確認します。

Function URL (twitterSearch): https://us-central1-【確認したProject ID】.cloudfunctions.net/twitterSearch

13.API.AIを表示し、左メニューの「Fulfillment」リンクをクリックします。   

14.ENABLEDに変更後、12で確認したFunction URLを「URL」に入力し、「SAVE」ボタンをクリックします。

15.左メニューの「Intents」リンクをクリックし、前回記事で作成したIntentを選択します。

16.画面下部の「Use webhook」にチェックを入れ、「SAVE」ボタンをクリックします。

これでFulfillmentの作成とActionでのFulfillment設定は完了になります。

ここまででAction、Intent、そしてFulfillmentの作成が完了し、アプリが動くようになりました。
次回記事で作成したアプリのテストをしていきます。