2012-02-26 20 views
8

Próbuję skrobać dane z witryny za pomocą protokołu HTTPS. Udało mi się wykonać podstawowe żądania za pomocą Network.HTTP.Conduit pomyślnie (księgowanie poświadczeń, itp.), Ale nie udało się wyodrębnić informacji cookie z nagłówków odpowiedzi (Set-Cookie). Wygląda na to, że kanał http ma swoją own mechanism do obsługi ciasteczek, czego nie rozumiem.Używanie przeglądarki przewodowej http

Network.HTTP.Conduit.Browser wydaje się automatycznie obsługiwać pliki cookie (co jest w porządku przeze mnie), ale nie mogłem go uruchomić z powodu braku numeru documentation.

Czy ktoś z większym doświadczeniem czynienia z modułem przeglądarki http-kanałowej mi pokazać, w jaki sposób:

  1. Deal z certyfikatów z podpisem własnym (udało mi się to zrobić z managerCheckCerts w module bazowym)
  2. Wyślij żądanie POST z parametrami zakodowanymi w URL-u w treści, a nie po przekierowaniach (użyłem w tym celu urlEncodedBody)
  3. Użyj pliku cookie z 2. kroku w prostym żądaniu GET i przeczytaj odpowiedź jako (leniwy) ByteString (użyłbym do tego httpLbs)

Dla mnie wygląda na to, że poziom abstrakcji Network.HTTP.Conduit.Browser jest bardziej odpowiedni dla mojej aplikacji w porównaniu do Network.HTTP.Conduit, więc chciałbym wprowadzić przełącznik, nawet gdybym mógł sobie poradzić ciasteczka ręcznie za pomocą tego ostatniego.

+0

Miałem problem ze znalezieniem dokumentacji i wygląda na to, że kod źródłowy ma przykładowy kod: https://github.com/exbb2/http-conduit-browser/blob/master/Network/HTTP/Conduit/Browser.hs – Lionel

Odpowiedz

2

Nigdy nie korzystałam z przeglądarki, ale korzystałem z kanału http. Czytam kod źródłowy, aby odpowiedzieć na te pytania. Przepraszam, jeśli popełniam jakieś błędy.

  1. Zrób to samo co robisz. Po utworzeniu Manager z prawej managerCheckCerts, przekaż to dalej do browse :: Manager -> BrowserAction a -> ResourceT IO a.

  2. makeRequest :: Request IO -> BrowserAction (Response (Source IO BS.ByteString)) trwa Request IO; użyj polecenia urlEncodedBody, jak wcześniej, aby utworzyć żądanie POST z parametrami w treści i przekazać je do makeRequest. Zdaje mi się, że ustawiono redirectCount na 0, aby wyłączyć przekierowanie.

  3. Uważam, że wystarczy użyć getCookieJar :: BrowserAction CookieJar; BrowserAction pochodzi z getBrowserState :: BrowserAction BrowserState.

Sposób, w jaki kanał http zarządza plikami cookie poza modułem przeglądarki, polega na tym, że tak nie jest. Pliki cookie są zwracane w odpowiedzi HTTP; możesz tylko przeanalizować odpowiedź i zapisać pliki cookie w pliku cookie. Właściwie to tak naprawdę działa cała przeglądarka.

Powiązane problemy