发布后不会触发 ConversationUpdate
ConversationUpdate doesn't trigger after publish
您好,我在 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)
{
}
那么如何在电报中检测到命中开始呢?
此致
我知道这不是一个完整的答案,但我想与您分享这段代码以防它可能有所帮助。以下是发送欢迎消息的推荐方式,您可以重新使用此代码。
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);
}
}
}
}
这是我经过大量测试后为我的问题找到的答案:
在 BotFramework 应用程序中默认定义的 public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
函数中的 MessagesController class 中,您必须执行如下操作:
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 告诉您的方式并使用他的代码来发送您的消息。
最好的问候
您好,我在 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)
{
}
那么如何在电报中检测到命中开始呢? 此致
我知道这不是一个完整的答案,但我想与您分享这段代码以防它可能有所帮助。以下是发送欢迎消息的推荐方式,您可以重新使用此代码。
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);
}
}
}
}
这是我经过大量测试后为我的问题找到的答案:
在 BotFramework 应用程序中默认定义的 public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
函数中的 MessagesController class 中,您必须执行如下操作:
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 告诉您的方式并使用他的代码来发送您的消息。 最好的问候