2016-07-24 7 views
1

Обновлен

Я разрабатываю бот Skype с 1: 1 разговором с Bot Framework. В этом случае у меня есть метод WebHook, который вызывается из внешней службы и отправляет сообщение моему боту, тогда мой бот отправит это сообщение пользователю skype.Отправка сообщения от бота для пользователя Skype с помощью Botframework Version 3

Следующий код для v1 в контроллере сообщений вместе с API/сообщения в темы методы

public async Task<Message> Post([FromBody]Message message){} 

[Route("~/api/messages/hook")] 
    [HttpPost] 
    public async Task<IHttpActionResult> WebHook([FromBody]WebHookMessage message) 
    { 
     if (message.Type == "EmotionUpdate") 
     { 
      const string fromBotAddress = "<Skype Bot ID here>"; 
      const string toBotAddress = "<Destination Skype name here>"; 
      var text = resolveEmoji(message.Data); 

      using (var client = new ConnectorClient()) 
      { 
       var outMessage = new Message 
       { 
        To = new ChannelAccount("skype", address: toBotAddress , isBot: false), 
        From = new ChannelAccount("skype", address: $"8:{fromBotAddress}", isBot: true), 
        Text = text, 
        Language = "en", 

       }; 

       await client.Messages.SendMessageAsync(outMessage); 
      } 
     } 
     return Ok(); 
    } 

Я позвоню выше WebHook из другой службы, так что мой бот будет отправлять сообщения соответствующего пользователю скайпа.

Может кто-нибудь, пожалуйста, помогите мне, как я могу добиться того же в каркасе V3? Я попытался следующие, но не работает

const string fromBotAddress = "Microsoft App ID of my bot"; 
     const string toBotAddress = "skype username"; 
     WebHookMessage processedData = JsonConvert.DeserializeObject<WebHookMessage>(message); 
     var text = resolveEmoji(processedData.Data); 

     using (var client = new ConnectorClient(new Uri("https://botname.azurewebsites.net/") 
      , "Bot Microsoft App Id", "Bot Microsoft App secret",null)) 
     { 
      var outMessage = new Activity 
      { 
       ReplyToId = toBotAddress, 
       From = new ChannelAccount("skype", $"8:{fromBotAddress}"), 
       Text = text 

      }; 

      await client.Conversations.SendToConversationAsync(outMessage); 
     } 

Но это не работает, в конце концов, чего я хочу добиться, я хочу, чтобы мой бот отправить сообщение пользователю в любое время, как мы будем посылать сообщение для человека в скайпе ,

ответ

0

Я не уверен, что понимаю, что вы пытаетесь сделать. Если вы хотите ответить на сообщение (activity), попробовать что-то вроде этого:

ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); 
var reply = activity.createReply(text, "en"); 
await connector.Conversations.ReplyToActivityAsync(reply); 

Activity.createReply переключает From и Recipient поля из входящей деятельности. Вы также можете попробовать настроить это поле вручную.

UPDATE

Вам нужно создать ConnectorClient к разъему службы Skype, а не бота! Так что попробуйте с Uri http://skype.botframework.com это может сработать.

Однако, я не думаю, что вы можете отправить сообщение пользователю по Skype, не получив от него сообщения (в частности, ваш бот должен быть добавлен к контактам пользователя). После того, как у вас есть входящее сообщение от пользователя, вы можете использовать его для ответов на создание, как описано выше.

WebHookMessage processedData = JsonConvert.DeserializeObject<WebHookMessage>(message); 
var text = resolveEmoji(processedData.Data); 

var client = new ConnectorClient(new Uri(activity.serviceUrl)); 
var outMessage = activity.createReply(text); 
await client.Conversations.SendToConversationAsync(outMessage); 

activity - это сообщение, полученное от данного пользователя ранее. В этом случае activity.serviceUrl должен быть http://skype.botframework.com, но в целом вы не должны полагаться на это.

Вы можете попытаться создать свою деятельность (outMessage) вручную; для этого я бы рекомендовал проверить поля From и Recipient сообщения от пользователя Skype и соответствующим образом установить эти поля. Однако, как упоминалось ранее, ваш бот должен быть добавлен к контактам пользователя, поэтому на этом этапе он получит сообщение от пользователя.

+0

благодарит за ответ. Я обновил свой вопрос, пожалуйста, проверьте его один раз. – Kishore1021

+0

Обновлен мой ответ, надеюсь, что это поможет. – Thegaram

2

Следующий код работает, но есть некоторые вещи, которые не так очевидно, что я понял (испытано на канале Skype)

Когда пользователь взаимодействует с ботом пользователь выделяется идентификатор, который может быть только используется с определенного бота ... например: у меня есть несколько ботов, каждый из которых использует канал skype. Когда я отправляю сообщение от моего пользователя skype, чтобы бот A, идентификатор отличается от bot B. В предыдущей версии платформы bot я мог просто отправить сообщение на мой настоящий идентификатор пользователя skype, но не больше.В некотором смысле это упрощает весь процесс, потому что вам нужен только идентификатор получателя, а структура заботится обо всем остальном, поэтому вам не нужно указывать идентификатор отправителя или бота (я догадался обо всем, что связано за кулисами)

[Route("OutboundMessages/Skype")] 
    [HttpPost] 
    public async Task<HttpResponseMessage> SendSkypeMessage(SkypePayload payload) 
    {     

     using (var client = new ConnectorClient(new Uri("https://skype.botframework.com"))) 
     { 
      var conversation = await client.Conversations.CreateDirectConversationAsync(new ChannelAccount(), new ChannelAccount(payload.ToSkypeId)); 
      IMessageActivity message = Activity.CreateMessageActivity(); 
      message.From = new ChannelAccount(); 
      message.Recipient = new ChannelAccount(payload.ToSkypeId); 
      message.Conversation = new ConversationAccount { Id= conversation.Id }; 
      message.Text = payload.MessageBody;    
      await client.Conversations.SendToConversationAsync((Activity)message); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
+0

спасибо за ответ, ваш ответ кажется тем, что я искал. Я попробую это в эти выходные. – Kishore1021

+0

Пожалуйста, поддержите ответ, если он сработает для вас. –