我正在尝试编写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();
}
代码存在许多问题。
-
在您的代码中,您没有任何地方调用
performRequest()
来实际执行搜索,因此您不会返回结果,也不会将它们添加到任何卡片中。您需要包含一个success
参数,该参数是可以处理 JSON 结果的函数(responseObject
(。 -
我没有看到任何看起来像该
success
函数的良好候选函数。正如您所注意到的,您的basicCard()
函数只是将静态信息放在那里。您需要修改它以循环访问responseObject
的结果,并使用它来构建您想要的卡片。(每个结果可能一张卡,因此您需要多次调用addBasicCard()
。可以在循环中调用它,并将其添加到正在构建的丰富响应中。 -
你不应该有一个空的简单响应。这将是说"这是您的查询结果"的好地方,因此
.addSimpleResponse('Here are your results")
之类的内容在该行中是最好的。