Jak ominąć stronę logowania za pomocą Wget?


Odpowiedzi:


341

Na 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 --post-dataparametr jest poprawnie zakodowany procentowo (szczególnie ampersands!), W przeciwnym razie żądanie prawdopodobnie się nie powiedzie. Upewnij się także, że useri passwordsą poprawne klucze; możesz znaleźć poprawne klucze, przesuwając kod HTML strony logowania (zajrzyj do funkcji przeglądarki „sprawdź element” i znajdź nameatrybut w polach nazwy użytkownika i hasła).


10
dodać --keep-session-cookies do pierwszego polecenia, czy drugiego?
Felipe Alvarez,

4
Nie potrzebujesz do tego -p( --page-requisites).
ændrük

14
Warto również dodać --delete-afterdo pierwszego wyszukiwania, aby nie zapisać strony wyników z logowania.
Jim Hunziker

2
Dostaję błąd WGET64: missing URLUmieściłem całą komendę wget w jednym wierszu i usunąłem `\ '
Mowgli

6
--keep-session-cookies jest potrzebne tylko dla pierwszego polecenia. Mówi pierwszemu poleceniu, aby dołączyć sesyjne pliki cookie podczas zapisywania plików cookie w pliku. Drugie polecenie po prostu odczytuje wszystkie pliki cookie z dostarczonego pliku.
wadim

63

Jeśli potrzebujesz go jednorazowo, możesz zalogować się przez przeglądarkę i skopiować potrzebne nagłówki:

zrzut ekranu Użyj „Kopiuj jako cURL” na karcie Sieć w Narzędziach programisty (przeładuj stronę po otwarciu) i zamień flagę nagłówka curl -Horaz na --datawget --headeri --post-data.


1
Świetne rozwiązanie!
menteith

Niesamowite! Wskazałem też na opcję używania curl zamiast wget, ponieważ może zrobić to samo i nawet nie muszę zmieniać parametrów.
Jan

bardzo czyste i proste rozwiązanie, +1!
Kresimir Pendic

To działało dla mnie, podczas gdy wgetprzy prawidłowym pliku cookie nie; Podejrzewam, że usługa sieci Web sprawdza wiele różnych nagłówków GET, nawet pozornie nieistotnych, takich jak „User-Agent” lub „Cache-Control”.
Arthur

@Arthur dla mnie to jedyne rozwiązanie, które zadziałało. Próbowałem usunąć jak najwięcej danych nagłówka z adresu URL, ale w końcu otrzymałem dane cookie. Podejrzewam, że wgetpodałem dane w niewłaściwy sposób.
Florian Blume

62

Bezpośrednio podałem pliki cookie istniejącego połączenia do wget z --no-cookies i nagłówkiem żądania HTTP Cookie. W moim przypadku było to logowanie do uniwersytetu Moodle, gdzie logowanie wygląda na bardziej złożone (przy użyciu wielu żądań z biletem logowania). Dodałem --post-data, ponieważ było to żądanie POST. Na przykład pobierz listę wszystkich 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


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

3
Możesz również ustawić wiele plików cookie jednocześnie, --header „Plik cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d”
Phil C

29

Miałem ten sam problem. Moim rozwiązaniem było zalogowanie się przez Chrome i zapisanie danych cookie w pliku tekstowym. Można to łatwo zrobić za pomocą tego rozszerzenia Chrome : rozszerzenie eksportu cookie.txt Chrome .

Kiedy otrzymujesz dane o ciasteczkach, istnieje również przykład, jak ich używać z wget. Udostępniono Ci prosty wiersz polecenia kopiuj-wklej.


1
niestety nie dotyczy automatycznych skryptów
Znik

1
Pytanie nie określa automatycznego skryptu. To rozwiązanie umożliwia zautomatyzowanie 99% pracy.
Czy Sheppard,

1
Niestety Google musi być zbyt mądry, aby zastosować tę sztuczkę. Nadal dostaję stronę logowania.
Josiah Yoder

1
Oczywiście Google używa tajnych reCAPTCHA ... jak widziałem tak wiele miejsc, użycie standardowych programowych interfejsów API jest w tym przypadku najbardziej praktyczną opcją.
Josiah Yoder

10

Chciałem liniowca, który nie pobierał żadnych plików; Oto przykład potokowania wyjścia pliku cookie do następnego żądania. Testowałem tylko następujące elementy na Gentoo, ale powinno działać w większości środowisk * nix:

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ć prawdopodobnie zawija się w przeglądarce)

Jeśli chcesz zapisać dane wyjściowe w pliku, zmień -O -na-O /some/file/name


9

Nie potrzebujesz cURL, aby wykonać dane formularza POST. --post-data 'key1=value1&key2=value2'działa dobrze. Uwaga: możesz także przekazać nazwę pliku, aby się wget z danymi POST w pliku.


8

Jeśli używają podstawowego uwierzytelnienia:

wget http://username:password@www.domain.com/page.html

Jeśli używają danych formularza POST, musisz zamiast tego użyć czegoś takiego jak cURL .


Nie mam dostępu do zmiany czegokolwiek na serwerze, to jest tylko do odczytu
Señor Reginold Francis

7
Więc? Nic z tego nie wymaga zmiany czegokolwiek na serwerze.
ceejayoz

5

Rozwiązanie wykorzystujące ryś i wget.

Uwaga: Lynx musiał zostać skompilowany z flagą --enable-persistent-cookies, aby to zadziałało

Jeśli chcesz użyć wget do pobrania pliku ze strony, która wymaga zalogowania, wystarczy plik cookie. Aby wygenerować plik cookie, wybieram ryś. Lynx to tekstowa przeglądarka internetowa. Najpierw potrzebujesz pliku konfiguracyjnego dla rysia, aby zapisać plik cookie. Utwórz plik lynx.cfg. Zapisz te konfiguracje w pliku.

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

Następnie uruchom rysia za pomocą tego polecenia:

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

Po wprowadzeniu nazwy użytkownika i hasła oraz wybraniu opcji „zachowaj mnie na tym komputerze” lub czegoś podobnego. Jeśli logowanie się powiedzie, zobaczysz piękną tekstową stronę internetową witryny. I wylogowujesz się. W bieżącym katalogu znajdziesz plik cookie o nazwie cookie.file. Właśnie tego potrzebujemy dla wget.

Następnie wget może pobrać plik z witryny za pomocą tego polecenia.

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

2
co jeśli logowanie wymaga javascript? Ryś nie obsługuje javascript.
Tiberiu

1

Przykład do pobrania za pomocą wget na serwerze linku do dużego pliku, który można uzyskać w przeglądarce.

Na przykład za pomocą Google Chrome.

Zaloguj się tam, gdzie potrzebujesz i naciśnij pobierz. Idź, aby pobrać i skopiować link.

wprowadź opis zdjęcia tutaj

Następnie otwórz DevTools na stronie, na której logujesz się, przejdź do konsoli i pobierz pliki cookie, wprowadzającdocument.cookie

wprowadź opis zdjęcia tutaj

Teraz przejdź do serwera i pobierz plik: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

wprowadź opis zdjęcia tutaj


Ta odpowiedź nie wydaje się dobrze skalować do Google - gdzie są dwie strony plików cookie!
Josiah Yoder

Oczywiście Google używa tajnych reCAPTCHA ... jak widziałem tak wiele miejsc, użycie standardowych programowych interfejsów API jest w tym przypadku najbardziej praktyczną opcją.
Josiah Yoder
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.