2016-04-16 5 views
2

В моем Python webapp для Microsoft Botframework, я хочу reply to a message с REST API call до /bot/v1.0/messages.Минимальный пример ответа на сообщение через REST API BotFramework?

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

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

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

Очевидно, этого недостаточно для сайта прямого подключения ботов. Но что такое (минимальный) пример для ответа на сообщение с вызовом API REST /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 
    } 
} 

ответ

3

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

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

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

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

+0

Спасибо Стивен! Что внутри свойств 'reply.to' и' reply.from'? Требуется ли 4 дополнительных свойства ('channelId',' address', 'name' и' id')? Возможно, вы могли бы добавить JSON-представление 'reply'. Еще раз спасибо! – Stephan

+0

Еще раз спасибо Стивен, ответ был отправлен на GitHub с дополнительной информацией. Таким образом, я написал новый ответ. – Stephan

2

Между тем, ответ был разнесен a GitHub issue, цитируя wiltodelta

Experimentally found necessary parameters for Slack, Skype, Telegram: ... ChannelConversationId only necessary Slack, otherwise the message will be added @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 (упоминались ранее) не нужны: они относятся к последним видели сообщения в разговор и, таким образом, изменится во время разговора.

Смежные вопросы