alexa Steam 自定义技能 api 集成

alexa Steam custom skill api integration

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

目前它非常混乱并且不是我希望它最后的格式,但出于测试目的,我还没有使用意图,我只是使用 launchrequest 进行测试。

到目前为止,我已经设法从 Steam 中获取了一个用户(我的)好友列表,并将所有好友 ID 放在一个 url 中,应该能够获取这些的详细信息 用户。 我遇到的问题是执行第二个 API 调用以使用 steamId 获取玩家详细信息。我不断收到 'undefined' return 并且对我做错了什么感到难过。 我是 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);
    });


});


}

几个小时以来一直在兜圈子,感觉离这样做很近了,但不知道我哪里出错了?! 谢谢

我已经使用 javascript 承诺解决了我的问题。我对 promises 完全陌生,所以尝试了一些尝试和错误,但设法让它发挥作用。 here is the simplest video 我能找到解释这个概念的方法,它无疑帮助我理解了如何重新排列我的代码。

如果您希望在 Alexa 技能中进行两次 API 调用,使用第一次 api 调用中的数据构建并通知第二次调用,您将需要使用 promises 来完成他们依次。

它从 isOnline() 和 testGet() 函数中取出代码并将它们移到一个 promise 中,这让我可以在执行之前完成 1 api 调用(最初调用获取好友列表信息)第二次调用(第二次 api 根据好友列表 api 调用的结果获取玩家详细信息)

我现在可以通过 alexa 查看我的哪些 steam 好友在线!希望我能够构建更多功能(例如,他们在玩什么,如果他们离线或只是 away/busy/snoozing)

感谢贡献