0

目前正在尝试开发我的第一个 Alexa 技能。试图建立一种技能,让用户了解他们的 Steam 好友中谁在线。

目前它非常混乱而且不是我希望它最终的格式,但出于测试目的,我还没有使用意图,我只是使用启动请求进行测试。

到目前为止,我已经设法从 Steam 获取了一个用户(我的)朋友列表,并将所有朋友的 id 放在一个应该能够获取这些用户的详细信息的 url 中。我遇到的问题是执行第二个 API 调用以使用 steamIds 获取玩家详细信息。我不断收到“未定义”的回报,并且对我做错了什么感到困惑。我对 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);
    });


});


}

已经转了几个小时,感觉很接近这样做,但不知道我哪里错了?!谢谢

4

1 回答 1

0

我已经设法通过使用 javascript 承诺解决了我的问题。我对承诺完全陌生,因此进行了一些试验和错误,但设法让它发挥作用。这是我能找到的最简单的视频来解释这个概念,它肯定帮助我理解了如何重新排列我的代码。

如果您希望在 Alexa 技能中执行两个 API 调用,使用来自第一个 api 调用的数据来构造并通知第二个调用,您将需要使用 Promise 来按顺序执行它们。

它从 isOnline() 和 testGet() 函数中获取代码并将它们移动到一个 Promise 中,这允许我在执行第二个调用(第二个获取的 api基于friendslist api调用结果的玩家详细信息)

我现在可以通过 alexa 查看我的哪些 Steam 好友在线!希望我能够构建更多功能(例如他们正在玩什么,如果他们离线或只是离开/忙碌/打盹)

感谢您的贡献

于 2017-01-06T08:57:52.330 回答