3

在我的Microsoft Botframework的 Python webapp 中,我想通过REST API 调用回复一条消息/bot/v1.0/messages

在我的本地机器上试验模拟器时,我意识到 REST 调用的最小负载类似于:

{
  "text": "Hello, Hello!",
  "from": {
    "address": "MyBot"
  },
  "channelConversationId": "ConvId"
}

我的本地模拟器在原始消息中给出的 id在哪里"ConvId"(注意,我必须不发送channelConversationIdconversationId

显然,这对于实时机器人连接器站点来说是不够的。但是,使用 REST API 调用回复消息的(最小)示例是/bot/v1.0/messages什么?

我已经测试了不同的有效负载数据,例如文档中所指示的属性from、、、和。但通常我得到一个错误:tochannelConversationIdtextlanguage500

{
  "error": {
    "message": "Expression evaluation failed. Object reference not set to an instance of an object.",
    "code": "ServiceError"
  }
}

当我尝试发回原始消息时,只是使用tofrom交换,我得到了一个不同的500错误:

{
  "error": {
     "code": "ServiceError",
     "message": "*Sorry, Web Chat is having a problem responding right now.*",
     "statusCode": 500
  }
}
4

2 回答 2

3

内联回复(作为响应返回)的最小有效负载为:

{ "text": "Hello, Hello!" }

如果您使用 POST 向带外发布回复,/bot/v1.0/messages那么您是正确的,您需要更多。这是我在 Bot Builder SDK 的 Node 版本中所做的:

// Post an additional reply
reply.from = ses.message.to;
reply.to = ses.message.replyTo ? ses.message.replyTo : ses.message.from;
reply.replyToMessageId = ses.message.id;
reply.conversationId = ses.message.conversationId;
reply.channelConversationId = ses.message.channelConversationId;
reply.channelMessageId = ses.message.channelMessageId;
reply.participants = ses.message.participants;
reply.totalParticipants = ses.message.totalParticipants;
this.emit('reply', reply);
post(this.options, '/bot/v1.0/messages', reply, (err) => {
    if (err) {
        this.emit('error', err);
    }
});

向现有对话发送回复有点复杂,因为您必须包含将其返回到源对话所需的所有路由位。开始新的对话要容易得多:

// Start a new conversation
reply.from = ses.message.from;
reply.to = ses.message.to;
this.emit('send', reply);
post(this.options, '/bot/v1.0/messages', reply, (err) => {
    if (err) {
        this.emit('error', err);
    }
});

这两个例子都假设reply.text&reply.language已经被设置。

于 2016-04-18T04:44:09.303 回答
2

同时,答案已发布到GitHub 问题,引用wiltodelta

实验发现 Slack、Skype、Telegram 的必要参数:... ChannelConversationId 只需要 Slack,否则消息会添加@userAddress。

Message message = new Message
{
  ChannelConversationId = channelConversationId,
  From = new ChannelAccount
  {
    ChannelId = channelId,
    Address = botAddress,
    IsBot = true
  },
  To = new ChannelAccount
  {
    ChannelId = channelId,
    Address = userAddress
  },
  Text = text
};

特别是,属性replyToMessageIdchannelConversationId(前面提到的)不是必需的:它们指的是对话中最后看到的消息,因此会在对话期间发生变化。

于 2016-04-23T08:41:31.243 回答