Как отобразить динамический ответ из результатов поиска Google?
Я пытаюсь запрограммировать API.AI для отображения результатов поиска из Google, используя Действия в Google в виде карточек, используя службу выполнения веб-крюков. Я развернул демонстрационное приложение "factaboutgoogle", но оно выдает статический ответ. Я хочу написать код index.js, который может возвращать динамический ответ с помощью поисковой системы Google.
Кто-нибудь может помочь нам с кодом?
Это код, который я использую прямо сейчас:
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 ответа
Есть ряд проблем с кодом.
Нигде в вашем коде вы не звоните
performRequest()
чтобы на самом деле выполнить поиск, чтобы вы не получали результаты назад и не добавляли их ни к каким картам. Вам нужно будет включитьsuccess
параметр, который является функцией, которая может обрабатывать результаты JSON обратно (responseObject
).Я не вижу никакой функции, которая выглядела бы как хороший кандидат для этого
success
функция. ВашbasicCard()
Функция, как вы заметили, просто помещает туда статическую информацию. Вам нужно изменить это, чтобы зациклить результатыresponseObject
и использовать его для создания карт, которые вы хотите. (Вероятно, одна карта на результат, поэтому вы бы позвонилиaddBasicCard()
многократно. Вы можете вызвать это в цикле и добавить к расширенному ответу, который вы создаете.)Вы не должны иметь пустой простой ответ. Это было бы хорошим местом, чтобы сказать "Вот ваши результаты запроса", так что-то вроде
.addSimpleResponse('Here are your results")
будет лучше в этой линии.
Чтобы начать с создания пользовательской поисковой системы Google на панели инструментов API Google:
https://developers.google.com/custom-search/json-api/v1/using_rest
Вы должны запросить Google, используя остальные API и получить результаты.
Я разработал код в соответствии с вашим запросом, используя остальной код 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();
}