actions on google での cheerio-httpcliを使ったスクレイピングで、fetchメソッドが動かない
初めて質問させていただきます。
Google Homeで、ある対戦ゲームのキャラクターに対する不利なキャラクターを教えてくれるアプリを作っています。
DialogflowのWebhook(firebase)を通して処理しています。
index.js内の処理内容としては、「<キャラクター名>のカウンター」で音声入力した際に、
こちらの統計サイト(http://jp.op.gg/champion/<キャラクター名>/statistics/)にある
Weak against欄の一番上のキャラクター名をスクレイピングで取得して、google assistantに返すというものになります。
スクレイピングはcheerio-httpcliというモジュールを使っています。
しかし、スクレイピングでの取得処理部分であるfetchメソッドが処理されていないようで、
fetchメソッド内のapp.askが動いておらず、変数nameの中身がundefinedとなっています。
なお、firebase deploy --only functions コマンドではエラーは出ていません。
スクレイピング処理の部分のみを抜き出して、別ファイルでコンソール出力した際はうまくできたのですが、
actions on googleもしくはfirebase と組み合わせるとうまくいかないです。
ご教授お願いいたします。
index.js
'use strict';
process.env.DEBUG = 'actions-on-google:*';
const { DialogflowApp } = require('actions-on-google');
const functions = require('firebase-functions');
exports.yourAction = functions.https.onRequest((request, response) =>
{
const app = new DialogflowApp({request, response});
const WELCOME_INTENT = 'input.welcome';
const UNKNOWN_INTENT = 'input.unknown';
const END_INTENT = 'default_end_intent';
const CHAMPION_COUNTER = 'Champion_Counter';
var client = require('cheerio-httpcli');
console.log('Request headers: ' + JSON.stringify(request.headers));
console.log('Request body: ' + JSON.stringify(request.body));
// Fulfill action business logic
function responseHandler (app) {
// Complete your fulfillment logic and send a response
let intent = app.getIntent();
switch (intent) {
case WELCOME_INTENT:
app.ask('ようこそ、LoLSmartCallへ');
break;
case UNKNOWN_INTENT:
app.ask('もう一度お願いします');
break;
case END_INTENT:
app.tell('ありがとうございました');
break;
case CHAMPION_COUNTER:
let requestChampionName = app.getArgument('LoL-Champions'); //音声入力されたキャラクター(チャンピオン)の名前が入る
let name = counterResearch(requestChampionName);
app.ask(requestChampionName + 'の苦手なチャンピオンは、' + name + 'です。');
break;
}
}
app.handleRequest(responseHandler);
function counterResearch(requestName) {
var url = 'http://jp.op.gg/champion/' + requestName + '/statistics/';
//ここまで動いていること確認済み
//TODO ⇓ここから動かない
client.fetch(url, {}, function(err, $, res, body){
$('.SideContent').each(function (idx){
//console.log('Weak against');
app.ask('動いています'); //動かない
var championName = $(this).find('.ChampionName').eq(0).text();
});
return championName;
});
}
});