【问题标题】:Save user messages sent to bot and send finished form to other user保存发送给机器人的用户消息并将完成的表单发送给其他用户
【发布时间】:2019-01-26 17:12:08
【问题描述】:

这几天我一直在尝试用我的 Telegram Bot 解决这个问题。

我正试图在用户“/start”成为机器人之后向用户发送一些问题。

我想捕获所有用户的答案,然后将其发送给某个我想在一条消息中查看用户答案的​​用户。

我尝试通过发送内联按钮来做到这一点,但找不到等待用户下一条消息的方法。我试图将答案存储在字符串数组中,但它也不起作用。

在问题结束时,我想在一条消息中将所有用户的答案发送到某个用户 ID/频道,其中包含所有用户问题。

我使用 Telegram.Bot 库。

这是我的代码

static string gotName = "0";
static string gotAge = "0";
static string gotMessage = "0";

static string[] Forminfo = { gotName, gotAge, gotMessage };


 async  private void Bot_OnUpdate(object sender, Telegram.Bot.Args.UpdateEventArgs e)
{
    if (e.Update.Type == UpdateType.Message && e.Update.Message.Text == "/start")
    {
        var streg = new InlineKeyboardMarkup(new[]
        {
            new [] // first row
            {
                InlineKeyboardButton.WithCallbackData("Next Step","start")
            }
        });

        var update = e.Update.Message.Text;

        var strmsg = "To Start The Register please send the bot your name and click on Next Step";
        await bot.SendTextMessageAsync(e.Update.Message.Chat.Id, strmsg, ParseMode.Html, replyMarkup: streg);
        var usermsg = await bot.GetUpdatesAsync();
        Forminfo[0] = usermsg.ToString();
    }
}


async private void Bot_OnCallbackQuery(object sender, Telegram.Bot.Args.CallbackQueryEventArgs e)
{            
    var streg1 = new InlineKeyboardMarkup(new[]
    {
        new [] // first row
        {
            InlineKeyboardButton.WithCallbackData("Next","start1")
        }
    });

    if (Forminfo[0] != "0")
    {
        var startedmsg = "Hello " + Forminfo[0].ToString() + "\n" +
                "Please Send us your Age and click Next";
        try
        {
            await bot.SendTextMessageAsync(e.CallbackQuery.Message.Chat.Id, startedmsg, ParseMode.Html, replyMarkup: streg1);
        }
        catch(HttpRequestException ex)
        {
            await bot.SendTextMessageAsync(e.CallbackQuery.Message.Chat.Id, "To Many Request Please Try Later.", ParseMode.Html);
        }
    }
}

【问题讨论】:

    标签: c# telegram telegram-bot


    【解决方案1】:

    有几件事需要解决:

    • 如果您在OnUpdate 回调中处理的只是消息,请改用OnMessage
    • 您正在使用OnUpdate,然后手动调用GetUpdates。您不能混合使用多种获取更新的方法 - StartReceiving 调用已经在内部处理了对 GetUpdates 的调用。
    • 通过得到一个字符串[] 作为结果,您假设只有一个用户会同时使用该机器人。更好的方法是使用Dictionary<userId, result>
    • 在您的SendTextMessageAsync 呼叫中,如果您发送常规文本,则不必设置ParseMode
    • 如果您从不检查用户是否点击了这些按钮,我看不出您使用这些按钮的目的是什么

    这是一个代码示例,可以执行您想要的操作,但根本不验证输入:

    const long TargetChannelId = 123456;
    static readonly ConcurrentDictionary<int, string[]> Answers = new ConcurrentDictionary<int, string[]>();
    private static async void Bot_OnMessage(object sender, MessageEventArgs e)
    {
        Message message = e.Message;
        int userId = message.From.Id;
    
        if (message.Type == MessageType.Text)
        {
            if (Answers.TryGetValue(userId, out string[] answers))
            {
                if (answers[0] == null)
                {
                    answers[0] = message.Text;
                    await Bot.SendTextMessageAsync(message.Chat, "Now send me your age");
                }
                else if (answers[1] == null)
                {
                    answers[1] = message.Text;
                    await Bot.SendTextMessageAsync(message.Chat, "Now send me your message");
                }
                else
                {
                    Answers.TryRemove(userId, out string[] _);
                    await Bot.SendTextMessageAsync(message.Chat, "Thank you, that's all I need from you");
    
                    string answersText = $"User {answers[0]}, aged {answers[1]} sent the following message:\n{message.Text}";
                    await Bot.SendTextMessageAsync(TargetChannelId, answersText);
                }
            }
            else
            {
                Answers.TryAdd(userId, new string[2]);
                await Bot.SendTextMessageAsync(message.Chat, "Please send me your name");
            }
        }
    }
    

    【讨论】:

    • 如果我想让多个用户填写此表格,如果 2 个不同的用户同时尝试填写表格,那么每个用户都会收到不满意的信息,否则表格会混乱/崩溃?
    • @tuarek 使用此代码 sn-p,几乎任何数量的用户都可以同时与机器人交互,而不会破坏状态
    猜你喜欢
    • 2017-08-29
    • 2014-02-16
    • 2022-11-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多