Próbuję użyć Wget do pobrania strony, ale nie mogę przejść przez ekran logowania.
Jak wysłać nazwę użytkownika / hasło za pomocą danych pocztowych na stronie logowania, a następnie pobrać rzeczywistą stronę jako uwierzytelniony użytkownik?
# 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).
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:
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.
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:
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.
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
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.
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.
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.
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ą.
Odpowiedzi:
Na podstawie strony podręcznika:
Upewnij się, że
--post-data
parametr jest poprawnie zakodowany procentowo (szczególnie ampersands!), W przeciwnym razie żądanie prawdopodobnie się nie powiedzie. Upewnij się także, żeuser
ipassword
są poprawne klucze; możesz znaleźć poprawne klucze, przesuwając kod HTML strony logowania (zajrzyj do funkcji przeglądarki „sprawdź element” i znajdźname
atrybut w polach nazwy użytkownika i hasła).źródło
-p
(--page-requisites
).--delete-after
do pierwszego wyszukiwania, aby nie zapisać strony wyników z logowania.WGET64: missing URL
Umieściłem całą komendę wget w jednym wierszu i usunąłem `\ 'Jeśli potrzebujesz go jednorazowo, możesz zalogować się przez przeglądarkę i skopiować potrzebne nagłówki:
Użyj „Kopiuj jako cURL” na karcie Sieć w Narzędziach programisty (przeładuj stronę po otwarciu) i zamień flagę nagłówka curl
-H
oraz na--data
wget--header
i--post-data
.źródło
wget
przy 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”.wget
podałem dane w niewłaściwy sposób.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
źródło
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.
źródło
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
źródło
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.źródło
Jeśli używają podstawowego uwierzytelnienia:
Jeśli używają danych formularza POST, musisz zamiast tego użyć czegoś takiego jak cURL .
źródło
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.
Następnie uruchom rysia za pomocą tego polecenia:
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.
źródło
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.
Następnie otwórz DevTools na stronie, na której logujesz się, przejdź do konsoli i pobierz pliki cookie, wprowadzając
document.cookie
Teraz przejdź do serwera i pobierz plik:
wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>
źródło