WebClient и куки

Пытаюсь программно отправить запрос

https://www.youtube.com/get_video_info

Но в ответ либо не приходит ничего, либо ошибка HTTP Error 429: Too Many Requests.
Однако, если отправлять этот запрос через браузер, то всё работает.
https://www.programmersforum.rocks/t/http-error-429-too-many-requests/2533
В этой теме выяснилось, что меня благополучно забанили на ютубе. Там же сказали, что надо использовать куки браузера.
Но я понятия не имею, что это значит. Куки это, вроде, текстовые файлы. Но что с ними делать, чтобы запрос пошел? Их же там куча, наверное. Какой из них мне нужен и что с ним вообще делать?
Объясните последовательность действий (не код).

Это просто заголовок в запросе. Обычно сервер присылает заголовок Set-Cookie (или еще через JS можно), браузер сохраняет значение куда-то, и потом в запросах к этому домену отправляет это в заголовке Cookie.

Ну и можно экспортировать их из браузера например в виде текстового файла. :arrow_down:

Я всё-равно не очень понял. То есть, ищем плагин к браузеру, экспортируем некую строку, а потом

client.Headers.Add("Cookie", "некая строка");

и всё заработает?

Да, там еще есть CookieContainer Class (System.Net) | Microsoft Docs, но это больше для случаев когда клиент сам принимает все нужные куки. CookieAwareWebClient.cs · GitHub
Хотя в идеале может быть лучше добавить куки в него, чтоб сервер мог менять.

В кого в него?

В него:

То есть, так программа будет сама получать нужные куки и работать с ними?

А какие добавлять-то и сколько? Где их брать? В плагине браузера? Зачем ему несколько кук? Сколько времени живёт каждая кука? etc…

Если прикладывать контейнер к вебклиенту как в примере выше, то да, должно формировать заголовок на основе содержимого контейнера, и добавлять/перезаписывать если сервер попросит.

Так по ссылке youtube-dl описывает это.

Ну сколько сайт хочет, столько и ставит.
Стандартно обычно есть кука с ID сессии на сервере (там данные об авторизации и прочем состоянии) и куки всяких гуглоаналитиков, яндекс.метрик если они стоят.

указано при её установке. Set-Cookie - HTTP | MDN

А если при использовании CookieContainerа произойдёт такая же ошибка, тогда что?

Так а причем тут контейнер, что с ним, что без него, придется снова брать куки из браузера.


        public CookieContainer CookieContainer { get; } = new CookieContainer();

        public string UserAgent { get; set; } = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36";

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            if (request is HttpWebRequest httpRequest)
            {
                httpRequest.CookieContainer = CookieContainer;
                httpRequest.UserAgent = UserAgent;

                httpRequest.ProtocolVersion = HttpVersion.Version11;

                httpRequest.Timeout = 50000;
            }
            return request;
        }

То есть, сюда просто куки добавить и будет работать? Но почему у вас нету никакого метода их добавления?

У контейнера есть методы для добавления CookieContainer.Add Method (System.Net) | Microsoft Docs

Так что надо распарсить тот формат, в котором экспортированы, и добавлять. Ну и при завершении программы можно аналогично сохранять текущие куки в файл.