【问题标题】:ConversationUpdate doesn't trigger after publish发布后不会触发 ConversationUpdate
【发布时间】:2018-01-28 23:52:30
【问题描述】:

您好,我使用 C# 中的 Microsoft BotFramework 创建了我的第一个测试机器人。 在private async Task< Activity > HandleSystemMessage(Activity message)if (message.Type == ActivityTypes.ConversationUpdate) 通常它应该通知添加到组的新成员或有人在 Telegram Messenger 中点击机器人的开始按钮。当我使用 BotFramework 模拟器在调试模式下对其进行测试时,一切正常,但是在我发布它之后,我看到在 Telegram Messenger 中点击开始按钮后,我的代码没有运行。 我在 ActivationType.ConversationUpdate 中的代码

foreach (var item in message.MembersAdded)
                {
    try
    {
        using (var dbcontext = new WatermarkBotDBEntities())
        {
            dbcontext.BotUsers.Add(new BotUser()
            {
               AddedFriends = 0,
               ConversationID = message.Conversation.Id,
               ServiceUrl = message.ServiceUrl,
               UserID = message.From.Id
            });
         dbcontext.SaveChanges();
         if (Request.RequestUri.Query != "")
         {
             var u = dbcontext.BotUsers.Where(x => x.BotSalCode == Request.RequestUri.Query.Replace("?start=", string.Empty)).FirstOrDefault();
             u.AddedFriends++;
             dbcontext.Entry(u).State = System.Data.Entity.EntityState.Modified;
             if (u != null)
             {
                 var connector = new ConnectorClient(new Uri(u.ServiceUrl));
                 IMessageActivity newMessage = Activity.CreateMessageActivity();
                 newMessage.Type = ActivityTypes.Message;
                //newMessage.From = new ChannelAccount("<BotId>", "<BotName>");
                newMessage.From = new ChannelAccount("c3e7mhdafcecn7ng3", "Bot");
                newMessage.Conversation = new ConversationAccount(false, u.ConversationID);
                newMessage.Recipient = new ChannelAccount(u.UserID);
                if (u.AddedFriends <= 2)
                    newMessage.Text = $"SomeText.";
                else newMessage.Text = "SomeTex";
                await connector.Conversations.SendToConversationAsync((Activity)newMessage);
                 dbcontext.SaveChanges();
           }
        }
    }
}
catch (Exception ex)
{
}

那么如何检测电报中的点击开始? 问候

【问题讨论】:

  • 能否将您的整个代码发布到if (message.Type == ActivityTypes.ConversationUpdate)
  • @JasonSowers 我在if (message.Type == ActivityTypes.ConversationUpdate)中添加了代码
  • 您是否尝试过此处描述的解决方法:github.com/Microsoft/BotBuilder/issues/1832
  • 我没有看到这个链接,但我自己解决了。 if (activity.Type == ActivityTypes.Message){if (activity.Text.StartsWith("/start")){...}}。如果您还在 /start 和空格之后使用深度链接,它将在 start= 之后返回您的参数,因此 var actteaxt = activity.Text.Replace("/start ", ""); 将轻松获取 start 参数。

标签: c# botframework telegram telegram-bot


【解决方案1】:

我意识到这不是一个完整的答案,但我想与您分享此代码以防万一。以下是发送欢迎消息的推荐方式,您可以重新使用此代码以供您使用。

else if (message.Type == ActivityTypes.ConversationUpdate || message.Type == ActivityTypes.Message)
            {
                IConversationUpdateActivity iConversationUpdated = message as IConversationUpdateActivity;
                if (iConversationUpdated != null)
                {
                    ConnectorClient connector = new ConnectorClient(new System.Uri(message.ServiceUrl));

                    foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
                    {
                        // if the bot is added, then
                        if (member.Id == iConversationUpdated.Recipient.Id)
                        {
                            var reply = ((Activity)iConversationUpdated).CreateReply(
                            $"Hi! I'm Botty McBot.");
                            await connector.Conversations.ReplyToActivityAsync(reply);
                        }
                    }
                }
            }

【讨论】:

  • 感谢分享它在 bot 框架门户的模拟器和测试面板上工作,但在 Telegram 中没有工作:|
【解决方案2】:

这是我经过大量测试后为我的问题找到的答案: 在默认情况下在 BotFramework 应用程序中定义的 public async Task&lt;HttpResponseMessage&gt; Post([FromBody]Activity activity) 函数中的 MessagesController 类中,您必须执行以下操作:

if (activity.Type == ActivityTypes.Message)
{
    if (activity.Text.StartsWith("/start"))
    {
        //This will return you the start parameter of a link like : http://telegram.me/botname?start=Parameter
        var Parameter = activity.Text.Replace("/start ", "");
    }
}

如果您想发送欢迎消息,那么您肯定可以使用@JasonSowers 告诉的方式并使用他的代码发送您的消息。 最好的问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多