如何显示谷歌搜索结果的动态响应?

时间:2017-06-19 05:29:20

标签: node.js google-search google-search-api dialogflow actions-on-google

我正在尝试编程API.AI以使用webhook履行服务以卡片形式使用Google上的操作来显示Google的搜索结果。 我已经部署了演示应用程序“factsaboutgoogle”,但它提供了静态响应。 我想编写index.js代码,可以使用谷歌搜索引擎返回动态响应。

任何人都可以帮助我们使用代码吗?

这是我现在正在使用的代码:

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


// [START YourAction]
exports.videoplayer = (request, response) => {
  const app = new App({request, response});
  console.log('Request headers: ' + JSON.stringify(request.headers));
  console.log('Request body: ' + JSON.stringify(request.body));


  // Fulfill action business logic
  function responseHandler (app) {


    var querystring = require('querystring');
    var https = require('https');


    var host = 'https : //www.googleapis.com/customsearch/v1?key=*****';
    var apiKey = '*****';
    var sessionId = null;
    var deckId = '';


    function performRequest(endpoint, method, data, success) {
      var dataString = JSON.stringify(data);
      var headers = {};

      if (method == 'GET') {
        endpoint += '?' + querystring.stringify(data);
      }
      else {
        headers = {
          'Content-Type': 'application/json',
          'Content-Length': dataString.length
        };
      }
      var options = {
        host: host,
        path: endpoint,
        method: method,
        headers: headers
      };


      var req = https.request(options, function(res) {
        res.setEncoding('utf-8');
        var responseString = '';
        res.on('data', function(data) {
          responseString += data;
        });

        res.on('end', function() {
          console.log(responseString);
          var responseObject = JSON.parse(responseString);
          success(responseObject);
        });
      });

      req.write(dataString);
      req.end();
    }
  }

  function basicCard (app) {
    app.ask(app.buildRichResponse()
    // Create a basic card and add it to the rich response

    .addSimpleResponse('')
    .addBasicCard(app.buildBasicCard(dataString)
      .setTitle('your query result')
      .addButton('Read more')
      .setImage('https://example.google.com/42.png', 'Image alternate text')
    ));
  }

  const actionMap = new Map();
  actionMap.set('videoplayer', responseHandler);

  app.handleRequest(actionMap);
};

2 个答案:

答案 0 :(得分:0)

首先在Google API信息中心上创建Google自定义搜索引擎:

https://developers.google.com/custom-search/json-api/v1/using_rest

您必须使用rest api查询Google并获得结果。

我已根据您的请求使用其余的api code here起草了代码:

var querystring = require('querystring');
var https = require('https');

var host = 'https : //www.googleapis.com/customsearch/v1?
key=INSERT_YOUR_API_KEY&cx=017576662512468239146:omuauf_lfve&q=<The word you 
want to search>';
var apiKey = '*****';
var sessionId = null;
var deckId = '';

function performRequest(endpoint, method, data, success) {
 var dataString = JSON.stringify(data);
 var headers = {};

 if (method == 'GET') {
  endpoint += '?' + querystring.stringify(data);
 }
 else {
  headers = {
   'Content-Type': 'application/json',
   'Content-Length': dataString.length
 };
}
var options = {
host: host,
path: endpoint,
method: method,
headers: headers
};

var req = https.request(options, function(res) {
res.setEncoding('utf-8');

 var responseString = '';

  res.on('data', function(data) {
  responseString += data;
 });

 res.on('end', function() {
 console.log(responseString);
 var responseObject = JSON.parse(responseString);
 success(responseObject);
 });
});

 req.write(dataString);
 req.end();
}

答案 1 :(得分:0)

代码存在许多问题。

  1. 您的代码中没有任何地方致电 performRequest()来实际进行搜索,因此您无法获得结果,也无法添加结果任何卡片。您需要包含success参数,该参数是可以处理JSON结果的函数(responseObject)。

  2. 我没有看到任何看起来像success函数的好候选人的函数。正如您所注意到的,您的basicCard()函数只是将静态信息放在那里。您需要修改它以循环responseObject的结果并使用它来构建您想要的卡片。 (每个结果可能只有一张卡片,因此您可以多次拨打addBasicCard()。您可以循环调用它并将其添加到您正在构建的丰富响应中。)

  3. 你不应该有一个空的简单回复。这将是一个很好的地方说'#34;以下是您的查询结果&#34;,因此.addSimpleResponse('Here are your results")之类的内容最适合该行。