目前正在尝试发展我最早的alexa技能之一。试图建立一个技能,以更新用户谁在他们的蒸汽朋友,是在线的。
最近,它相当混乱,而且不是我希望的格式,但出于测试的目的,我还没有使用意图,我只是使用启动请求进行测试。
到目前为止,我已经设法从steam获得了一个用户(我的)朋友列表,并将所有的朋友I放在一个url中,这个url应该能够获取这些用户的详细信息。我遇到的问题是使用steamIds执行第二个API调用来获取玩家的详细信息。我不断得到一个“未定义的”返回,并且被我做错了什么难住了。我对JS非常陌生,所以这里肯定会有错误,但一旦我把它弄好了,我可以稍后再整理。
这个很好用
/**
* Called when the user invokes the skill without specifying what they want.
*/
function onLaunch(launchRequest, session, callback) {
console.log("onLaunch requestId=" + launchRequest.requestId
+ ", sessionId=" + session.sessionId);
var cardTitle = "Hello, World!"
testGet(function (response) {
var speechOutput = "Here is the result of your query: " + response;
var shouldEndSession = true;
callback(session.attributes,
buildSpeechletResponse(cardTitle, speechOutput, "", true));
});
//var speechOutput = "You can tell Hello, World! to say Hello, World!"
//callback(session.attributes,
// buildSpeechletResponse(cardTitle, speechOutput, "", true));
}这是从我的朋友列表中获取详细信息的函数
function testGet(response) {
var http = require('http')
var url = " http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=XXXXXXXXXX&steamid=76561198068311091&relationship=friend"
http.get(url, function (res) {
// data is streamed in chunks from the server
// so we have to handle the "data" event
var buffer = "",
data,
friendsList,
i,
address,
textResponse,
route;
res.on("data", function (chunk) {
buffer += chunk;
});
res.on("end", function (err) {
// finished transferring data
// dump the raw data
console.log(buffer);
console.log("\n");
data = JSON.parse(buffer);
friendsList = data.friendslist.friends;
textResponse = isOnline(friendsList);
response("Friends online: " + textResponse);
}).on('error', function (e) {
console.log("Error message: " + e.message);
});
})
}这是我遇到困难的最后一个函数。
function isOnline(friendsList){
var http = require('http'),
i,
comma,
friendsIDs = "";
// for loop to get all friends ids in string
for (i = 0; i < friendsList.length; i++) {
// if i equals 0 then it is the start of the loop so no
//comma needed, otherwise add a comma to seperate the ids.
if(i === 0) {comma = ""}
else{comma = ","}
//place the ids in a comma seperate string
friendsIDs += comma + friendsList[i].steamid;
}
var playerurl = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=xxxxx&steamids=" + friendsIDs;//到目前为止工作正常
// run the api call to get player details
http.get(playerurl, function (response) {
// data is streamed in chunks from the server
// so we have to handle the "data" event
var buffer = "",
playerdata,
returnText,
textResponse,
friendsInformation,
route;
response.on("playerdata", function (chunk) {
buffer += chunk;
});
response.on("end", function (err) {
// finished transferring data
// dump the raw data
console.log(buffer);
console.log("\n");
playerdata = JSON.parse(buffer);
friendsInformation = playerdata.response.players;
for (i = 0; i < friendsInformation.length; i++) {
if(friendsInformation[i].personastate == 1) {
returnText += friendsInformation[i].personaname + " chicken";
}
}
return returnText;
}).on('error', function (e) {
console.log("Error message: " + e.message);
});
});
}已经绕了几个小时了,感觉离做这件事这么近了,但却不知道我错在哪里了?!谢谢
发布于 2017-01-06 16:57:52
我已经设法通过使用javascript promises解决了我的问题。我对promises完全陌生,所以我进行了一些试验和错误,但我已经设法让它工作了。我可以找到here is the simplest video来解释这个概念,它确实帮助我理解了如何重新排列代码。
如果您希望在Alexa技能中执行两个API调用,使用来自第一个api调用的数据来构造和通知第二个调用,您将需要使用promises按顺序执行它们。
它从isOnline()和testGet()函数中提取代码,并将它们移动到promise中,这允许我在执行第二个调用(根据friendslist api调用的结果获得球员详细信息的第二个api )之前完成1个api调用(原始调用以获取好友列表信息)。
我现在可以和alexa确认一下我的哪些steam朋友在线了!希望我能够构建一些更多的功能(例如,他们正在玩什么,如果他们离线或只是离开/忙碌/打瞌睡)
感谢您的贡献
https://stackoverflow.com/questions/41489268
复制相似问题