2009-08-24 11 views
194

Próbuję użyć Wget, aby pobrać stronę, ale nie mogę przejść przez ekran logowania.Jak przejść przez stronę logowania za pomocą Wget?

Jak wysłać nazwę użytkownika/hasło za pomocą danych postów na stronie logowania, a następnie pobrać rzeczywistą stronę jako uwierzytelniony użytkownik?

+2

Dla Zwijanie: http://stackoverflow.com/questions/12399087/curl-to-access-a-page-that-requires-a-login-from-a-different-page –

Odpowiedz

276

podstawie strony podręcznika:

# Log in to the server. This only needs to be done once. 
wget --save-cookies cookies.txt \ 
    --keep-session-cookies \ 
    --post-data 'user=foo&password=bar' \ 
    --delete-after \ 
    http://server.com/auth.php 

# Now grab the page or pages we care about. 
wget --load-cookies cookies.txt \ 
    http://server.com/interesting/article.php 

Upewnij się, że parametr --post-data jest prawidłowo percent-encoded (zwłaszcza ampersandy!) Czy wniosek będzie prawdopodobnie zawiedzie. Upewnij się również, że poprawne są klucze user i password; możesz znaleźć właściwe klucze, wyszukując kod HTML strony logowania (zajrzyj do funkcji "inspect element" przeglądarki i znajdź atrybut name w polach nazwa użytkownika i hasło).

+9

dodać --keep-session-cookies do pierwszego polecenia, lub drugie? –

+4

Nie potrzebujesz do tego '-p' (' --ppp-requisites'). –

+12

Warto też dodać '--delete-after' do pierwszego pobierania, aby nie kończyło się zapisywanie strony wyników z logowania. –

7

Jeśli używasz uwierzytelniania podstawowego:

wget http://username:[email protected]/page.html 

Jeśli używasz Wysłany dane formularza, trzeba użyć czegoś jak cURL zamiast.

+0

nie mam dostęp do zmiany czegokolwiek na serwerze, to jest tylko do odczytu –

+7

Tak? Nic z tego nie wymaga zmiany niczego na serwerze. – ceejayoz

8

Nie potrzebujesz cURL, aby uzyskać dane formularza POSTed. --post-data 'key1=value1&key2=value2' działa dobrze. Uwaga: możesz również przekazać nazwę pliku do wget z danymi POST w pliku.

21

Miałem ten sam problem. Moim rozwiązaniem było zalogowanie się przez Chrome i zapisanie plików cookie do pliku tekstowego. Można to łatwo zrobić dzięki temu rozszerzeniu Chrome: Chrome cookie.txt export extension.

Gdy otrzymasz dane z plików cookie, istnieje również przykład użycia ich w usłudze wget. Prosta linia poleceń Kopiuj-Wklej jest dostarczana.

+1

Niestety nie dotyczy skryptów automatycznych. – Znik

40

Bezpośrednio przekazałem pliki cookie z istniejącego połączenia do wget z --no-cookies i nagłówkiem żądania HTTP Cookie. W moim przypadku był to login uniwersytetu Moodle, w którym logowanie jest bardziej złożone (przy użyciu wielu próśb z biletem logowania). Dodałem --post-data, ponieważ było to żądanie POST. Na przykład, uzyskać wszystkie listy użytkowników Moodle:

wget --no-cookies --header "Cookie: <name>=<value>" --post-data 'tab=search&name=+&personsubmit=Rechercher&keywords=&keywordsoption=allmine' https://moodle.unistra.fr/message/index.php

+2

Niesamowita wskazówka. Jest to przydatne, gdy można uzyskać dostęp do pliku cookie z własnego komputera, a następnie użyć go z innej maszyny bezgłowej z wiersza poleceń. :) – Tuxdude

20

Jeśli jest to potrzebne do jednorazowego użytku, można zalogować się za pomocą przeglądarki i skopiować potrzebne nagłówki potem:

screenshot Use „Kopiuj jako cURL "na karcie Network w Developer Tools (odśwież stronę po otwarciu) i zastąp flagę nagłówka curl -H za pomocą wget's --header.

7

Potrzebowałem jednolinijki, która nie pobiera żadnych plików; Oto przykład potokowania pliku cookie do następnego żądania. I tylko przetestowane następujące na Gentoo, ale powinien działać w większości * środowiskach uniksowych:

wget -q -O /dev/null --save-cookies /dev/stdout --post-data 'u=user&p=pass' 'http://example.com/login' | wget -q -O - --load-cookies /dev/stdin 'http://example.com/private/page' (jest to jedna linia, choć jest prawdopodobne, okłady w przeglądarce)

Jeśli chcesz wyjście zapisywane w plik, zmień -O - na -O /some/file/name

0

Użyłem jednego rozwiązania, które używało rysia i wget. Jeśli chcesz użyć wget do pobrania pliku z witryny, która wymaga zalogowania, wystarczy plik cookie. Aby wygenerować plik cookie, wybieram Lynx. lynx to przeglądarka tekstowa. Najpierw potrzebujesz pliku konfiguracyjnego dla rysia, aby zapisać plik cookie. Utwórz plik lynx.cfg. Zapisz te konfiguracje do pliku.

SET_COOKIES:TRUE 
ACCEPT_ALL_COOKIES:TRUE 
PERSISTENT_COOKIES:TRUE 
COOKIE_FILE:cookie.file 

Potem zacznij rysie z tym poleceniem:

lynx -cfg=lynx.cfg http://the.site.com/login 

Po wprowadzić nazwę użytkownika i hasło, a następnie wybierz „zachować mnie na tym komputerze” lub coś podobnego. Po pomyślnym zalogowaniu się zobaczysz piękną stronę tekstową strony. A wylogowujesz się. W bieżącym katalogu znajduje się plik cookie o nazwie plik cookie.file. Właśnie tego potrzebujemy dla wget.

Następnie można pobrać plik z serwisu za pomocą tego polecenia.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz 
Powiązane problemy