如何在c中使用webhook获取用户信息#

问题描述:

我正在使用api.ai和webhook visual studo 2015 c#。如何在c中使用webhook获取用户信息#

我为某些意图创建了一些操作,现在我正在寻找名为“welcome.input”的操作。我想获取用户的用户名。 如果用户第一次开始与机器人进行对话,我想给他提供查看帮助菜单或标准菜单的可能性, 并且当用户在机器人中重新输入时我想发送文本:欢迎回来{用户名}并向他展示标准菜单。

你有什么想法如何做到这一点。

我正在阅读https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/core-State这个例子......但我不能在我的项目中作为webhook添加适配。

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics.Contracts; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Http; 
using System.Web.Mvc; 
using WebhookReceiver.Models; 

    namespace FBReceiver.Controllers 
    { 

public class facebookController : ApiController 
{ 

    public string Get() 
    { 
     return "OK"; 
    } 


    public int Get(int id) 
    { 
     return id; 
    } 



    public ApiAiResponse Post([FromBody]JObject jsonRequest) 
    { 
     using (FbReceiverModelDataContext ctx = new 
    FbModelDataContext()) 
     { 
      ctx.spTblTransactions_CreateNew("xyz", "Request", 
    jsonRequest.ToString(), HttpContext.Current.User.Identity.Name); 

      ApiAiRequest request = jsonRequest.ToObject<ApiAiRequest>(); 

      ApiAiResponse response = new ApiAiResponse(); 

      JObject jObject = JObject.Parse(request.result.parameters.ToString()); 
      string xyznumber = (string)jObject["xyznumber"] != null ? (string)jObject["xyznumber"] : ""; 

      string otherparameter = (string)jObject["otherparameter"] != null ? (string)jObject["otherparameter"] : ""; 

      if (("action1".Equals(request.result.action.ToLower()))) 
      { 
       tbla a= new tbla(); 
       a= ctx.tblAa.SingleOrDefault(u => u.a.ToLower() == a.ToLower()); 

       if (a!= null) 
       { 
        response.speech = "a with number " + xyznumber+ " " + a.aaaa; 

        response.source = "aaa"; 
       } 
       else if (!string.IsNullOrEmpty(xyznumber)) 
       { 
        response.speech = "Generic info about " + xyznumber; 
        response.displayText = "Generic info about " + xyznumber; 
        response.source = "aaaa"; 
       } 
       else 
       { 
        response.speech = "No info"; 
        response.displayText = "No info"; 
        response.source = "Parcels"; 
       } 
      } 



      else if (("pay.info".Equals(request.result.action.ToLower()))) 
      { 
       ///yyyyyyyyyyyyyyyyyyyyyyyyyyyyy 
      } 


      else if (("welcome.input".Equals(request.result.action.ToLower()))) 
      { 

       // to do 

      } 


      else 
      { 
       response.speech = "something is wrong ????"; 
       response.displayText = "something is wrong ????"; 
       response.source = "None"; 
      } 




      ctx.spTblTransactions_CreateNew("aaaa", "Response", JsonConvert.SerializeObject(response), HttpContext.Current.User.Identity.Name); 

      return response; 
     } 
    } 


    } 
} 

请帮帮我。我曾多次寻找关于这个话题

+0

目前还不清楚有什么问题。你使用bot框架吗?为什么你不能使用注释的代码? –

+0

我使用Api.ai和webhook我使用visual studio 2015,C#。评论的代码是不好的...我想你的帮助确实得到用户bot的用户名,并在消息中使用它 – user2454923

+0

所以你没有使用bot框架?仍然不清楚。代码在哪里运行?如果它不是一个僵尸框架的问题,请删除标签 –

所以你的问题是有点模糊,但在概念层面是什么,你需要做的是

  1. 存储一些独特的用户或会话ID从消息集成未来像facebook messenger
  2. 使用某种键值映射或用于数据库中更可行的生产选项的userID保存关联名称。请注意,如果您想要检查自上次消息开始经过一段时间后是否根据消息的时间间隔做了某种“欢迎消息”,则还需要存储最新消息的时间戳
  3. 在消息上, ,检查用户是否存在,如果不是它的一个全新的用户并提示输入名称,如果是看跑时间戳检查,如果一些时间远离

这里后,回来在JavaScript的一个例子来说明这一方法本身,在那里你在收到来自用户的消息并且在将其传递给API.ai之前将呼叫该功能:

 function setSessionAndUser(messageEvent, callback) { 
 
      var senderID = messageEvent.sender.id; 
 
      var firstTimeUser = false 
 
      if (!sessionIds.has(senderID)) { 
 
       sessionIds.set(senderID, uuid.v1()); 
 
      } 
 

 
      if (!usersMap.has(senderID)) { 
 
       firstTimeUser = true 
 
       database.userData(function (user) { 
 
        usersMap.set(senderID, user); 
 
        //Note this is not touching the database and is instead temporarily storing users as a Map in server memory, it's a tradeoff of waiting to touch the DB before replying to every message vs how permanent you need the data to be (and how much data you'll be dealing with) 
 
        callback(messageEvent, firstTimeUser) 
 
       }, senderID); 
 
      } else{ 
 
       callback(messageEvent, firstTimeUser) 
 
      } 
 
     }

编辑补充算例 '捕' 消息事件,然后把它们解析:

//Post to webhook to catch messages 
 
app.post('/webhook/', function (req, res) { 
 
    var data = req.body; 
 

 
    // Make sure this is a page subscription 
 
    if (data.object == 'page') { 
 
     // Iterate over each entry 
 
     // There may be multiple if batched 
 
     data.entry.forEach(function (pageEntry) { 
 
      var pageID = pageEntry.id; 
 
      var timeOfEvent = pageEntry.time; 
 

 
      // Iterate over each messaging event 
 
      pageEntry.messaging.forEach(function (messagingEvent) { 
 
       if (messagingEvent.message) { 
 
        receivedMessage(messagingEvent); 
 
       } 
 
       //Catch all 
 
       else { 
 
        console.log("Webhook received unknown messagingEvent: ", messagingEvent); 
 
       } 
 
      }); 
 
     }); 
 

 
     //Must return a 200 status 
 
     res.sendStatus(200); 
 
    } 
 
}); 
 

 
// Parsing the messageEvent 
 
function receivedMessage(event) { 
 
    var senderID = event.sender.id; 
 
    //... 
 
}

+0

我可以在其他方面使用此功能if( “welcome.input”.Equals(request.result.action.ToLower()))) { }或者我可以在这里调用这个函数?对不起,但我在编程,所以我提出如此基本的问题begginer。 – user2454923

+0

对不起,我还不清楚如何使用以及如何调用这个函数来获取用户名:( – user2454923

+0

所以你的用户名或任何唯一的用户标识符,你想存储提供的名称将最终来自邮件的发件人吗?也就是说Facebook Messenger会将用户的唯一ID号码与他们信息的实际主体一起发送出去,所以首先你需要'捕捉'这些信息,然后从身体中解析出ID。 我正在编辑添加的答案示例 –