Microsoft Bot Framework自定义Facebook消息

时间:2016-05-10 10:02:49

标签: c# botframework facebook-messenger chatbot

我已经开始在C#和Microsoft Bot Framework中使用Bot Builder SDK处理我的聊天机器人。我已经部署了我的机器人,可以与它进行交互。目前我专注于Facebook Messenger。我已经可以使用Microsoft.Bot.Connector.Attachment在Messenger上显示卡片和按钮。您可以在Bot Connector Documentation中找到它。 现在我正在尝试实现自定义Facebook消息,但没有成功。 这是我的代码:

public async Task<Message> Post([FromBody]Message message)
    {
        if (message.Type == "Message")
        {
            message.BotPerUserInConversationData = null;


            if (message.Text.Equals("test", StringComparison.InvariantCultureIgnoreCase))
            {
                var replyMessage = message.CreateReplyMessage();
                replyMessage.ChannelData = new
                {
                    notification_type = "NO_PUSH",
                    attachment = new
                    {
                        type = "template",
                        payload = new
                        {
                            template_type = "receipt",
                            recipient_name = "Stephane Crozatier",
                            order_number = "12345678902",
                            currency = "USD",
                            payment_method = "Visa 2345",
                            order_url = "http://petersapparel.parseapp.com/order?order_id=123456",
                            timestamp = "1428444852",
                            elements = new[]
                            {
                                new {
                                    title = "Classic White T-Shirt",
                                    subtitle = "100% Soft and Luxurious Cotton",
                                    quantity = 2,
                                    price = 50,
                                    currency = "USD",
                                    image_url = "http://petersapparel.parseapp.com/img/whiteshirt.png"
                                    },
                                new
                                    {
                                        title = "Classic Gray T-Shirt",
                                        subtitle = "100% Soft and Luxurious Cotton",
                                        quantity = 1,
                                        price = 25,
                                        currency = "USD",
                                        image_url = "http://petersapparel.parseapp.com/img/grayshirt.png"
                                    }
                            },
                            address = new
                            {
                                street_1 = "1 Hacker Way",
                                street_2 = "",
                                city = "Menlo Park",
                                postal_code = "94025",
                                state = "CA",
                                country = "US"
                            },
                            summary = new
                            {
                                subtotal = 75.00,
                                shipping_cost = 4.95,
                                total_tax = 6.19,
                                total_cost = 56.14
                            },
                            adjustments = new[]
                            {
                                new {name = "New Customer Discount", amount = 20},
                                new {name = "$10 Off Coupon", amount = 10}
                            }
                        }
                    }
                };

                return replyMessage;

            }

            // return our reply to the user
            try
            {
                return await Conversation.SendAsync(message, () => new EchoDialog());
            }
            catch (Exception exc)
            {
                return message.CreateReplyMessage(exc.Message);
            }
        }
        else
        {
            return HandleSystemMessage(message);
        }
    }

例如,EchoDialog正在工作,我得到了结果。我可以在bot框架界面中获取数据。这是我从机器人那里得到的json:

{
  "type": "Message",
  "id": "CeBI3NS7w0k",
  "conversationId": "D9b6pW1TY29TDUB5qx6CL5U59fv49oBQK5iKABIA0nFC0C8C",
  "created": "2016-05-10T09:34:46.5131971Z",
  "language": "en",
  "text": "",
  "attachments": [],
  "from": {
    "name": "TestBot",
    "channelId": "test",
    "address": "mytestbot",
    "id": "mytestbot",
    "isBot": true
  },
  "to": {
    "name": "devportal",
    "channelId": "test",
    "address": "devportal",
    "id": "JMQ0KLCKN6R",
    "isBot": false
  },
  "replyToMessageId": "FUjcCRhTmu0",
  "participants": [
    {
      "name": "devportal",
      "channelId": "test",
      "address": "devportal",
      "id": "JMQ0KLCKN6R",
      "isBot": false
    },
    {
      "name": "TestBot",
      "channelId": "test",
      "address": "mytestbot",
      "id": "mytestbot",
      "isBot": true
    }
  ],
  "totalParticipants": 2,
  "mentions": [],
  "channelConversationId": "mytestbot",
  "channelData": {
    "notification_type": "NO_PUSH",
    "attachment": {
      "type": "template",
      "payload": {
        "template_type": "receipt",
        "recipient_name": "Stephane Crozatier",
        "order_number": "12345678902",
        "currency": "USD",
        "payment_method": "Visa 2345",
        "order_url": "http://petersapparel.parseapp.com/order?order_id=123456",
        "timestamp": "1428444852",
        "elements": [
          {
            "title": "Classic White T-Shirt",
            "subtitle": "100% Soft and Luxurious Cotton",
            "quantity": 2,
            "price": 50,
            "currency": "USD",
            "image_url": "http://petersapparel.parseapp.com/img/whiteshirt.png"
          },
          {
            "title": "Classic Gray T-Shirt",
            "subtitle": "100% Soft and Luxurious Cotton",
            "quantity": 1,
            "price": 25,
            "currency": "USD",
            "image_url": "http://petersapparel.parseapp.com/img/grayshirt.png"
          }
        ],
        "address": {
          "street_1": "1 Hacker Way",
          "street_2": "",
          "city": "Menlo Park",
          "postal_code": "94025",
          "state": "CA",
          "country": "US"
        },
        "summary": {
          "subtotal": 75,
          "shipping_cost": 4.95,
          "total_tax": 6.19,
          "total_cost": 56.14
        },
        "adjustments": [
          {
            "name": "New Customer Discount",
            "amount": 20
          },
          {
            "name": "$10 Off Coupon",
            "amount": 10
          }
        ]
      }
    }
  },
  "hashtags": []
} 

* Ids和名称已更改。

有没有人设法让FB Messenger使用ChannelData显示模板?

更新:我从另一个fb帐户检查了它并成功获得了模板,但仅限第一次使用。接下来的每一次尝试都没有回应。

1 个答案:

答案 0 :(得分:6)

你的代码很好,你是什么意思“每次下一次尝试都让我无法回答。”

我也为Messenger制作了BOT,它就像你一样工作。这是我的代码

    public async Task<Message> Post([FromBody]Message message)
    {
        if (message.Type == "Message"){
            Message ReplyMessage = message.CreateReplyMessage();
            ReplyMessage.ChannelData = getFBFunctionMenu();
            return ReplyMessage;
        }else{return HandleSystemMessage(message);}
    }

和我的功能:

    public object getFBFunctionMenu(){
        Models.Messenger fbmsg = new Models.Messenger();
        fbmsg.ChannelData = new MessengerChannelData { notification_type = "NO_PUSH", attachment = new MessengerAttachment { payload = new MessengerPayload() } };
        fbmsg.ChannelData.attachment.type = "template";
        fbmsg.ChannelData.attachment.payload.template_type = "generic";
        List<MessengerElement> e = new List<MessengerElement>();
        List<MessengerButton> bs = new List<MessengerButton>();
        bs.Add(new MessengerButton{type = "web_url",title = "Facebook",url ="http://www.facebook.com/"});
        bs.Add(new MessengerButton{type = "web_url",title = "Google",url ="http://www.google.com/"});
        bs.Add(new MessengerButton{type = "web_url",title = "Amazon",url ="http://www.amazon.com/"});
        e.Add(new MessengerElement
        {
            title = "My Favorte Site",
            subtitle = "some descript",
            item_url = "http://localhost/",
            image_url = "http://loalhost/img.png",
            buttons = bs.ToArray()
        });
        fbmsg.ChannelData.attachment.payload.elements = e.ToArray();
        return fbmsg.ChannelData;
    }

我的型号代码:

 namespace WiAdvance.BotConnector.Messenger.Models
 {

public class Messenger
{
    public MessengerChannelData ChannelData { get; set; }
}
public class MessengerChannelData
{
    public string notification_type { get; set; }
    public MessengerAttachment attachment { get; set; }
}
public class MessengerAttachment
{
    public string type { get; set; }
    public MessengerPayload payload { get; set; }
}

public class MessengerPayload
{
    public string template_type { get; set; }
    public MessengerElement[] elements { get; set; }
}

public class MessengerElement
{
    public string title { get; set; }
    public string subtitle { get; set; }
    public string item_url { get; set; }
    public string image_url { get; set; }
    public MessengerButton[] buttons { get; set; }
}

public class MessengerButton
{
    public string type { get; set; }
    public string url { get; set; }
    public string title { get; set; }
    public string payload { get; set; }
}
 }