Wie komme ich mit Wget an der Anmeldeseite vorbei?

263

Ich versuche, mit Wget eine Seite herunterzuladen, komme aber nicht über den Anmeldebildschirm hinaus.

Wie sende ich den Benutzernamen / das Passwort mithilfe der Post-Daten auf der Anmeldeseite und lade dann die eigentliche Seite als authentifizierter Benutzer herunter?

Señor Reginold Francis
quelle
3
Für Locken: stackoverflow.com/questions/12399087/…
Ciro Santilli 法轮功 冠状 病 六四 事件 7

Antworten:

341

Basierend auf der Handbuchseite:

# 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

Stellen Sie sicher, dass der --post-dataParameter richtig prozentual codiert ist (insbesondere kaufmännisches Und!), Andernfalls schlägt die Anforderung wahrscheinlich fehl. Stellen Sie außerdem sicher, dass userund passworddie richtigen Schlüssel sind. Sie können die richtigen Schlüssel herausfinden, indem Sie den HTML-Code der Anmeldeseite durchsuchen (sehen Sie in der Funktion "Element überprüfen" Ihres Browsers nach und finden Sie das nameAttribut in den Feldern "Benutzername" und "Kennwort").

jarnoan
quelle
10
--keep-session-cookies zum ersten Befehl oder zum zweiten hinzufügen?
Felipe Alvarez
4
Sie brauchen -p( --page-requisites) dafür nicht.
ændrük
14
Es lohnt sich auch, --delete-afterzum ersten Abruf hinzuzufügen , damit Sie die Ergebnisseite nicht vor dem Anmelden speichern.
Jim Hunziker
2
Ich erhalte eine Fehlermeldung WGET64: missing URLIch habe den gesamten Befehl wget in eine Zeile gesetzt und `\`
Mowgli
6
--keep-session-cookies wird nur für den ersten Befehl benötigt. Es weist den ersten Befehl an, Sitzungscookies einzuschließen, wenn Cookies in der Datei gespeichert werden. Der zweite Befehl liest einfach alle Cookies aus der bereitgestellten Datei.
Wadim
63

Wenn Sie es einmal benötigen, können Sie sich über den Browser anmelden und anschließend die erforderlichen Header kopieren:

Bildschirmfoto Verwenden Sie „Kopieren als curl“ auf der Registerkarte Netzwerk von Developer Tools (die Seite nach dem Öffnen neu laden) und curl Header Flagge ersetzen -Hund --datamit wget ist --headerund --post-data.

Benutzer
quelle
1
Tolle Lösung!
Menteith
Genial! Ich habe auch auf die Option hingewiesen, Curl anstelle von Wget zu verwenden, da dies dasselbe kann und ich nicht einmal die Parameter ändern muss.
Januar
sehr saubere und einfache Lösung, +1!
Kresimir Pendic
Dies funktionierte bei mir, während dies wgetmit dem richtigen Cookie nicht der Fall war. Ich vermute, der Webdienst sucht nach mehreren verschiedenen GET-Headern, auch nach scheinbar unwichtigen wie "User-Agent" oder "Cache-Control".
Arthur
@ Arthur für mich war diese Lösung die einzige, die funktionierte. Ich habe versucht, so viele Header-Daten wie möglich aus der URL zu entfernen und habe im Wesentlichen die Cookie-Daten erhalten. Ich vermute also wget, dass die Daten falsch angegeben wurden.
Florian Blume
62

Ich habe direkt Cookies einer bestehenden Verbindung gegeben, um mit --no-cookies und dem Cookie-HTTP-Anforderungsheader zu wget. In meinem Fall war es ein Moodle-Universitäts-Login, bei dem das Anmelden komplexer aussieht (unter Verwendung mehrerer Anfragen mit einem Login-Ticket). Ich habe --post-data hinzugefügt, weil es eine POST-Anfrage war. Holen Sie sich beispielsweise die Liste aller Moodle-Benutzer:

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

Taufe
quelle
7
Super Tipp. Dies ist nützlich, wenn Sie von Ihrem eigenen Computer aus auf das Cookie zugreifen und dieses dann über die Befehlszeile von einem anderen kopflosen Computer aus verwenden können. :)
Tuxdude
3
Sie können auch mehrere Cookies gleichzeitig setzen, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C
29

Ich hatte das gleiche Problem. Meine Lösung bestand darin, mich über Chrome anzumelden und die Cookie-Daten in einer Textdatei zu speichern. Dies ist mit dieser Chrome-Erweiterung ganz einfach möglich: Chrome-Cookie.txt-Exporterweiterung .

Wenn Sie die Cookie-Daten erhalten, gibt es auch ein Beispiel, wie Sie sie mit wget verwenden können. Eine einfache Befehlszeile zum Kopieren und Einfügen wird Ihnen zur Verfügung gestellt.

Thor-Erik Rødland
quelle
1
Leider nicht anwendbar in automatisierten
Skripten
1
Die Frage spezifiziert kein automatisiertes Scripting. Mit dieser Lösung können 99% der Arbeit automatisiert werden.
Will Sheppard
1
Leider muss Google für diesen Trick zu schlau sein. Ich bekomme immer noch eine Anmeldeseite.
Josiah Yoder
1
Natürlich verwendet Google geheime reCAPTCHAs ... Wie ich an so vielen Orten gesehen habe, ist die Verwendung von programmatischen Standard-APIs in diesem Fall die praktischste Option.
Josiah Yoder
10

Ich wollte einen Einzeiler, der keine Dateien herunterlädt. Hier ist ein Beispiel für das Weiterleiten der Cookie-Ausgabe an die nächste Anforderung. Ich habe nur Folgendes auf Gentoo getestet, aber es sollte in den meisten * nix-Umgebungen funktionieren:

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' (Dies ist eine Zeile, obwohl sie wahrscheinlich in Ihrem Browser angezeigt wird.)

Wenn Sie möchten, dass die Ausgabe in einer Datei gespeichert wird, wechseln Sie -O -zu-O /some/file/name

Caleb Grey
quelle
9

Sie benötigen keine cURL, um POST-Formulardaten zu erstellen. --post-data 'key1=value1&key2=value2'funktioniert gut. Hinweis: Sie können auch einen Dateinamen übergeben, um die POST-Daten in der Datei abzurufen.

J. Piel
quelle
8

Wenn sie die Basisauthentifizierung verwenden:

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

Wenn sie POST-Formulardaten verwenden, müssen Sie stattdessen so etwas wie cURL verwenden.

ceejayoz
quelle
Ich habe keinen Zugriff, um etwas auf dem Server zu ändern, es ist schreibgeschützt
Señor Reginold Francis
7
So? Nichts davon erfordert, dass Sie etwas auf dem Server ändern.
Ceejayoz
5

Eine Lösung, die Luchs und Wget verwendet.

Hinweis: Lynx muss mit dem Flag --enable-persistent-cookies kompiliert worden sein, damit dies funktioniert

Wenn Sie mit wget eine Datei von einer Site herunterladen möchten, für die eine Anmeldung erforderlich ist, benötigen Sie lediglich eine Cookie-Datei. Um die Cookie-Datei zu generieren, wähle ich lynx. lynx ist ein Text-Webbrowser. Zuerst benötigen Sie eine Konfigurationsdatei für lynx, um Cookies zu speichern. Erstellen Sie eine Datei lynx.cfg. Schreiben Sie diese Konfiguration in die Datei.

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

Starten Sie dann lynx mit diesem Befehl:

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

Nachdem Sie den Benutzernamen und das Passwort eingegeben haben, wählen Sie "Mich auf diesem PC behalten" oder ähnliches. Wenn Sie sich erfolgreich anmelden, wird eine schöne Textwebseite der Website angezeigt. Und Sie melden sich ab. Im aktuellen Verzeichnis finden Sie eine Cookie-Datei mit dem Namen cookie.file. Das brauchen wir für wget.

Dann kann wget mit diesem Befehl Dateien von der Site herunterladen.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz
Pokerface
quelle
2
Was ist, wenn für die Anmeldung Javascript erforderlich ist? lynx scheint Javascript nicht zu unterstützen.
Tiberiu
1

Beispiel zum Herunterladen eines großen Dateilinks mit wget auf den Server, den Sie in Ihrem Browser erhalten können.

Zum Beispiel mit Google Chrome.

Melden Sie sich an, wo Sie möchten, und klicken Sie auf Download. Gehen Sie zum Download und kopieren Sie Ihren Link.

Geben Sie hier die Bildbeschreibung ein

Öffnen Sie dann DevTools auf einer Seite, auf der Sie sich anmelden, gehen Sie zur Konsole und holen Sie sich Ihre Cookies, indem Sie eingebendocument.cookie

Geben Sie hier die Bildbeschreibung ein

Gehen Sie jetzt zum Server und laden Sie Ihre Datei herunter: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

Geben Sie hier die Bildbeschreibung ein

Alex Ivasyuv
quelle
Diese Antwort scheint nicht gut auf Google zu skalieren - wo es zwei Seiten mit Cookies gibt!
Josiah Yoder
Natürlich verwendet Google geheime reCAPTCHAs ... Wie ich an so vielen Orten gesehen habe, ist die Verwendung von programmatischen Standard-APIs in diesem Fall die praktischste Option.
Josiah Yoder