Як пройти повну сторінку входу за допомогою Wget?


263

Я намагаюся використовувати Wget для завантаження сторінки, але я не можу пройти екран екрана входу.

Як я можу надіслати ім'я користувача / пароль, використовуючи дані публікації на сторінці входу, а потім завантажити фактичну сторінку як зареєстрований користувач?


Відповіді:


341

На основі сторінки керівництва:

# 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

Переконайтесь, що --post-dataпараметр правильно кодується у відсотках (особливо амперсандах!), Або запит, ймовірно, не вдасться Також переконайтесь, що userі чи passwordє правильні клавіші; ви можете дізнатися правильні клавіші, застосувавши HTML-код сторінки входу (перегляньте функцію "перевірити елемент" вашого браузера та знайдіть nameатрибут у полях імені користувача та пароля).


10
додати --keep-session-cookies до першої команди чи другої?
Феліпе Альварес

4
Для цього вам не потрібно -p( --page-requisites).
ændrük

14
Також варто додати --delete-afterдо першого пошуку, щоб ви не закінчилися зберігати сторінку результатів від входу в систему.
Jim Hunziker

2
Я отримую помилку, WGET64: missing URLя помістив всю команду wget в один рядок і видалив `\`
Mowgli

6
- cookie-session-cookies потрібні лише для першої команди. Перша команда повідомляє про включення файлів cookie сеансу під час збереження файлів cookie у файл. Друга команда просто зчитує всі файли cookie з наданого файлу.
вадим

63

Якщо вам це потрібно для одноразового використання, ви можете увійти через браузер і скопіювати потрібні заголовки після цього:

скріншот Використовуйте "Скопіювати як cURL" на вкладці Мережі Інструментів для розробників (перезавантажте сторінку після відкриття) та замініть прапор заголовка curl -Hта --datawget's --headerта --post-data.


1
Чудове рішення!
ментейт

Дивовижно! Також вказав на можливість використання curl замість wget, оскільки він може робити те саме, і мені навіть не потрібно змінювати параметри.
Jan

дуже чисте і просте рішення, +1!
Кресімір Пендич

Це працювало для мене, тоді як wgetз правильним файлом cookie не було; Я підозрюю, що веб-служба перевіряє численні різні заголовки GET, навіть, здавалося б, неважливі, такі як "Користувач-агент" або "Кеш-контроль".
Артур

@Arthur для мене це рішення було єдиним, яке працювало. Я спробував видалити якомога більше даних заголовка з URL, наскільки це можливо, і в основному отримав дані cookie. Тож я підозрюю, що вони wgetподали дані неправильно.
Флоріан Блюм

62

Я безпосередньо передав файли cookie існуючого з'єднання, щоб wget з --no-cookies та заголовком HTTP-запиту Cookie. У моєму випадку це був логін в університеті Moodle, коли вхід виглядає складнішим (використовуючи декілька запитів із квитком для входу). Я додав --post-data, оскільки це був запит POST. Наприклад, отримати список усіх користувачів 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
Дивовижна порада. Це корисно, коли ви можете отримати доступ до файлів cookie з власної машини, а потім використовувати їх на іншій безголовій машині з командного рядка. :)
Tuxdude

3
Ви можете одночасно встановити декілька файлів cookie, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C

29

У мене була така ж проблема. Моє рішення полягало в тому, щоб зробити логін через Chrome і зберегти дані cookie в текстовий файл. Це легко зробити за допомогою цього розширення Chrome : розширення експорту Chrome cookie.txt .

Коли ви отримуєте дані cookie, є також приклад того, як їх використовувати з wget. Вам надано простий командний рядок копіювання та вставки.


1
на жаль, не застосовується в автоматизованих сценаріях
Znik

1
Питання не визначає автоматизований сценарій. Це рішення дозволяє автоматизувати 99% роботи.
Буде Шеппард

1
На жаль, Google повинен бути занадто розумним для цього фокусу. Я все одно отримую сторінку для входу.
Йосія Йодер

1
Звичайно, Google використовує таємні reCAPTCHA ... як я бачив так багато місць, використання стандартних програмних API є найбільш практичним варіантом у цьому випадку.
Йосія Йодер

10

Я хотів однокласника, який не завантажував жодних файлів; ось приклад підключення результатів cookie до наступного запиту. Я перевіряв лише наступне на Gentoo, але він повинен працювати в більшості * 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' (це один рядок, хоча він, ймовірно, завершується у вашому браузері)

Якщо ви хочете, щоб вихід збережений у файлі, змініть -O -на-O /some/file/name


9

Вам не потрібно CURL, щоб робити дані форми POSTed. --post-data 'key1=value1&key2=value2'працює просто чудово. Примітка. Ви також можете передати ім'я файлу, щоб перейти з даними POST у файлі.


8

Якщо вони використовують основну автентифікацію:

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

Якщо вони використовують дані форми POSTed, вам потрібно буде використовувати щось на зразок cURL .


У мене немає доступу, щоб змінити що-небудь на сервері, це лише для читання
сеньор Регінольд Френсіс

7
Так? Нічого цього не вимагає від вас нічого змінити на сервері.
ceejayoz

5

Рішення, яке використовує рись і wget.

Примітка: Lynx повинен був скласти прапор --enable-persistent-cookies, щоб це працювало

Коли ви хочете використовувати wget, щоб завантажити якийсь файл з сайту, який потребує входу, вам просто потрібен файл cookie. Для того щоб генерувати файл cookie, я вибираю рись. lynx - це текстовий веб-браузер. Для збереження файлу cookie спочатку вам потрібен файл конфігурації для рисі. Створіть файл lynx.cfg. Запишіть ці конфігурації у файл.

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

Потім запустіть рись із цієї команди:

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

Після введення імені користувача та пароля та виберіть "зберегти мене на цьому ПК" або щось подібне. Якщо вхід буде успішним, ви побачите прекрасну текстову веб-сторінку сайту. І ви виходите. У поточному каталозі ви знайдете файл cookie з ім'ям cookie.file. Це те, що нам потрібно для wget.

Тоді wget може скачати файл з сайту за допомогою цієї команди.

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

2
що робити, якщо для входу потрібен JavaScript? lynx, схоже, не підтримує JavaScript.
Тіберіу

1

Приклад завантаження за допомогою wget на сервер велике посилання на файл, яке можна отримати у вашому браузері.

Наприклад, за допомогою Google Chrome.

Увійдіть, де вам потрібно, і натисніть скачати. Перейдіть, щоб завантажити та скопіювати своє посилання.

введіть тут опис зображення

Потім відкрийте DevTools на сторінці, де ви входите, перейдіть до консолі та отримайте куки, ввівшиdocument.cookie

введіть тут опис зображення

Тепер перейдіть на сервер і завантажте свій файл: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

введіть тут опис зображення


Ця відповідь, схоже, не відповідає масштабам Google - там, де є дві сторінки cookie!
Йосія Йодер

Звичайно, Google використовує таємні reCAPTCHA ... як я бачив так багато місць, використання стандартних програмних API є найбільш практичним варіантом у цьому випадку.
Йосія Йодер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.