Задать вопрос

Как обрабатывать поступающие сообщения от пользователя?

Сделал бота. Каждую секунду отправляю запросы к боту, получая обновления (https://api.telegram.org/bot ТОКЕН/getUpdates?offset=-1), а именно последнее сообщение, которое было отправлено пользователем.
Я отправляю боту некоторый текст, он его проверяет и выводит соответствующее сообщение.
Проблема заключается в том, что сообщение отправляемое ботом повторяется бесконечно. Как сделать так, чтобы я боту отправил сообщение, а он мне только один раз ответ.

Код который отправляет запросы
public  void Listen(object state)
        {
            Bot.GetUpdates();
            Bot.Update =  JsonConvert.DeserializeObject<TelegramUpdates>(Bot.GetResponse());

            if (Bot.Update.result[0].message.text == "/hello") Bot.SendMessage("Test message");
        }

Класс с ботом
class TelegramBot
    {
        private string Token;
        private byte[] Buffer = new byte[8192];
        
        private HttpWebResponse Response;
        private Stream ResponseStream;

        public TelegramUpdates Update;
        

        StringBuilder ResposeString= new StringBuilder();


        public TelegramBot(string InputToken)
        {
            Token = InputToken;      
        }

        public void SendMessage(string InputMessage)
        {

            WebRequest Request = (HttpWebRequest)WebRequest.Create("https://api.telegram.org/bot" + Token + "/sendMessage?chat_id=228451619&text="+InputMessage+"");
            Response = (HttpWebResponse)Request.GetResponse();
            Request.Abort();
            
        }

        public string GetResponse()
        {
            ResposeString.Clear();
            ResponseStream = Response.GetResponseStream();

            string tempString = null;
            int count = 0;


            do
            {
               
                count = ResponseStream.Read(Buffer, 0, Buffer.Length);
                if (count != 0)
                {
                   tempString = Encoding.ASCII.GetString(Buffer, 0, count);
                   ResposeString.Append(tempString);
                }
            } while (count > 0);

            
            return ResposeString.ToString();
        }

        public void GetUpdates()
        {
            WebRequest Request = (HttpWebRequest)WebRequest.Create("https://api.telegram.org/bot" + Token + "/getUpdates?offset=-1");
            Response = (HttpWebResponse)Request.GetResponse();
        }
        
        

    }
  • Вопрос задан
  • 8847 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
landergate
@landergate
IT-шный jack-of-all-trades
Вам необходимо уйти от схемы с offset=-1.

"getUpdates" возвращает вместе с сообщением update_id. Это число - Ваш offset. На стороне сервера, он всегда последовательно увеличивается.
Используйте этот offset, инкрементя его на +1 с каждым запросом, вернувшим новое сообщение. Можно сохранять номер offset на диск, чтобы он выживал при перезагрузках бота.

https://core.telegram.org/bots/api
> In order to avoid getting duplicate updates, recalculate offset after each server response.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Premium_gold Автор вопроса
Вот класс бота для Telegram, если вдруг кому-нибудь понадобиться:
class TelegramBot
    {
        private string Token;
        private byte[] Buffer = new byte[8192];
        
        private HttpWebResponse Response;
        private Stream ResponseStream;

        private static Timer TimeListen;

        public TelegramUpdates Update;
        public int GlobalOffset;
        

        StringBuilder ResposeString= new StringBuilder();


        public TelegramBot(string InputToken)
        {
            Token = InputToken;

            TimeListen = new Timer(Listen, null, 0, 500);

            try
            {
                GlobalOffset = Convert.ToInt32(File.ReadAllText(@"..\OffsetKey.txt"));

                GlobalOffset += 1;
            }

            catch
            {

                MessageBox.Show("Error file read");
            }
        }

        public void SendMessage(string InputMessage)
        {

            WebRequest Request = (HttpWebRequest)WebRequest.Create("https://api.telegram.org/bot" + Token + "/sendMessage?chat_id=228451619&text="+InputMessage+"");
            Response = (HttpWebResponse)Request.GetResponse();
            Request.Abort();
            
        }

        public string GetResponse()
        {
            ResposeString.Clear();
            ResponseStream = Response.GetResponseStream();

            string tempString = null;
            int count = 0;


            do
            {
               
                count = ResponseStream.Read(Buffer, 0, Buffer.Length);
                if (count != 0)
                {
                   tempString = Encoding.ASCII.GetString(Buffer, 0, count);
                   ResposeString.Append(tempString);
                }
            } while (count > 0);

            
            return ResposeString.ToString();
        }

        public void GetUpdates(int InputOffset)
        {
            WebRequest Request = (HttpWebRequest)WebRequest.Create("https://api.telegram.org/bot" + Token + "/getUpdates?offset="+InputOffset+"");
            Response = (HttpWebResponse)Request.GetResponse();
        }

        private void Listen(object state)
        {
            GetUpdates(GlobalOffset);
            try
            {
                Update = JsonConvert.DeserializeObject<TelegramUpdates>(GetResponse());
                if (Update.result[0].message.text != "")
                {

                    
                    File.WriteAllText(@"..\OffsetKey.txt", GlobalOffset.ToString());

                    GlobalOffset += 1;


                    #region BotLogic

                    if (Update.result[0].message.text == "h") SendMessage("Hello");

                    #endregion
                }

            }

            catch
            {

              

            }



        }

    }

P.S: предложения по улучшению оставляйте в комментариях.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы