Json Bot框架:标记消息

Json Bot框架:标记消息,json,tags,bots,botframework,Json,Tags,Bots,Botframework,因此,当bot通过bot Connecter发送消息时,它会将其作为JSON对象发送,类似于: { "type": "message", "timestamp": "2017-07-20T06:35:09.196Z", "serviceUrl": "http://127.0.0.1:53484", "channelId": "emulator", "from": { "id": "ijfi3f969c6fij756", "name": "Bot" }, "conver

因此,当bot通过bot Connecter发送消息时,它会将其作为JSON对象发送,类似于:

{
  "type": "message",
  "timestamp": "2017-07-20T06:35:09.196Z",
  "serviceUrl": "http://127.0.0.1:53484",
  "channelId": "emulator",
  "from": {
  "id": "ijfi3f969c6fij756",
  "name": "Bot"
},
"conversation": {
"id": "g671h707amhch9326"
},
"recipient": {
"id": "default-user"
},
"membersAdded": [],
"membersRemoved": [],
"text": "Hey there!",
"attachments": [],
"entities": [],
"replyToId": "efincfmnc40la0g7c",
"id": "hi959g2a8ji1fn86",
"localTimestamp": "2017-07-20T08:35:09+02:00"
}
我们想添加一些额外的标签,以承载更多关于发送的消息的数据。例如,我们可能希望添加一个标记,表明我们希望用户回复电子邮件地址。也许是这样的:

{
  "type": "message",
  "timestamp": "2017-07-20T06:35:09.196Z",
  "serviceUrl": "http://127.0.0.1:53484",
  "channelId": "emulator",
  "from": {
  "id": "ijfi3f969c6fij756",
  "name": "Bot"
},
"conversation": {
"id": "g671h707amhch9326"
},
"recipient": {
"id": "default-user"
},
"membersAdded": [],
"membersRemoved": [],
"text": "Hey there!",
"attachments": [],
"entities": [],
"replyToId": "efincfmnc40la0g7c",
"id": "hi959g2a8ji1fn86",
"localTimestamp": "2017-07-20T08:35:09+02:00"
}
{
“类型”:“消息”,
“期待”:“电子邮件”
“时间戳”:“2017-07-20T06:35:09.196Z”, “serviceUrl”:“, “channelId”:“仿真器”, “发件人”:{
“id”:“ijfi3f969c6fij756”, “名称”:“机器人” },

我们的想法是,我们希望使用自定义标记来运行其他代码。例如,我们可能希望执行以下操作:

if(reply.Expecting.Equals("email")
{
  //Do something awesome here.
}

但是,我们还没有找到关于如何自定义这些JSON消息的任何信息。有可能吗?如果有,我们将如何进行?您可以使用中间件来完成这项工作。以下是文档和文档

基本上,您可以在bot对象之外设置中间件:

bot.use({
    botbuilder: (sess, next) => {
        inbound(sess, next);
    }
    ,send: (evt, next) => {
        outbound(evt, next);
    }
});
…其中,
botbuilder
捕获用户发送的内容,
send
捕获bot发送的内容

然后,您可以定义处理消息的函数,并在认为合适的情况下对其进行修改:

function inbound(sess: builder.Session, next: Function): void {
     console.log(sess.message);
    next();
}

function outbound(evt: builder.IEvent, next: Function): void {
    console.log(evt);
    next();
}
我的建议是不要更改消息数据结构本身,而是使用中间件执行自定义行为,因为更改这些消息可能会产生副作用。您可以轻松捕获中间件中需要的内容,然后将参数传递给
next()
函数,允许后续对话框处理期望值


此外,如果您所做的只是试图捕获预期的用户输入,则正则表达式与意图对话框或触发器操作匹配的效果相当好。

假设您使用的是.net Framework

下面是我能想到的一个选择。 将自定义属性引入活动

CustomActivity类上实施活动类

 public class CustomActivity : Activity
    {
        [JsonProperty(PropertyName = "cutomprop")]
        public string MyCustomProp { get; set; } = "Custom Prop";
    }

然后在发布回复时考虑创建类型定制活动,并复制原始活动的所有道具(为此使用工具自动机)


<>希望有助于…考虑为您的方案验证它,并注意其他任何副作用。*不在所有通道上测试它,它在仿真器

上工作。我不确定使用中间件是否符合其使用情况,因为如果不想对所有M使用相同的加法,则需要许多代码来检查消息是什么信息。essages@NicholasR取决于他们试图做什么。如果他们所做的只是寻找特定的东西,如电子邮件地址,那么你是对的,这就是为什么我在最后一段中提到他们可以使用意图对话框或触发与正则表达式匹配的操作。但是如果他们真的想更改消息(不推荐)或者执行某种中间件行为或对象传递,然后他们就可以使用中间件来完成。是的,如果这是为了改变全局事物,那么你是对的,但是我添加了注释,以向OP指出这对他来说并不容易example@NicholasR在OP的例子中,我只会在电子邮件地址上使用一个带有正则表达式匹配的触发器操作,如果电子邮件可以随时发送(并且不是提示发送的)。如果他提示发送电子邮件,那么,根据您的评论,这只是一个文本提示。但是,由于他要求更改消息,我首先给出了中间件示例,但提到了他如何将结果传递给下一个函数,而不是更改消息。是的。这就是为什么我只评论:太宽,无法做出明确的回答您应该有一个如果您试图在Amio.io中获取用户输入,请查看PromptDialog,我们将使用
元数据
执行该任务。(我来自Amio.io。抱歉,我忍不住要分享我们如何处理它。;-)在您的情况下,确定您在bot发送的消息中添加了信息,但在下一次回复时您将无法获得该属性,对吗?频道在回复时不会复制/粘贴此块。在这里,OP要求获得一个属性,他可以在收到请求时检查该属性reply@Nicolas你是对的。我误解了上下文。认为它的Bot==>user common反腐败。
{
  "cutomprop": "Custom Prop",
  "type": "message",
  "id": null,
  "timestamp": "2017-07-20T12:44:41.504Z",
  "localTimestamp": "2017-07-20T18:14:41+05:30",
  "serviceUrl": "http://127.0.0.1:56931",
  "channelId": "emulator",
  "from": {
    "id": "default-user",
    "name": "default-user"
  },
  "conversation": {
    "id": "h0j9hn8bicfm8e509"
  },
  "recipient": {
    "id": "mcfimjke5aebemhf",
    "name": "Bot"
  },
  "textFormat": "plain",