【问题标题】:How to display dynamic response from google search results?如何显示来自谷歌搜索结果的动态响应?
【发布时间】:2017-06-20 19:16:47
【问题描述】:

我正在尝试对 API.AI 进行编程以显示来自 Google 的搜索结果,使用 Google 上的 Actions 以卡片的形式使用 webhook 实现服务。 我已经部署了演示应用程序“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);
};

【问题讨论】:

  • 您是在问如何进行搜索吗?或者如何将搜索结果变成卡片? StackOverflow 上的良好做法是展示您迄今为止所做的工作并解释哪些似乎不起作用。
  • 两者。我正在尝试在聊天机器人中以卡片的形式显示搜索结果。
  • 您能否展示您当前拥有但无法正常工作的代码并描述您得到了什么?

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


【解决方案1】:

首先在 Google API 仪表板上创建 Google 自定义搜索引擎:

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

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

我已根据您的要求使用其余 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();
}

【讨论】:

  • 我使用github.com/actions-on-google/apiai-webhook-template-nodejs/blob/… 对代码进行了一些更改,但它仍然没有返回任何搜索值。
  • 我想你已经创建了自定义搜索,当你执行时你得到一个错误或者你根本没有得到结果。在这两种情况下,我建议首先在代码之外执行和测试其余的 API .要测试在浏览器中访问以下网址https://www.googleapis.com/customsearch/v1? key=INSERT_YOUR_API_KEY&amp;cx=017576662512468239146:omuauf_lfve&amp;q=&lt;The word you want to search&gt;
  • cx=017576662512468239146 必须替换为您的自定义搜索 ID
  • 我已经在答案中发布了代码,请看一下。
【解决方案2】:

代码有很多问题。

  1. 您的代码中没有任何地方调用 performRequest() 来实际进行搜索,因此您不会得到结果,也不会将它们添加到任何卡片中。您需要包含一个 success 参数,该参数可以处理返回的 JSON 结果(responseObject)。

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

  3. 您不应该有一个空的简单响应。这是一个说“这里是你的查询结果”的好地方,所以像.addSimpleResponse('Here are your results") 这样的东西最好放在那一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多