@Bodden

Эффективный long polling запрос Telegram API каа правильно сделать?

Здравствуйте.
Пытаюсь сделать длинный цикличный запрос к Telegram. Опыта нет, первый раз и меня мучают смутные сомнения, все ли правильно делаю. Приложение запускается.
Для чего нужен "timeout" в строке запроса? С ним или без него ни чего не меняется. Как ограничить запросы? Голова кругом.
Друзья, надеюсь на ваше понимание и критику, мне кажется, все как то должно быть по другому.
Библиотеки не рассматриваю, надо руками все прочувствовать..
using System;
using System.Text.Json;
using static System.Net.Mime.MediaTypeNames;

internal class Program
{
    public static string token { get; set; } = "token";
    public static string idUser = "idUser";
    public static string text = "Bro The Best";
    public static int id_message = 0;

    private static async Task Main(string[] args)
    {       
        Rootobject rootobject = new Rootobject();

        rootobject.keyboard = new string[2][];

        rootobject.keyboard[0] = new string[1];
        rootobject.keyboard[1] = new string[2];

        rootobject.keyboard[0][0] = "Сохранить";
        rootobject.keyboard[1][0] = "Редактировать";
        rootobject.keyboard[1][1] = "Отмена";

        var jsonSt = JsonSerializer.Serialize(rootobject);

        HttpClient httpClient = new HttpClient();

        var url = $"https://api.telegram.org/bot{token}/sendMessage?chat_id={idUser}" +
            $"&text={text}&reply_markup={jsonSt}";

        using (HttpResponseMessage httpResponseMessage = await httpClient.GetAsync($"{url}"))
        {
            var jsonString = await httpResponseMessage.Content.ReadAsStringAsync();
        }

        while (true)
        {          
            
            await Task.Delay(500);
            string? jsonString;
            url = $"https://api.telegram.org/bot{token}/getUpdates?offset=-1&timeout=10";
            using (HttpResponseMessage httpResponseMessage = await httpClient.GetAsync($"{url}"))
            { jsonString = await httpResponseMessage.Content.ReadAsStringAsync(); }

            Response? deserialized = JsonSerializer.Deserialize<Response?>(jsonString);

            if (deserialized != null)
            {
                if (deserialized.result[0].message.message_id > id_message)
                {
                    id_message = deserialized.result[0].message.message_id;
                    
                    await Console.Out.WriteLineAsync(deserialized.result[0].message.text);
                }
            }
   
        }
    }
}
public class Rootobject
{
    public string?[][] keyboard { get; set; }
}

public class Response
{
    public bool ok { get; set; }
    public Result[] result { get; set; }
}

public class Result
{
    public Message message { get; set; }
    public int update_id { get; set; }
}

public class Message
{
    public Chat chat { get; set; }
    public int date { get; set; }
    public From from { get; set; }
    public int message_id { get; set; }
    public string text { get; set; }
}

public class Chat
{
    public string first_name { get; set; }
    public int id { get; set; }
    public string type { get; set; }
    public string username { get; set; }
}

public class From
{
    public string first_name { get; set; }
    public int id { get; set; }
    public bool is_bot { get; set; }
    public string language_code { get; set; }
    public string username { get; set; }
}


Спасибо
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Для чего нужен "timeout" в строке запроса?

long polling - это когда делаешь запрос и ждешь пока произойдет окончание операции. в данном случае, окончание означает то, что какое-то событие произошло и получены обновления.
И тут возникает вопрос - сколько ждать?
Например, ты просто хочешь узнать есть ли новые сообщения - тут ждать не надо, ответ сразу, или это фоновый поток, который должен реагировать на каждое сообщение - тогда надо ждать пока не получишь сообщение, т.е. ждать можешь долго.
Таймаут - это время, которое будет затрачено на эту операцию. Здесь оно выставляется в секундах.
Если таймаут превышен, то соединение разрывается и ответа ты не получаешь, иначе в теле ответа будут нужные данные.
Для твоего случая, ставь таймаут побольше, например, 300 - ждешь 5 минут.
Лучше не ставить бесконечное время ожидания, т.к. что-то может сломаться, а ты об этом не узнаешь и по-факту будешь ожидать ничего
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы