Минимальный пример ответа на сообщение через REST API BotFramework?

В моем веб-приложении Python для Microsoft Botframework я хочу ответьте на сообщение с Вызов REST API для /bot/v1.0/messages.

Экспериментируя с эмулятором на моей локальной машине, я понял, что минимальная полезная нагрузка для вызова REST примерно такая:

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

где "ConvId" — это идентификатор, предоставленный моим локальным эмулятором в исходном сообщении (обратите внимание, что я должен отправить channelConversationId, а не conversationId).

Очевидно, что этого недостаточно для сайта коннектора живого бота. Но каков (минимальный) пример ответа на сообщение вызовом REST API /bot/v1.0/messages?

Я протестировал различные данные полезной нагрузки, например, с атрибутами from, to, channelConversationId, textи language, как указано в документации. Но обычно я получаю ошибку 500:

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

Когда я попытался отправить обратно исходное сообщение, просто поменяв местами to и from, я получил другую ошибку 500:

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

person Stephan    schedule 16.04.2016    source источник


Ответы (2)


Минимальная полезная нагрузка для встроенного ответа (возвращаемого как ответ):

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

Если вы отправляете ответ вне группы, используя POST для /bot/v1.0/messages, то вы правы, вам нужно немного больше. Вот что я делаю в Node-версии SDK Bot Builder:

// 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 уже установлены.

person Steven Ickman    schedule 18.04.2016
comment
Спасибо, Стивен! Что внутри свойств reply.to и reply.from? Требуются ли все 4 подсвойства (channelId, address, name и id)? Возможно, вы могли бы добавить JSON-представление reply. Спасибо еще раз! - person Stephan; 18.04.2016
comment
Еще раз спасибо, Стивен, тем временем ответ был опубликован на GitHub с дополнительной информацией. Таким образом, я написал новый ответ. - person Stephan; 23.04.2016

Тем временем ответ был опубликован в проблеме 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
};

В частности, атрибуты replyToMessageId и channelConversationId (упомянутые ранее) не нужны: они относятся к последнему увиденному сообщению в беседе и, таким образом, будут меняться во время беседы.

person Stephan    schedule 23.04.2016