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



我正在尝试编写API。AI显示来自Google的搜索结果,使用Webhook履行服务的卡片形式使用Google上的操作。我已经部署了演示应用程序"factsaboutgoogle",但它给出了静态响应。我想编写可以使用谷歌搜索引擎返回动态响应的索引.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);
};

要从在 Google API 信息中心创建 Google 自定义搜索引擎开始,请执行以下操作:

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

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

我已经根据您的要求使用此处的其余 api 代码起草了代码:

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. 在您的代码中,您没有任何地方调用performRequest()来实际执行搜索,因此您不会返回结果,也不会将它们添加到任何卡片中。您需要包含一个 success 参数,该参数是可以处理 JSON 结果的函数(responseObject(。

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

  3. 你不应该有一个空的简单响应。这将是说"这是您的查询结果"的好地方,因此.addSimpleResponse('Here are your results")之类的内容在该行中是最好的。

最新更新