我正在开发一个与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用户发送消息。
答案 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
会切换传入活动中的From
和Recipient
字段。您也可以尝试手动设置这些字段。
<强>更新强>
您需要为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用户的消息的From
和Recipient
字段,并相应地设置这些字段。但是,如前所述,您的机器人需要添加到用户的联系人中,因此此时它将收到用户的消息。