【问题标题】:Sending message from bot to a Skype User using Botframework Version 3使用 Botframework 版本 3 从机器人向 Skype 用户发送消息
【发布时间】:2016-07-24 19:37:51
【问题描述】:

更新

我正在开发一个与 Bot Framework 进行一对一对话的 Skype 机器人。 我有一个 WebHook 方法,该方法将从外部服务调用并向我的机器人发送消息,然后我的机器人将该消息发送给 Skype 用户。

以下代码适用于消息控制器中的 v1 以及 api/messages 发布方法

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 机器人框架中实现相同的目标? 我尝试了以下但不工作

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 中的人发送消息。

【问题讨论】:

    标签: botframework botbuilder


    【解决方案1】:

    以下代码有效,但我发现有些事情不是很明显(在 Skype 频道上测试)

    当用户与机器人交互时,会为用户分配一个只能从特定机器人使用的 ID。例如:我有多个机器人,每个机器人都使用 Skype 频道。当我从我的 Skype 用户向机器人 A 发送消息时,ID 与机器人 B 的不同。在以前版本的机器人框架中,我可以只向我的真实 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);
        }
    

    【讨论】:

    • 感谢您的回复,您的答案似乎正是我正在寻找的。这个周末我会试试的。
    【解决方案2】:

    我不确定我是否理解您要执行的操作。如果您想回复消息 (activity),请尝试以下操作:

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

    Activity.createReply 切换传入活动的FromRecipient 字段。您也可以尝试手动设置这些字段。

    更新

    您需要为 Skype 连接器服务创建一个ConnectorClient,而不是您的机器人!所以尝试使用 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);为此,我建议检查来自 Skype 用户的消息的 FromRecipient 字段并相应地设置这些字段。但是,如前所述,您的 bot 需要添加到用户的联系人中,因此此时它会收到来自用户的消息。

    【讨论】:

    • 感谢您的回复。我已经更新了我的问题,请检查一次。
    • 更新了我的答案,希望对您有所帮助。
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多