Bagaimana cara melewati halaman login dengan Wget?

263

Saya mencoba menggunakan Wget untuk mengunduh halaman, tetapi saya tidak bisa melewati layar login.

Bagaimana cara mengirim nama pengguna / kata sandi menggunakan data posting pada halaman login dan kemudian mengunduh halaman yang sebenarnya sebagai pengguna yang diautentikasi?

Señor Reginold Francis
sumber
3
Untuk curl: stackoverflow.com/questions/12399087/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件

Jawaban:

342

Berdasarkan halaman manual:

# 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

Pastikan --post-dataparameter dikodekan persen dengan benar (terutama ampersand!) Atau permintaan mungkin akan gagal. Juga pastikan itu userdan passwordmerupakan kunci yang benar; Anda dapat menemukan kunci yang benar dengan menyapu HTML halaman login (lihat fitur "elemen inspeksi" browser Anda dan temukan nameatribut pada bidang nama pengguna dan kata sandi).

Jarnoan
sumber
10
tambahkan --keep-session-cookies ke perintah pertama, atau yang kedua?
Felipe Alvarez
4
Anda tidak perlu -p( --page-requisites) untuk ini.
ændrük
14
Ini juga layak ditambahkan --delete-afterke pengambilan pertama sehingga Anda tidak akhirnya menyimpan halaman hasil dari login.
Jim Hunziker
2
Saya mendapatkan kesalahan. WGET64: missing URLSaya menaruh seluruh perintah wget dalam satu baris dan menghapus `\`
Mowgli
6
--keep-session-cookies diperlukan hanya untuk perintah pertama. Ini memberitahu perintah pertama untuk memasukkan cookie sesi saat menyimpan cookie ke file. Perintah kedua hanya membaca semua cookie dari file yang disediakan.
wadim
63

Jika Anda memerlukannya untuk sekali pakai, Anda dapat masuk melalui browser dan menyalin tajuk yang diperlukan setelahnya:

tangkapan layar Gunakan "Salin sebagai cURL" di tab Jaringan Alat Pengembang (muat ulang halaman setelah dibuka) dan ganti flag header curl -Hdan --datadengan wget's --headerdan --post-data.

pengguna
sumber
1
Solusi bagus!
menteith
Luar biasa! Juga menunjuk saya ke opsi menggunakan curl, bukan wget, karena dapat melakukan hal yang sama dan saya bahkan tidak perlu mengubah parameter.
Jan
solusi yang sangat bersih dan sederhana, +1!
Kresimir Pendic
Ini bekerja untuk saya, sedangkan wgetdengan cookie yang benar tidak; Saya menduga layanan web memeriksa beberapa header GET yang berbeda, bahkan yang tampaknya tidak penting seperti "User-Agent" atau "Cache-Control."
Arthur
@Arthur bagi saya solusi ini adalah satu-satunya yang berfungsi. Saya mencoba menghapus sebanyak mungkin data tajuk dari URL dan berakhir dengan data cookie. Jadi saya curiga wgetmenyediakan data dengan cara yang salah.
Florian Blume
62

Saya langsung memberikan cookie dari koneksi yang ada ke wget dengan --no-cookies dan header permintaan HTTP Cookie. Dalam kasus saya itu adalah masuk universitas Moodle di mana masuk terlihat lebih kompleks (menggunakan beberapa permintaan dengan tiket masuk). Saya menambahkan --post-data karena itu adalah permintaan POST. Misalnya, dapatkan semua daftar pengguna 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

baptx
sumber
7
Tip yang luar biasa. Ini berguna ketika Anda dapat mengakses cookie dari mesin Anda sendiri dan kemudian menggunakannya dari mesin tanpa kepala lainnya dari baris perintah. :)
Tuxdude
3
Anda juga dapat mengatur beberapa cookie sekaligus, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C
29

Saya memiliki masalah yang sama. Solusi saya adalah melakukan login melalui Chrome dan menyimpan data cookie ke file teks. Ini mudah dilakukan dengan ekstensi Chrome ini: ekstensi ekspor cookie cookie.txt .

Saat Anda mendapatkan data cookie, ada juga contoh tentang cara menggunakannya dengan wget. Baris perintah salin-tempel sederhana disediakan untuk Anda.

Thor-Erik Rødland
sumber
1
sayangnya tidak berlaku dalam skrip otomatis
Znik
1
Pertanyaannya tidak menentukan skrip otomatis. Solusi ini memungkinkan 99% pekerjaan diotomatisasi.
Will Sheppard
1
Sayangnya, Google harus terlalu pintar untuk trik ini. Saya masih mendapatkan halaman login.
Josiah Yoder
1
Tentu saja, Google menggunakan reCAPTCHA rahasia ... seperti yang saya lihat di banyak tempat, menggunakan API terprogram standar adalah pilihan paling praktis dalam kasus ini.
Josiah Yoder
10

Saya ingin satu-liner yang tidak mengunduh file apa pun; berikut adalah contoh piping output cookie ke permintaan berikutnya. Saya hanya menguji yang berikut ini di Gentoo, tetapi seharusnya berfungsi di sebagian besar * nix environment:

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' (ini adalah satu baris, meskipun kemungkinan membungkus di browser Anda)

Jika Anda ingin output disimpan ke file, ubah -O -ke-O /some/file/name

Caleb Grey
sumber
9

Anda tidak perlu cURL untuk melakukan data formulir POST. --post-data 'key1=value1&key2=value2'berfungsi dengan baik. Catatan: Anda juga bisa memasukkan nama file untuk wget dengan data POST dalam file.

J. Piel
sumber
8

Jika mereka menggunakan otentikasi dasar:

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

Jika mereka menggunakan data formulir POSTed, Anda harus menggunakan sesuatu seperti cURL .

ceejayoz
sumber
Saya tidak punya akses untuk mengubah apa pun di server, hanya baca
Señor Reginold Francis
7
Begitu? Tidak satu pun dari ini mengharuskan Anda untuk mengubah apa pun di server.
ceejayoz
5

Solusi yang menggunakan lynx dan wget.

Catatan: Lynx harus dikompilasi dengan flag --enable-persistent-cookies agar dapat berfungsi

Ketika Anda ingin menggunakan wget untuk mengunduh beberapa file dari situs yang memerlukan login, Anda hanya perlu file cookie. Untuk menghasilkan file cookie, saya memilih lynx. lynx adalah browser web teks. Pertama, Anda perlu file konfigurasi untuk lynx untuk menyimpan cookie. Buat file lynx.cfg. Tulis konfigurasi ini ke dalam file.

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

Kemudian mulai lynx dengan perintah ini:

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

Setelah Anda memasukkan nama pengguna dan kata sandi, dan pilih 'pertahankan saya di pc ini' atau yang serupa. Jika berhasil masuk, Anda akan melihat halaman web teks yang indah di situs tersebut. Dan Anda keluar. Di dalam direktori saat ini, Anda akan menemukan file cookie bernama cookie.file. Inilah yang kami butuhkan untuk wget.

Kemudian wget dapat mengunduh file dari situs dengan perintah ini.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz
Ekspresi tersembunyi
sumber
2
bagaimana kalau login membutuhkan javascript? lynx tampaknya tidak mendukung javascript.
Tiberiu
1

Contoh untuk mengunduh dengan wget di server, tautan file besar yang dapat diperoleh di browser Anda.

Misalnya menggunakan Google Chrome.

Login di tempat yang Anda butuhkan, dan tekan unduh. Buka untuk mengunduh dan menyalin tautan Anda.

masukkan deskripsi gambar di sini

Kemudian buka DevTools di halaman tempat Anda masuk, masuk ke Konsol, dan dapatkan cookie, dengan memasukkandocument.cookie

masukkan deskripsi gambar di sini

Sekarang, buka server dan unduh file Anda: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

masukkan deskripsi gambar di sini

Alex Ivasyuv
sumber
Jawaban ini sepertinya tidak cocok untuk Google - di mana ada dua halaman cookie!
Josiah Yoder
Tentu saja, Google menggunakan reCAPTCHA rahasia ... seperti yang saya lihat di banyak tempat, menggunakan API terprogram standar adalah pilihan paling praktis dalam kasus ini.
Josiah Yoder