当与Twitter API结合使用时,如何在Watson对话API中传递response.context?

当与Twitter API结合使用时,如何在Watson对话API中传递response.context?,twitter,ibm-cloud,ibm-watson,watson-conversation,Twitter,Ibm Cloud,Ibm Watson,Watson Conversation,我的想法是,我将使用Twitter的流媒体api获取我账户的最新信息,将这些数据提供给watson Conva api,并让watson给出回复;然后我会再次回复推特,回复提到我的人。为了让watson Conva api正常工作,我必须将response.context传递回watson 我把所有的东西都记下来了,除了传递回response.context部分。有人知道怎么做吗 var twitter = require('../statics/twitterAPI_KEY_Dev'); va

我的想法是,我将使用Twitter的流媒体api获取我账户的最新信息,将这些数据提供给watson Conva api,并让watson给出回复;然后我会再次回复推特,回复提到我的人。为了让watson Conva api正常工作,我必须将response.context传递回watson

我把所有的东西都记下来了,除了传递回response.context部分。有人知道怎么做吗

var twitter = require('../statics/twitterAPI_KEY_Dev');
var watson = require('../statics/watsonAPI_KEY_Dev');

function botReplyInit() {
var stream = twitter.stream('statuses/filter', { track: '@Felicia_Bot' });

stream.on('tweet', function(tweet) {
    var dataProcessed = false;
    var data;

    if (!dataProcessed) {
        var data = tweet.text.replace(/@(\w+)/g, '').replace(/#(\w+)/g, '');
        //cleans up the tweet so the @ and # are deleted
    }

    var username = tweet.user.screen_name;
    var statusID = tweet.id_str;
    var endConversation = false;

    var error = {};
    var res = { output: {}, intents: [] };

    processWatson(error, res); 
    //how do we move this intialization outside of the stream.on function so it only 
    //get called once in the entire lifetime of the app??

    function processWatson(err, response) {
        if (err) {
            console.log(err);
        }

        if (response.output.action === 'end_conversation') {
            endConversation = true;
        }
        if (response.intents.length > 0) {
            var result = '@' + username + ' ' + response.output.text[0];

            twitter.post('statuses/update', {
                status: result,
                in_reply_to_status_id: tweet.id_str
            }, 
            function(err, response) {
                if (err) {
                    console.log(err);
                    return;
                }
                else {
                    console.log('I posted ' + result);
                }
            });
        }

        if(!endConversation && !dataProcessed) {
            watson.message({
                input: { text: data },
                context: response.context
            }, 
            processWatson);
            dataProcessed = true;
        }
    }
})
}

botReplyInit();

有关Watson对话服务的消息方法,请参阅API文档-

来自消息的响应包含上下文对象,这是在后续调用消息API时返回服务所需的对象。会话初始化时不需要上下文对象


您的应用程序需要跟踪上下文对象,如果要允许多个同时对话,则需要能够将上下文对象映射到对话。

我同意您的说法。我重写了代码,以便返回response.context。其思想是,一旦沃森回调函数初始化一次,它就再也不会初始化;api调用在回调函数中,因此当有应答时,它将循环返回。但是,这不起作用,因为我的watson初始化调用在stream.on的回调函数中,所以每次有新的tweet,即使上下文被传回,再次调用watson的初始化调用,以便清除传递回的上下文。如果我将watson初始化函数调用留在stream.on之外,我将无法调用它,因为它是在stream.on内部定义的。如果我将stream.on包装在watson回调函数中,它将创建一个无限循环的stream.on调用,该调用不会停止。创建一个对象以将上下文保存在stream.on之外,并将其初始化为null对象。然后将对象传递给每个对话调用,包括对话开始,允许响应更新它。Ohhhh然后每次我都会将第二个(真实)对话调用的上下文引用到该对象?真是天才!!