如何在 C# 中处理 Telegram bot 上的多个用户?

Posted

技术标签:

【中文标题】如何在 C# 中处理 Telegram bot 上的多个用户?【英文标题】:How to handle multiple users on Telegram bot in C#? 【发布时间】:2018-04-05 03:09:48 【问题描述】:

我编写了一个机器人,它会询问您的姓名并将其写在照片上并将其发送给您,然后它就可以工作了。但问题是当机器人上有多个用户时 它不起作用并且崩溃,我想知道如何分隔用户条目和输出。(就像每个连接的用户都会获得一个单独的会话,因为现在一切都发生在一个会话中并且它崩溃了) 这是我的代码:

    void bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
    
     KeyboardButton[] btns = new KeyboardButton[1];
     btns[0] = new KeyboardButton("ساخت عکس");
        if(e.Message.Text=="ساخت عکس")
        
            bot.SendTextMessageAsync(e.Message.From.Id, "نام خود را وارد کنید", Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0);
           // e.Message.Text = null;
            shart = 1;

        
        else
        
            if (shart == 0)
            
                Telegram.Bot.Types.ReplyMarkups.ReplyKeyboardMarkup markup = new Telegram.Bot.Types.ReplyMarkups.ReplyKeyboardMarkup(btns);

                bot.SendTextMessageAsync(e.Message.From.Id, "برای شروع و ساخت عکس روی دکمه ساخت عکس کلید کنید", Telegram.Bot.Types.Enums.ParseMode.Default, false, false, 0, markup);
            
            if (shart==1)
            
                bot.StartReceiving();
                bot.OnMessage += bot_OnMessage1;
            
        
    

    void bot_OnMessage1(object sender, Telegram.Bot.Args.MessageEventArgs a)
    
        string watermarkText = a.Message.Text;

        //Get the file name.
        string fileName = "C:\\temp\\01.jpg";

        //Read the File into a Bitmap.
        using (Bitmap bmp = new Bitmap(fileName))
        
            using (Graphics grp = Graphics.FromImage(bmp))
            
                //Set the Color of the Watermark text.
                Brush brush = new SolidBrush(Color.White);

                //Set the Font and its size.
                Font font = new System.Drawing.Font("Arial", 50, FontStyle.Bold, GraphicsUnit.Pixel);

                //Determine the size of the Watermark text.
                SizeF textSize = new SizeF();
                textSize = grp.MeasureString(watermarkText, font);

                //Position the text and draw it on the image.
                Point position = new Point((bmp.Width - ((int)textSize.Width + 10)), (bmp.Height - ((int)textSize.Height + 10)));
                grp.DrawString(watermarkText, font, brush, position);
                bmp.Save("c:\\temp\\postpic.jpg", ImageFormat.Png);

                using (FileStream fs = new FileStream("c:\\temp\\postpic.jpg", FileMode.Open))
                

                    fs.CanTimeout.ToString();
                    FileToSend fileToSend = new FileToSend("postpic.jpg", fs);
                    //  var =   FileToSend fts = new FileToSend("postpic", fs);
                    var rep = bot.SendPhotoAsync(a.Message.From.Id, fileToSend, "این عکس را پست کنید").Result;

                
            
        
    

【问题讨论】:

你在哪个平台上写这篇文章,从哪里连接? 在写入输出图像文件时,您似乎使用了硬编码文件名:“c:\\temp\\postpic.jpg”。这将在多个用户访问期间出现问题。而是使用用户名和时间戳生成输出文件名,例如 string fileName = string.Format("c:\\temp\\postpic_0.jpg", DateTime.Now.ToString("ddMMyyyy-HHmmss")); 【参考方案1】:

您正在为每个用户编写(并随后读取)完全相同的文件

mp.Save("c:\\temp\\postpic.jpg"

您需要为每个用户设置一个唯一 文件名。或者更好的是,根本不使用文件。您或许可以只使用本地内存流,而不会让磁盘上的文件杂乱无章。

【讨论】:

是的,我知道没关系,这段代码用于测试,但问题是当有人使用机器人并向机器人发送按摩时,e.Message.Text 是“x”,机器人正在使用“x” ' 做事,但随后其他人来并发送另一条消息,然后 e.Message.Text 更改为 'y',这会使机器人崩溃【参考方案2】:

解决方案不依赖于语言。

您应该在某处为每个用户保留上下文。

有两种方法可以做到这一点:

    使用chatID 的键创建数据库记录,并有一些字段来保持状态。阅读每个请求的记录。 使用内联按钮并在回调数据中传递上下文。

如何存储上下文取决于您。例如https://github.com/strongo/bots-framework 使用如下 URL 格式:

command_name1/command_name2?param1=value2&param2=value2

这允许您实现类似向导的界面并将用户输入保留在参数中。

例如,在 https://t.me/DebtsTrackerBot 中创建债务记录期间使用的这种方法

【讨论】:

以上是关于如何在 C# 中处理 Telegram bot 上的多个用户?的主要内容,如果未能解决你的问题,请参考以下文章

在函数内获取变量更新(Telegram bot、Python3、python-telegram-bot 库、多处理)

Telegram bot php - 广播位置 - 如何读取更改?

在 python-telegram-bot 中如何获取该组的所有参与者?

Telegram bot 消息读取回调

如何使用 Telegram Bot API 获取 Telegram 频道用户列表

如何通过 Telegram Bot API 在消息中发送嵌入图像和文本