1

更新

我正在开发一个与 Bot Framework 进行 1:1 对话的 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 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 中的人发送消息。

4

2 回答 2

2

以下代码有效,但我发现有些事情并不那么明显(在 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);
    }
于 2016-08-03T05:57:23.080 回答
0

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

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

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

更新

你需要创建一个ConnectorClient到 Skype 连接器服务,而不是你的机器人!因此,尝试使用 Urihttp://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 用户的消息的From和字段并相应地设置这些字段。Recipient但是,如前所述,您的机器人需要添加到用户的联系人中,因此此时它会收到来自用户的消息。

于 2016-07-25T21:14:02.890 回答