Node.js:如何使用MS Bot Framework在Slack中发送直接消息?

时间:2017-02-10 06:10:08

标签: node.js botframework slack luis botbuilder

我正在尝试使用LUIS创建一个Slack机器人,当机器人在其添加的频道中看到问候语时,它会向发送问候语的用户发送直接消息。

我查看了问题#431并写了一个机器人。这是我的代码:

var builder = require('botbuilder');
var restify = require('restify');
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
    console.log("%s listening to %s", server.name, server.url);
});
server.get(/.*/, restify.serveStatic({
    'directory': '.',
    'default': 'index.html'
}));

// Create Chat Bot
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});
var bot = new builder.UniversalBot(connector, {
    persistConversationData: true // need persistent data for dictionary
});
server.post('/api/messages', connector.listen());

// Create LUIS recognizer that points at our model and add it as the root '/' dialog
var model = (omitted);
var recognizer = new builder.LuisRecognizer(model);
var dialog = new builder.IntentDialog({ recognizers: [recognizer] });
bot.dialog('/', dialog);

// Add intent handlers
dialog.matches('Greeting', [
    function(session, args, next) {
        var language = builder.EntityRecognizer.findEntity(args.entities, 'Language');
        next({ response: language });
    },
    function(session, results) {

        bot.beginDialog({
            text: 'Hello',
            to: {channelId: "emulator", address:"User1", id:"(omitted)", isBot:false},
            from: { channelId:"emulator", address:"Bot1", id:"(omitted)", isBot:true}
        }, '/');
    }
]);

但是,目前当僵尸程序收到问候语时,它会显示以下错误消息:

ERROR: ChatConnector: startConversation - address is invalid.
Error: Invalid address.
    at ChatConnector.startConversation (C:\..\node_modules\botbuilder\lib\bots\ChatConnector.js:173:18)
    at C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:308:27
    at UniversalBot.tryCatch (C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:381:13)
    at UniversalBot.ensureConversation (C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:302:14)
    at C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:163:19
    at C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:337:53
    at UniversalBot.tryCatch (C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:381:13)
    at C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:337:23
    at UniversalBot.tryCatch (C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:381:13)
    at UniversalBot.lookupUser (C:\..\node_modules\botbuilder\lib\bots\UniversalBot.js:324:14)

(我省略了目录的一部分)

我查看了问题#687,但我仍然无法弄清楚问题。我怎样才能使机器人工作?

我使用的是Botbuilder v3.4.4和Node v4.6.0。

1 个答案:

答案 0 :(得分:1)

我认为去的方式是:

  1. session.message.address保存在某处,因为您必须稍后在bot.beginDialog中使用它。
  2. 在开始新对话框之前,您需要删除会话对象,因为您要创建新会话
  3. 使用地址开始对话。
  4. 这就像是

    // consider making this an array insted
    var address
    
    // probably in the function that matches the greeting
    address = session.message.address;
    
    // in the step where you want to send the direct messsage
    var newConversationAddress = Object.assign({}, address);
    delete newConversationAddress.conversation;
    
    // begin dialog with address without conversation
     bot.beginDialog(newConversationAddress,...
    

    查看CreateNewConversation示例。你会看到正在做的事情非常相似。