2017-02-08 13 views
17

Pracuję nad menedżerem pobierania i próbuję uzyskać wymaganą zawartość cookie przy użyciu HttpWebRequest. Chcę zintegrować moją aplikację z Chrome, aby uzyskać niezbędne nagłówki plików cookie i wartości z przeglądarki.Skąd wiadomo, które pliki cookie muszą zawierać poprawne HttpWebRequest?

Ale najpierw muszę wiedzieć, czy do pobrania treści i plików cookie są wymagane pliki cookie. Nie mogę znaleźć żadnego przydatnego zasobu na ten temat.

To co mogę sobie wyobrazić:

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...... 

Jak mogę zrobić kroki?

+1

Zobacz to rozszerzenie do Chrome: http://www.editthiscookie.com/. Możesz go użyć, aby zobaczyć, które pliki cookie są używane przez żądanie/odpowiedź. –

+0

Dzięki, ale chcę to zrobić w kodzie C#, potrzebuję tylko wymaganego nagłówka pliku cookie. –

Odpowiedz

5

Pliki cookie wymagane do pobrania zawartości z serwera są określone przez ten serwer w nagłówku "Set-Cookie" odpowiedzi HTTP. Rodzajowy scenariusz:

  1. Klient wysyła żądanie HTTP do serwera (może to być strona logowania, lub stronę pobierania)
  2. serwer odpowie odpowiedzi HTTP, który zawiera „Set-Cookie” nagłówek (s)
  3. klient pamięta te wszystkie ciasteczka
  4. Klient korzysta z plików cookie przechowywanych w kroku 3 dla wszystkich kolejnych żądań do tego samego serwera

teraz, biorąc pod uwagę swój scenariusz integracji z Chrome, wyobrażam sobie, że th Wstępne wnioski (kroki od 1 do 3) nie zostaną wykonane przez Twoją aplikację, ale przez samego Chrome. Pliki cookie będą przechowywane w magazynie cookie Chrome. Twoja aplikacja będzie musiała więc pobrać z Chrome wszystkie pliki cookie dla domeny, z której chcesz pobierać pliki, i uwzględnić te pliki cookie w żądaniu (krok 4).

Zobacz dokument o tym, jak używać interfejsu API Chrome do interakcji z jego magazynem plików cookie, oraz Set-Cookie docs from Mozilla, aby uzyskać dokładny opis sposobu, w jaki pliki cookie są określone w odpowiedzi HTTP.

1

To zależy od rzeczywistego pobrania, które chcesz wykonać i wymagań serwera. Większość serwerów umożliwia pobieranie niezależnie od plików cookie.
Jednak zawsze możesz wysłać pliki cookie na wszelki wypadek. Jakie pliki cookie potrzebujesz? Oto kilka zasad, jak to robią przeglądarki: Pliki cookie mają atrybuty domeny i ścieżki. Domena dotyczy subdomen. Tak więc, jeśli zgłoszenie zostanie wysłane na adres http://foo.bar.com/some/path, następujące pliki cookie zostaną wysłane:
-To z domeną com, bar.com i foo.bar.com bez ścieżki
-Samo jak poprzednio, ale o ścieżkach takich jak/some lub some/path itp.

Nie wysyła plików cookie z innych domen ani domen wymienionych powyżej, ale z ścieżką nie zawartą w ścieżce żądania.

Należy więc wyszukiwać pliki cookie w taki sam sposób, w zależności od adresu URL pliku, który należy pobrać.

1

pewno powinna integrować ciasteczko ponieważ stron internetowych wymagających zidentyfikować zestaw danych użytkownika w pliku cookie

bez tego tokena nie można wykonać pobieranie

Cookie być stosowane są zależne od witryny, nie możesz że jeśli strona internetowa potrzebuje ich, czy nie, które są potrzebne, czy nie

Jeśli używasz .NET 4.5+, należy rozważyć użycie „WebRequest.CreateHttp” metoda statyczna https://msdn.microsoft.com/fr-fr/library/ff382788(v=vs.110).aspx

śledzić CookieContainer, że w końcu będą wypełniane nowego pliku cookie z odpowiedzi (Set-Cookie w nagłówku odpowiedzi)

UWAGA: pliki cookie są powiązane z domeną (tj stackoverflow.com) Proponuję zainstalować cookie rozszerzenie do przeglądarki Chrome do gry z

+0

Czy pojemnik z danymi cookie odpowiedzi informuje nas, które pliki cookie są wymagane? Mam również rozszerzenie EditThisCookie dla Chrome, ale są też rodzaje logowania, zabezpieczenia, tylko pliki cookie HTTP i istnieje więcej niż jeden plik cookie, który należy do każdego z nich. Nie mogę zrozumieć, który to plik cookie logowania. –

+0

Nie można określić, które pliki cookie są wymagane, nawet w odpowiedzi. – Shenron

1

Dodałbym zamiast tego komentarz, ale nie ma wystarczającej liczby powtórzeń. Wydajesz się być na dobrej drodze. Propozycja Mateusza Radny do korzystania z EditThisCookie pozwoli ci odkryć ciasteczka, które masz w przeglądarce, ale dla każdego konkretnego serwera, którego zazwyczaj nie potrzebujesz * musisz zdecydować, który plik cookie jest tym, który (tak naprawdę nie musisz przejmować się tym, który jest login cookie).

Protokół dotyczący plików cookie polega na tym, że przeglądarka powinna odesłać pliki cookie, które serwer WWW wysłał początkowo do przeglądarki dla tej konkretnej witryny.Może pomóc w czytaniu nieco więcej o ciasteczkach: https://en.wikipedia.org/wiki/HTTP_cookie (prawdopodobnie przeskoczyć do Implementacja, a następnie przeczytać trochę w Prywatność i ciasteczka stron trzecich, ponieważ tak naprawdę nie chcesz dzielić się plikami cookie z jednej strony z innymi stronami).

Zakładając, że chcesz emulować to, co wyśle ​​przeglądarka, upewnij się, że menedżer pobierania wysyła również ten sam zestaw plików cookie, który Chrome otrzymał z tej konkretnej witryny i powinien działać. Należy również unikać buforowania plików cookie w kodzie, ponieważ przeglądarka zaktualizuje pliki cookie (np. Usunie wygasłe pliki cookie), dlatego zawsze należy je pobierać z przeglądarki za każdym razem, gdy jej potrzebujesz.

* Uwaga: Czasami plik cookie jest oznaczany tylko dla niektórych typów połączeń lub do użytku z określoną domeną/subdomeną lub ścieżką Uri. Jeśli jest ustawione, powinieneś ograniczyć, kiedy je odeślesz, jeśli pasuje do połączenia, które próbujesz wykonać. Sprawdź to osobno (najnowsze specyfikacje specyfikacji RFC: https://tools.ietf.org/html/rfc6265).

PS: Serwer sieciowy może odesłać nowe lub zaktualizowane pliki cookie w ramach żądania pobrania pobranego przez menedżera pobierania. Jeśli naprawdę chcesz być doskonały, powinny one zostać skopiowane z menedżera pobierania z powrotem do zestawu plików cookie Chrome (chociaż nie znam się na interfejsie API Chrome, więc nie jestem pewien jak trudne to będzie).

1

Spróbuj przechwycić pliki cookie z pierwszego żądania (może to być strona logowania) i dodać je wszystkie w następnym żądaniu (żądanie pobrania). Coś jak poniżej.

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(); 
    } 

Mam nadzieję, że to pomoże.

Powiązane problemy