使用Botframework版本3从僵尸程序向Skype用户发送消息

时间:2016-07-24 19:37:51

标签: botframework botbuilder

更新

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

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

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用户发送消息。

2 个答案:

答案 0 :(得分:2)

以下代码有效,但有一些事情并不明显,我想出来(在Skype频道上测试)

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

答案 1 :(得分:0)

我不确定我明白你要做什么。如果您想回复消息(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字段,并相应地设置这些字段。但是,如前所述,您的机器人需要添加到用户的联系人中,因此此时它将收到用户的消息。