簡體   English   中英

提醒聊天機器人的Facebook Messenger

[英]Reminder chatbot for facebook messenger

嗨,我正在嘗試為Facebook Messenger制作提醒機器人。 我在Teams的github上找到了此示例,並在bot模擬器上進行了嘗試,但是沒有用。 在createConversation中有一個TeamsChannelData,我如何將其更改為適用於Facebook Messenger? 任何幫助將不勝感激,謝謝。

namespace ProactiveTeamsBot
{
    public class ProactiveBot : ActivityHandler
    {
        double _secondsToReply = 3;
        ICredentialProvider _credentialProvider;

        public ProactiveBot(ICredentialProvider credentialProvider)
        {
            _credentialProvider = credentialProvider;
        }

        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            try
            {
                await turnContext.SendActivityAsync(MessageFactory.Text($"I'll reply to you in {_secondsToReply} seconds."));
                QueueReplyAndSendItProactively(turnContext).Wait();
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
                throw e;
            }
        }

        public async Task QueueReplyAndSendItProactively(ITurnContext turnContext)
        {
            string conversationMessage = "I created my own conversation.";
            string replyMessage = "I proactively replied to this conversation.";

            var task = Task.Run(async () =>
            {
                await Task.Delay(TimeSpan.FromSeconds(_secondsToReply));

                var response = await CreateConversation(conversationMessage, turnContext);

                await ProactivelyReplyToConversation(response.Id, replyMessage, turnContext);

                return Task.CompletedTask;
            });
            await task;
        }

        public async Task<ConversationResourceResponse> CreateConversation(string message, ITurnContext turnContext )
        {
            ConnectorClient _client = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl), await GetMicrosoftAppCredentialsAsync(turnContext), new HttpClient());
            var channelData = turnContext.Activity.GetChannelData<TeamsChannelData>();

            var conversationParameter = new ConversationParameters
            {
                Bot = turnContext.Activity.Recipient,
                IsGroup = true,
                ChannelData = channelData,
                TenantId = channelData.Tenant.Id,
                Activity = MessageFactory.Text(message)
            };
            var response = await _client.Conversations.CreateConversationAsync(conversationParameter);
            return response;
        }

        public async Task ProactivelyReplyToConversation(string conversationId, string message, ITurnContext turnContext)
        {
            ConnectorClient _client = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl), await GetMicrosoftAppCredentialsAsync(turnContext), new HttpClient());
            var reply = MessageFactory.Text(message);
            reply.Conversation = new ConversationAccount(isGroup: true, id: conversationId);
            await _client.Conversations.SendToConversationAsync(reply);
        }

        private async Task<MicrosoftAppCredentials> GetMicrosoftAppCredentialsAsync(ITurnContext turnContext)
        {
            ClaimsIdentity claimsIdentity = turnContext.TurnState.Get<ClaimsIdentity>("BotIdentity");

            Claim botAppIdClaim = claimsIdentity.Claims?.SingleOrDefault(claim => claim.Type == AuthenticationConstants.AudienceClaim)
                ??
                claimsIdentity.Claims?.SingleOrDefault(claim => claim.Type == AuthenticationConstants.AppIdClaim);

            string appPassword = await _credentialProvider.GetAppPasswordAsync(botAppIdClaim.Value).ConfigureAwait(false);
            return new MicrosoftAppCredentials(botAppIdClaim.Value, appPassword);
        }
    }
}

如果我了解您要執行的操作,則只想在一段時間后發送一條消息,而實際上並不想創建新的對話。 這意味着您的任務比提供的示例要簡單得多。 您的QueueReplyAndSendItProactively方法可能如下所示:

public async Task QueueReplyAndSendItProactively(ITurnContext turnContext)
{
    var task = Task.Run(async () =>
    {
        await Task.Delay(TimeSpan.FromSeconds(_secondsToReply));
        await turnContext.SendActivityAsync("I proactively replied to this conversation.");
    });

    await task;
}

請注意,由於可伸縮性問題等,某些人會認為在機器人自身內部管理計時器功能是不明智的做法,但這是最簡單的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM