質問編集履歴

1

ソースコードの追加

2021/08/22 02:13

投稿

hrt9092
hrt9092

スコア0

test CHANGED
File without changes
test CHANGED
@@ -81,3 +81,153 @@
81
81
  ・その他
82
82
 
83
83
  実機テストとしてAction on Googleに接続し、実機での動作を確認しています。
84
+
85
+
86
+
87
+ ### 追加情報(ソースコード)
88
+
89
+ index.js(Dialogflowで設定したFulfillment)
90
+
91
+ ```Node.js
92
+
93
+ 'use strict';
94
+
95
+
96
+
97
+ const functions = require('firebase-functions');
98
+
99
+ const { dialogflow } = require('actions-on-google');
100
+
101
+
102
+
103
+ const app = dialogflow();
104
+
105
+
106
+
107
+ const https = require('https');
108
+
109
+ const get = (url) => new Promise((resolve, reject) => {
110
+
111
+ https.get(url, (response) => {
112
+
113
+ let { statusCode } = response;
114
+
115
+ if (statusCode === 302 && response.headers.location ) { //GASの場合一度リダイレクトされるため
116
+
117
+ https.get(response.headers.location, function(res) {
118
+
119
+ let body = '';
120
+
121
+ res.on('data', (chunk) => body += chunk);
122
+
123
+ res.on('end', () => resolve(body));
124
+
125
+ return;
126
+
127
+ });
128
+
129
+ }
130
+
131
+ }).on('error', reject);
132
+
133
+ });
134
+
135
+
136
+
137
+ const SEARCH_INTENT = 'Search'; //検索用INTENT(③で発火するINTENT)
138
+
139
+ app.intent(SEARCH_INTENT,conv => {
140
+
141
+ const hostUrl = 'script.google.com';
142
+
143
+ const sheetPath = '******************************'; //GASのシートパス
144
+
145
+ let accessPath = '/macros/s/'+sheetPath+'/exec';
146
+
147
+
148
+
149
+ const options = {
150
+
151
+ hostname: hostUrl,
152
+
153
+ path: accessPath,
154
+
155
+ followAllRedirects : true,
156
+
157
+ headers: {
158
+
159
+ 'Content-Type': 'application/json',
160
+
161
+ 'Authorization': 'Bearer ' + '***************************************'
162
+
163
+ }
164
+
165
+ };
166
+
167
+
168
+
169
+ return get(options).then(response => {
170
+
171
+ conv.ask(JSON.parse(response).fulfillmentText);
172
+
173
+ });
174
+
175
+ });
176
+
177
+
178
+
179
+ const PLAY_INTENT = 'Play'; //再生用INTENT(⑤で発火させるINTENT、未実装)
180
+
181
+ app.intent(PLAY_INTENT,conv => {
182
+
183
+ let movie_id = conv.parameters['movie_id']; //⑤の命令文から動画の番号を取得
184
+
185
+ let youtube_url = get_url(movie_id); //youtubeのURLを取得
186
+
187
+
188
+
189
+ /*ここで⑥の返答とともに、端末Aでyoutube_urlの動画の再生を実現したい*/
190
+
191
+   conv.close("再生します");
192
+
193
+ });
194
+
195
+
196
+
197
+ function get_url(movie_id){
198
+
199
+ //対象動画のURLを取得する(こちらの機能の実装は目処がついています)
200
+
201
+   return 'https://www.youtube.com/watch?v=XXXXXXXXXX'
202
+
203
+ }
204
+
205
+
206
+
207
+ exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
208
+
209
+ ```
210
+
211
+
212
+
213
+ main.gs(index.jsから呼び出されるGAS。呼び出し部分のみ抜粋して記載)
214
+
215
+ ```Node.js
216
+
217
+ function doGet(e){
218
+
219
+ let message = '1)チャンネル名〇〇・タイトル××、2)~、3)~です'; //返却用メッセージ。実際はスプレッドシートから情報を取得して生成します。
220
+
221
+ return returnAsJSON({"fulfillmentText":message});
222
+
223
+ }
224
+
225
+
226
+
227
+ function returnAsJSON(obj){
228
+
229
+ return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
230
+
231
+ }
232
+
233
+ ```