簡體   English   中英

使用Botframework版本3將消息從漫游器發送到Skype用戶

[英]Sending message from bot to a Skype User using Botframework Version 3

更新

我正在開發與Bot Framework進行1:1對話的Skype機器人。 我有一個WebHook方法,它將從外部服務調用並將消息發送到我的機器人,然后我的機器人將把該消息發送給Skype用戶。

以下代碼與api / messages post方法一起用於消息控制器中的v1

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調用,以便我的機器人將消息發送給相應的Skype用戶。

誰能幫我在V3 Bot框架中實現相同的目標嗎? 我嘗試了以下操作,但不起作用

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);
        }

但這是行不通的,最終我想要實現的是我希望我的機器人在任何時候我們將如何向Skype中的人發送消息時都向用戶發送消息。

以下代碼有效,但是有些事情我不太清楚(在Skype頻道上測試)

當用戶與漫游器進行交互時,將為該用戶分配一個ID,該ID只能在特定漫游器中使用。例如:我有多個漫游器,每個漫游器都使用Skype通道。 當我從Skype用戶向機器人A發送消息時,其ID與機器人B的ID不同。在bot框架的先前版本中,我可以僅向真實的Skype用戶ID發送一條消息,但現在不再。 從某種意義上說,它簡化了整個過程,因為您只需要收件人的ID,而框架將處理其余的事情,因此您不必指定發送者或漫游器ID(我猜想所有關聯在幕后的東西)

    [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);
    }

我不確定我了解您要做什么。 如果您想回答一條消息( activity ),請嘗試以下操作:

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

Activity.createReply在傳入Activity.createReply切換“ From和“ Recipient字段。 您也可以嘗試手動設置這些字段。

UPDATE

您需要為Skype連接器服務而不是您的機器人創建一個ConnectorClient 因此,嘗試使用Uri http://skype.botframework.com可能會起作用。

但是,我認為您不能在沒有首先收到來自Skype的消息的情況下向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 )。 為此,我建議檢查來自Skype用戶的郵件的“ From和“ Recipient字段,並相應地設置這些字段。 但是,如前所述,您的漫游器需要添加到用戶的聯系人中,因此,此時它已收到用戶的消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM