响应不是来自Microsoft Bot Framework单击机器人Telegram中的按钮

时间:2018-05-07 07:17:41

标签: c# botframework telegram-bot

问题是当在电报中按下按钮时,机器人控制器没有任何活动。或者我没有抓住它们。 +点击机器人后显示消息"抱歉,我的机器人代码出现问题"。

用于在Microsoft Bot Framework上获取活动的标准类控制器。

    [BotAuthentication]
public class MessagesController : ApiController
{
    [ResponseType(typeof(void))]
    public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
    {
        if (activity != null && activity.GetActivityType() == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new finder_worker());
        }
        else
        {
            HandleSystemMessage(activity);
        }
        return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
    }

    private Activity HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.DeleteUserData)
        {
            // Implement user deletion here
            // If we handle user deletion, return a real message
        }
        else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // Handle conversation state changes, like members being added and removed
            // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
            // Not available in all channels
        }
        else if (message.Type == ActivityTypes.ContactRelationUpdate)
        {
            // Handle add/remove from contact lists
            // Activity.From + Activity.Action represent what happened
        }
        else if (message.Type == ActivityTypes.Typing)
        {
            // Handle knowing tha the user is typing
        }
        else if (message.Type == ActivityTypes.Ping)
        {
            //message.p
        }
        return null;
    }
}

这是我作为活动处理程序编写的类。它使用HeroCard创建按钮。

    [Serializable]
public class finder_worker : IDialog<object>
{
    private const string mark = "sad";
    private const string st_message = "start";
    private const string empty_message = "";

    public async Task StartAsync(IDialogContext context)
    {
        //тут их отлавливает
        context.Wait(MessageReceivedAsync);

    }

    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
        try
        {
            var message = await argument;
            var message_to_send = context.MakeMessage();
            workers.json_worker m = new workers.json_worker(message.ChannelData.ToString());
            await context.PostAsync($"сообщение: {m.message_text}");

            switch (m.message_text)
            {
                case st_message:
                    await context.PostAsync($"инициация знакомства");
                    break;
                case empty_message:
                    await context.PostAsync($"пустое сообщение");
                    break;
                case mark:
                    message_to_send.Attachments.Add(create_button());
                    await context.PostAsync(message_to_send);
                    await context.PostAsync($"тестовое сообщение");
                    //create_button();
                    break;
                default:
                    await context.PostAsync($"прочее сообщение");
                    break;
            }
            context.Wait(MessageReceivedAsync);
        }
        catch(SqlException e)
        {
            await context.PostAsync($"упс... что то не получилось записать на сервер{e.ToString()}");
        }
    }

    public Attachment create_button()
    {

        var card = new HeroCard("Some Text");
        card.Buttons = new List<CardAction>()
        {
            new CardAction()
            {
                Title = "button1",
                Type=ActionTypes.MessageBack,
                Value="button1"
            },
            new CardAction()
            {
                Title = "button2",
                Type=ActionTypes.MessageBack,
                Value="button2"
            }
        };

        Attachment cardAttachment = card.ToAttachment();
        return cardAttachment;
    }
}

作为测试,我发送机器人sad并等待启动按钮。这部分进展顺利。但点击机器人后没有收到任何消息或其他活动。我希望收到可以使用Microsoft Bot Framework工具处理的消息或其他活动。

尝试:

  • 将CardAction的类型指定为:MessageBackPostBackImBack
  • 通过activity.CreateReply
  • 发送按钮

谢谢!

1 个答案:

答案 0 :(得分:0)

ActionTypes.MessageBack 不是电报的有效卡片操作类型(适用于MS团队)。请尝试 PostBack ImBack

public Attachment create_button()
    {

        var card = new HeroCard("Some Text");
        card.Buttons = new List<CardAction>()
        {
            new CardAction()
            {
                Title = "button1",
                Type=ActionTypes.ImBack,
                Value="button1"
            },
            new CardAction()
            {
                Title = "button2",
                Type=ActionTypes.PostBack,
                Value="button2"
            }
        };

        Attachment cardAttachment = card.ToAttachment();
        return cardAttachment;
    }