

初めて質問させていただきます。  
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

[code]

    '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;
          });
      }
    });
    
[/code]

[![シミュレータ](https://i.stack.imgur.com/D0SMw.png)](https://i.stack.imgur.com/D0SMw.png)


CC BY-SA 3.0
2017-10-29T05:11:14.830
39116
2020-04-06T06:24:18.457
2020-04-06T06:24:18.457
3060
25964
question
node.js firebase web-scraping
actions on google での cheerio-httpcliを使ったスクレイピングで、fetchメソッドが動かない


Firebaseのプランは課金、または定額プランですか?  
無料プランのCloud FunctionsはGoogle以外のネットワークの外部通信に制限があります。

<https://firebase.google.com/pricing/>

従量課金のプランでも無料枠は存在するのでそちらに切り替えるか  
AppEngineなどのGoogleの別のプロダクト経由で通信するとよいでしょう。


CC BY-SA 3.0
2017-10-30T00:13:41.100
39131
2017-10-30T00:13:41.100
2260
39116
answer


I managed to understand something with the help on google translate.  
I'm currently working on a project where the focus is the same, that is
scraping some information from a particular website and make google assistant
tell them in our Action.  
I have the same problem and didn't manage to find a solution, even with
pricing enabled and everything set right. If you have managed to do it, please
let me know, if you haven't, I will link you a project on GitHub where this
guy somehow managed to do it, but i actually didn't understand why for him
worked and for me not.  
Here you are and lemme know!  
<https://github.com/fgandiya/virtual-jo>

* * *

和訳:

Google 翻訳を使って疑問を理解しようとしました。  
私は今同じようなプロジェクトに取り組んでいます。つまり、特定のウェブサイトから情報をスクレイピングして Action から Google Assistant
に伝えてもおうとしています。  
私も同じ問題に遭遇し、課金して正しく設定したものの解決には至りませんでした。もしあなたが解決できたのであれば、教えてください。また、もし知らなければ、どなたかが解決できたと言っている
GitHub 上のプロジェクトをリンクします。もっとも、私には何故彼がこれで解決できたのか分からないのですが……。  
そのプロジェクトはこちらです！  
<https://github.com/fgandiya/virtual-jo>


CC BY-SA 4.0
2018-05-14T08:58:45.043
43977
2018-05-21T08:36:08.273
2018-05-21T08:36:08.273
19110
28516
39116
answer