我正在使用facebook messenger机器人,webhook是用node.js编写的,它监听来自用户的消息并作出回应,会话流在模块中被引导和结构化。每个模块都有一个模块名称和bot语句以及子模块的引用。外汇充足,声明中有一个欢迎模块 "您好我很棒的机器人我可以提供以下信息1: - 电影2: - 音乐" 现在,欢迎模块具有两个子模块电影和音乐的参考,会话必须根据用户响应在这两个方向之一中进行,例如,如果用户响应电影,机器人将从电影中获取模块声明模块并发送回Facebook,所以用户对电影的回复就像 "令人兴奋,你想知道什么样的电影?动作,冒险,科幻"并且用户再次回复他想知道的事情,并且机器人拿起模块声明并发回给用户。 现在这一切都运行良好,但问题在于,如果有两个用户说用户A和用户B.用户A说嗨,机器人说欢迎您想要了解电影或音乐?用户响应电影和机器人投掷什么样的电影动作冒险或科幻,但随后有一个用户B谁说你好,所以机器人响应与用户A相同的当前模块。 这是代码
var sender;
var ModID=0;
exports.Facebook_bot = function(req, res) {
// console.log(req.body);
var messaging_events = req.body.entry[0].messaging;
// console.log(messaging_events);
for (var i = 0; i < messaging_events.length; i++) {
var event = messaging_events[i];
sender = event.sender.id;
// console.log('this is event',event);
if (event.message && event.message.text) {
var msg = event.message.text;
console.log( "this is recived text",msg);
// sendText(sender, "text echo" + msg.substring(0, 100));
}
}
res.send(200);
if (ModID == 0) {
ModID = "71072";
botSchema.findOne({ Bot_name: "My Bot" }, function(err, data) {
for (var i = 0; i < data.Modules.length; i++) {
var back = data.Modules[i].ModuleResponse;
if (data.Modules[i].ModuleID === ModID) {
for (var j = 0; j < back.length; j++) {
console.log("back", back[j].Response);
if (back[j].Response === msg || back[j].Response === "-input-") {
//got to module ModID
ModID = back[j].TransBotID;
// console.log("else",ModID);
// console.log(back[j]);
}
}
}
}
}).then(function(data) {
for (var i = 0; i < data.Modules.length; i++) {
if (data.Modules[i].ModuleID === ModID) {
sendText(
sender,
data.Modules[i].ModuleStatement.substring(0, 500)
);
sendUI(sender,data.Modules[i].FBUI)
console.log(data.Modules[i].FBUI);
} else if (ModID === null) {
console.log(false);
}
}
});;
} else {
botSchema
.findOne({ Bot_name: "HIA Airport" }, function(err, data) {
// console.log(data)
for (var i = 0; i < data.Modules.length; i++) {
var back = data.Modules[i].ModuleResponse;
// console.log(back);
if (data.Modules[i].ModuleID === ModID && back != null) {
for (var j = 0; j < back.length; j++) {
console.log("back 2", back[j].Response);
if (back[j].Response === msg || back[j].Response === "-input-") {
ModID = back[j].TransBotID;
console.log("Go to :", ModID);
}
}
}
}
})
.then(function(data) {
for (var i = 0; i < data.Modules.length; i++) {
if (data.Modules[i].ModuleID === ModID) {
sendText(
sender,
data.Modules[i].ModuleStatement.substring(0, 500)
);
console.log(data.Modules[i].ModuleStatement);
} else if (ModID === null) {
console.log(false);
}
}
});
}
//end if
}; 变量sender和ModID是全局定义的我希望它为每个新用户单独定义,以便用户B的会话状态不依赖于用户B的会话状态,我该怎么办呢?我希望它有意义,请问你是否需要进一步了解。
答案 0 :(得分:0)
您应该阻止范围sender
,然后将其从模块传递给模块。这将确保每个传入的PSID都遵循自己的路径。