我已经开始在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帐户检查了它并成功获得了模板,但仅限第一次使用。接下来的每一次尝试都没有回应。
答案 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; }
}
}