2009-09-01 11 views
19

Chciałbym przechowywać pliki cookie z jednego otwartego wywołania i przekazać je do następnego. Nie mogę znaleźć odpowiednich doktorów do robienia tego. Byłbym wdzięczny, gdybyś mógł mi wskazać właściwą drogę.
UWAGI: w3.org nie jest faktycznym adresem URL, ale jest krótszy; udawaj tutaj ciasteczka.Ruby's open-uri i ciasteczka

h1 = open("http://www.w3.org/") 
h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot) 

Aktualizacja po 2 nays: Chociaż nie był pomyślany jako retoryczne pytanie gwarantuję, że jest to możliwe. Aktualizacja po tumbleweeds: Zobacz (odpowiedź), jest to możliwe. Zajęło mi to trochę czasu, ale działa.

+2

Za to, co próbujemy zrobić polecam używając [Mechanize] (http://mechanize.rubyforge.org/mechanize/). Jest przeznaczony do tego rodzaju rzeczy. Z jego opisu: "Biblioteka Mechanize służy do automatyzacji interakcji ze stronami internetowymi, Mechanize automatycznie zapisuje i wysyła pliki cookie, wykonuje przekierowania, może śledzić linki i przesłać formularze. Pola formularzy mogą być wypełniane i przesyłane. odwiedziłeś jako historię." –

+0

Ten link zmechanizowany jest martwy, oto nowy http://mechanize.rubyforge.org/ – MCB

+1

Mechanize jest teraz na github: https://github.com/sparklemotion/mechanize – JESii

Odpowiedz

26

Myślałem, że ktoś po prostu wiem, ale myślę, że nie jest powszechnie wykonywane z open-uri. Tutaj jest wersja, że ​​ani brzydki sprawdza prywatności, wygaśnięcia, prawidłowa domena, ani prawidłowa ścieżka:

h1 = open("http://www.w3.org/") 
h2 = open("http://www.w3.org/People/Berners-Lee/", 
      "Cookie" => h1.meta['set-cookie'].split('; ',2)[0]) 

Tak, to działa. Nie, to nie jest ładne, ani w pełni zgodne z zaleceniami, ani nie obsługuje wielu plików cookie (tak jak jest).

Oczywiście protokół HTTP jest bardzo prosta, a open-uri pozwala Ci na większość z nich. Chyba naprawdę chciałem wiedzieć, jak uzyskać plik cookie z żądania h1, aby mógł on zostać przesłany na żądanie h2 (ta część już znałem i pokazałem). Zaskakujące jest to, ile osób w zasadzie miało ochotę odpowiedzieć, mówiąc, żebym nie używał open-uri, a tylko jeden z nich pokazał, jak ustawić plik cookie w jednym wniosku przekazanym do następnego żądania.

1

trzeba by toczyć własną obsługę ciasteczek przez parsowania meta nagłówki podczas czytania i dodanie nagłówka plików cookie w momencie składania wniosku, jeśli używasz open-uri. Rozważ użycie httpclient http://raa.ruby-lang.org/project/httpclient/ lub coś podobnego do zmechanizowania zamiast http://mechanize.rubyforge.org/, ponieważ mają one wbudowaną obsługę plików cookie.

+0

Obawiam się" brak obsługi plików cookie "jest zbyt mocny, jeśli chodzi o wybór słów, ale doceniam linki, ale dokumentacja tego ostatniego wydaje się skąpa." http://mechanize.rubyforge.org/mechanize/WWW/Mechanize/CookieJar.html – dlamblin

+0

Mechanizm Rubiego jest ściśle oparty na Perlu WWW :: Mechanize, który ma kilka ładnych dokumentów Opis plików cookie w dokumentach Perla powinien pomóc zrozumieć, jak działa wersja Ruby. Minęło trochę czasu odkąd go użyłem, ale myślę, że dostarczy on plik cookie i obsłużyć je automatycznie.Możesz zdefiniować własny jar, jeśli chcesz je włączyć lub wyłączyć, lub przechowywać na dysku do ponownego wykorzystania. –

12

Musisz dodać nagłówek "Cookie".

Nie jestem pewien, czy open-uri może to zrobić, czy nie, ale można to zrobić przy użyciu Net :: HTTP.

# Create a new connection object. 
conn = Net::HTTP.new(site, port) 

# Get the response when we login, to set the cookie. 
# body is the encoded arguments to log in. 
resp, data = conn.post(login_path, body, {}) 
cookie = resp.response['set-cookie'] 

# Headers need to be in a hash. 
headers = { "Cookie" => cookie } 

# On a get, we don't need a body. 
resp, data = conn.get(path, headers) 
+2

Tak, open-uri może wysyłać dodatkowe nagłówki: open (url, "Cookie" => cookie) # http://www.ru by-doc.org/stdlib/libdoc/open-uri/rdoc/classes/OpenURI.html –

+0

Czy ta wersja Net :: HTTP bierze pod uwagę datę ważności pliku cookie, ścieżkę lub domenę? – dlamblin

+0

@dambamblin Nie, celowo nie. Najpierw naucz się czołgać, potem chodzić, a następnie biegać. –

2

W zależności od tego, co chce osiągnąć, sprawdź webrat. Wiem, że jest zwykle używany do testowania, ale może również trafić na żywo witryny i robi wiele rzeczy, które Twoja przeglądarka zrobiłaby dla Ciebie, np. Przechowywanie plików cookie pomiędzy żądaniami i przekierowania.

+2

Polecam zamiast tego Mechanize. Będzie trafiać na żywo strony, obsługiwać pliki cookie i śledzić również przekierowania, i faktycznie został zaprojektowany, aby to wszystko zrobić. –

4

Dzięki Matthew Schinckelowi twoja odpowiedź była bardzo przydatna. Korzystanie Net :: HTTP miałem udany

 # Create a new connection object. 
      site = "google.com" 
      port = 80 
      conn = Net::HTTP.new(site, port) 

     # Get the response when we login, to set the cookie. 
     # body is the encoded arguments to log in. 
      resp, data = conn.post(login_path, body, {}) 
      cookie = resp.response['set-cookie'] 

     # Headers need to be in a hash. 
      headers = { "Cookie" => cookie } 

     # On a get, we don't need a body. 
      resp, data = conn.get(path, headers) 

      puts resp.body 
Powiązane problemy