首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >alexa Steam自定义技能api集成

alexa Steam自定义技能api集成
EN

Stack Overflow用户
提问于 2017-01-05 23:53:40
回答 1查看 255关注 0票数 0

目前正在尝试发展我最早的alexa技能之一。试图建立一个技能,以更新用户谁在他们的蒸汽朋友,是在线的。

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

到目前为止,我已经设法从steam获得了一个用户(我的)朋友列表,并将所有的朋友I放在一个url中,这个url应该能够获取这些用户的详细信息。我遇到的问题是使用steamIds执行第二个API调用来获取玩家的详细信息。我不断得到一个“未定义的”返回,并且被我做错了什么难住了。我对JS非常陌生,所以这里肯定会有错误,但一旦我把它弄好了,我可以稍后再整理。

这个很好用

代码语言:javascript
复制
/**
* 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));
}

这是从我的朋友列表中获取详细信息的函数

代码语言:javascript
复制
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);
});

})
}

这是我遇到困难的最后一个函数。

代码语言:javascript
复制
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;

//到目前为止工作正常

代码语言:javascript
复制
// 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);
    });


});


}

已经绕了几个小时了,感觉离做这件事这么近了,但却不知道我错在哪里了?!谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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朋友在线了!希望我能够构建一些更多的功能(例如,他们正在玩什么,如果他们离线或只是离开/忙碌/打瞌睡)

感谢您的贡献

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41489268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档