Подтвердить что ты не робот

Как узнать, какие файлы cookie необходимы для создания правильного HttpWebRequest?

Я работаю над менеджером загрузки и пытаюсь получить содержимое cookie, используя HttpWebRequest. Я хочу интегрировать свое приложение в Chrome, и поэтому я могу получить в браузере необходимые заголовки и значения cookie.

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

Вот что я себе представляю:

HttpWebRequest req = (WebRequest.Create(url)) as HttpWebRequest;
//At first, get if cookies are necessary?
//If it is, get the required cookie headers 
//Then add the cookies to the request
CookieContainer cc = new CookieContainer();
Cookie c1 = new Cookie("header1", "value1");
Cookie c2 = new Cookie("header2", "value2");
CookieCollection ccollection = new CookieCollection();
ccollection.Add(c1);
ccollection.Add(c2);
cc.Add(uri, ccollection);
req.CookieContainer = cc;
//Get response and other stuff......

Как я могу сделать эти шаги?

4b9b3361

Ответ 1

Файлы cookie, необходимые для получения содержимого с сервера, определяются этим сервером в заголовке HTTP-ответа "Set-Cookie". Общий сценарий:

  • Клиент делает HTTP-запрос на сервер (это может быть страница входа или страница загрузки).
  • Сервер отвечает HTTP-ответом, который содержит заголовки "Set-Cookie"
  • Клиент запоминает все эти файлы cookie
  • Клиент использует куки, хранящиеся на шаге 3, для всех последующих запросов на тот же сервер

Теперь, учитывая ваш сценарий интеграции в Chrome, я предполагаю, что первоначальные запросы (шаги с 1 по 3) не будут выполняться вашим приложением, а самими Chrome. Файлы cookie будут храниться в хранилище файлов cookie Chrome. Так что вашему приложению нужно будет сделать, это получить от Chrome все файлы cookie для домена, в который вы хотите загрузить, и включить эти куки в свой запрос (шаг 4).

Смотрите chrome.cookies документ о том, как использовать API Chrome для взаимодействия со своим хранилищем файлов cookie и Документы Set-Cookie из Mozilla для подробного описания того, как файлы cookie указаны в ответе HTTP.

Ответ 2

Это зависит от фактической загрузки, которую вы хотите выполнить, и требований сервера. Большинство серверов разрешают загрузку независимо от файлов cookie.
Однако вы всегда можете отправлять файлы cookie на всякий случай. Какие файлы cookie вам нужны? Вот несколько правил, которые делают браузеры: Cookie имеет атрибуты Domain и Path. Домен применяется к субдоменам. Итак, если запрос сделан для http://foo.bar.com/some/path, будут отправлены следующие файлы cookie:
-То с доменом com, bar.com и foo.bar.com без пути
-Измените предыдущий, но имеете пути как /some или some/path и т.д.

Он не будет отправлять файлы cookie из других доменов или из перечисленных выше доменов, но с путём, не указанным в пути запроса.

Итак, вам нужно будет искать файлы cookie одинаково в зависимости от URL файла, который вы должны скачать.

Ответ 3

Вы определенно должны интегрировать cookie, потому что веб-сайты, требующие идентификации данных набора пользователей в файл cookie

без этого токена вы не сможете выполнить загрузку

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

Если вы используете .Net 4.5+, рассмотрите статический метод "WebRequest.CreateHttp" https://msdn.microsoft.com/fr-fr/library/ff382788(v=vs.110).aspx

Следите за CookieContainer, в конечном итоге он будет заполнен новым cookie из ответа (заголовок Set-Cookie в ответ)

note: cookie связаны с доменом (например, stackoverflow.com) Я предлагаю вам установить расширение cookie для браузера Chrome, чтобы играть с

Ответ 4

Я бы добавил комментарий вместо этого, но не имел достаточного количества rep. Кажется, вы на правильном пути. Предложение Mateusz Radny об использовании EditThisCookie позволит вам исследовать файлы cookie, которые у вас есть в вашем браузере, но для любого конкретного веб-сервера, который обычно вам не нужен, нужно решить, какой файл cookie есть (поэтому вам действительно не нужно заботиться о том, login cookie).

Протокол для файлов cookie заключается в том, что браузер должен отправить обратно файлы cookie, которые веб-сервер первоначально отправил в браузер для данного веб-сайта. Может помочь прочитать немного больше о файлах cookie: https://en.wikipedia.org/wiki/HTTP_cookie (возможно, перейдем к реализации, а затем немного прочитайте в разделе "Конфиденциальность", потому что вы действительно не хотите передавать файлы cookie с одного веб-сайта с другими веб-сайтами).

Итак, предполагая, что вы хотите эмулировать то, что отправил браузер, убедитесь, что ваш менеджер загрузок также отправляет тот же набор файлов cookie, что и Chrome, полученный с этого конкретного веб-сайта, и он должен работать. Также избегайте кэширования файлов cookie в вашем коде, так как ваш браузер будет обновлять файлы cookie (например, удалять истекшие файлы cookie), и поэтому вы всегда должны получать их из браузера каждый раз, когда вам это нужно.

* Примечание. Иногда cookie отмечен только для определенных типов подключений или для использования с определенным доменом/поддоменом или Uri-контуром. Если установлено, то вы должны ограничить, когда вы отправляете их на основании, если оно соответствует соединению, которое вы пытаетесь сделать. Пожалуйста, изучите это отдельно (последние спецификации RFC: https://tools.ietf.org/html/rfc6265).

PS: веб-сервер может отправлять новые или обновленные файлы cookie как часть запроса на загрузку, сделанного вами через диспетчер загрузки. Если вы действительно хотите быть идеальными, они должны быть скопированы из вашего диспетчера загрузки обратно в набор файлов cookie Chrome (хотя я не знаком с API Chrome, поэтому не уверен, насколько это будет тяжело).

Ответ 5

Попробуйте захватить файлы cookie с первого запроса (может быть страница входа в систему) и добавить все в следующий запрос (запрос на загрузку). Что-то вроде ниже.

public void MakeRequest()
    {
        var container = new CookieContainer();

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/loginpage");
        request.Method = WebRequestMethods.Http.Get;
        request.CookieContainer = container;

        HttpWebResponse response = null;

        response = (HttpWebResponse)request.GetResponse();
        //once you read response u need to add all cookie sent in header to the 'container' so that it can be forwarded on second response
        foreach (Cookie cookie in response.Cookies)
        {
            container.Add(cookie);
        }

        HttpWebRequest downRequest = (HttpWebRequest)WebRequest.Create("http://example.com/downloadpage");
        downRequest.Method = WebRequestMethods.Http.Get;
        downRequest.Proxy = null;

        //As you have added the cookies, this must response fine now
        downRequest.CookieContainer = container;
        response = (HttpWebResponse)downRequest.GetResponse();
        var stream = response.GetResponseStream();
    }

Надеюсь, что это поможет.