首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Botframework版本3从机器人向Skype用户发送消息

使用Botframework版本3从机器人向Skype用户发送消息
EN

Stack Overflow用户
提问于 2016-07-25 03:37:51
回答 2查看 2.1K关注 0票数 1

已更新

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

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

代码语言:javascript
复制
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机器人框架中实现同样的功能吗?我尝试了以下方法,但不起作用

代码语言:javascript
复制
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中的人。

EN

回答 2

Stack Overflow用户

发布于 2016-08-03 13:57:23

当用户与机器人交互时,系统会为用户分配一个id,该id只能在一个特定的bot..for示例中使用:我有多个机器人,每个机器人都使用skype频道。当我从skype用户向机器人A发送消息时,id与机器人B的id不同。在以前版本的机器人框架中,我只能向真实的skype用户id发送消息,但现在不再是这样了。在某种程度上,它简化了整个过程,因为您只需要接收者的id,框架会处理其余部分,因此您不必指定发送者或机器人Id (我猜所有这些都是在幕后链接的)

代码语言:javascript
复制
    [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
EN

Stack Overflow用户

发布于 2016-07-26 05:14:03

我不太明白你想做什么。如果你想回复一条消息(activity),尝试这样做:

代码语言:javascript
复制
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
var reply = activity.createReply(text, "en");
await connector.Conversations.ReplyToActivityAsync(reply);

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

更新

您需要创建到Skype Connector Service的ConnectorClient,而不是到您的机器人!所以尝试使用Uri http://skype.botframework.com,它可能会起作用。

然而,我不认为你可以在Skype上给用户发消息,而不是首先收到来自它的消息(例如,你的机器人需要添加到用户的联系人中)。一旦收到来自用户的传入消息,就可以使用它来创建回复,如上所述。

代码语言:javascript
复制
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字段,并相应地设置这些字段。但是,如前所述,您的机器人需要添加到用户的联系人中,因此此时它将收到来自用户的消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38555997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档