2017-11-17 1 views
0

私はFacebookのメッセンジャーボットに取り組んでいます。webhookはnode.jsで書かれており、ユーザーからのメッセージを待ち受けて応答し、会話の流れはモジュールでガイドされ、構造化されています。各モジュールにはモジュール名とボットステートメントと子モジュールの参照があります。外国為替相場は、 のステートメントを含むウェルカムモジュールがあります。 "こんにちは私は以下の情報を提供することができます:1 - 映画2:音楽" 今すぐウェルカムモジュールには2つの子モジュールの参照があります映画と音楽、ユーザーの反応に基づいてこれらの2つの方向のいずれかに進む必要があります。たとえば、ユーザーがムービーに応答した場合、ボットはムービーモジュールからモジュールステートメントをピックアップし、Facebookに返信します。 「エキサイティングな映画の種類を知りたいですか?アクション、冒険、SF映画」と言います。ユーザーは再び知りたいことを返信し、ボットはモジュールステートメントをピックアップして、ユーザー。 これはすべてうまくいきますが、ここで問題となるのは、2人のユーザーがユーザーAとユーザーBと言う場合です。ユーザーAがこんにちはと言うと、ボットは映画や音楽を知りたいと歓迎します。ユーザーはムービーに応答し、ボットはどのような映画のアクションアドベンチャーやSFを投げたのですか?しかし、ユーザーBのユーザーが来ているので、ボットはユーザーAの現在の同じモジュールで応答します。 ここにコードはfacebook messenger botのユーザーセッションを維持することは可能ですか?

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

スコープsenderをブロックし、それをモジュールからモジュールに渡す必要があります。これにより、各着信PSIDが独自のパスに従うことが保証されます。

関連する問題