[英]Sending message from bot to a Skype User using Botframework Version 3
我正在開發與Bot Framework進行1:1對話的Skype機器人。 我有一個WebHook方法,它將從外部服務調用並將消息發送到我的機器人,然后我的機器人將把該消息發送給Skype用戶。
以下代碼與api / messages post方法一起用於消息控制器中的v1
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中的人發送消息時都向用戶發送消息。
以下代碼有效,但是有些事情我不太清楚(在Skype頻道上測試)
當用戶與漫游器進行交互時,將為該用戶分配一個ID,該ID只能在特定漫游器中使用。例如:我有多個漫游器,每個漫游器都使用Skype通道。 當我從Skype用戶向機器人A發送消息時,其ID與機器人B的ID不同。在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);
}
我不確定我了解您要做什么。 如果您想回答一條消息( activity
),請嘗試以下操作:
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
var reply = activity.createReply(text, "en");
await connector.Conversations.ReplyToActivityAsync(reply);
Activity.createReply
在傳入Activity.createReply
切換“ From
和“ Recipient
字段。 您也可以嘗試手動設置這些字段。
UPDATE
您需要為Skype連接器服務而不是您的機器人創建一個ConnectorClient
! 因此,嘗試使用Uri http://skype.botframework.com
可能會起作用。
但是,我認為您不能在沒有首先收到來自Skype的消息的情況下向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
字段,並相應地設置這些字段。 但是,如前所述,您的漫游器需要添加到用戶的聯系人中,因此,此時它已收到用戶的消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.