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