Как пройти страницу входа с помощью Wget?

263

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

Как отправить имя пользователя / пароль, используя данные публикации на странице входа в систему, а затем загрузить фактическую страницу как аутентифицированный пользователь?

Сеньор рединольд фрэнсис
источник
3
Для завитков: stackoverflow.com/questions/12399087/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

342

На основании страницы руководства:

# 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атрибут в полях имени пользователя и пароля).

jarnoan
источник
10
добавить --keep-session-cookies к первой команде или ко второй?
Фелипе Альварес
4
Вам не нужно -p( --page-requisites) для этого.
rndrük
14
Это также стоит добавить --delete-afterк первому поиску, чтобы вы не спасли страницу результатов от входа в систему.
Джим Хунцикер
2
Я получаю сообщение об ошибке, WGET64: missing URLя поместил всю команду wget в одну строку и удалил `\`
Маугли
6
--keep-session-cookies требуется только для первой команды. Он сообщает первой команде, что нужно включить сеансовые куки при сохранении куки в файл. Вторая команда просто читает все куки из предоставленного файла.
Вадим
63

Если вам это нужно для однократного использования, вы можете войти через браузер и впоследствии скопировать необходимые заголовки:

Скриншот Используйте «Копировать как cURL» на вкладке «Сеть» Инструментов разработчика (перезагрузите страницу после открытия) и замените флаг заголовка curl, -Hа --dataтакже wget --headerи --post-data.

пользователь
источник
1
Отличное решение!
Menteith
Потрясающие! Также указал мне на возможность использования curl вместо wget, так как он может делать то же самое, и мне даже не нужно изменять параметры.
Jan
очень чистое и простое решение, +1!
Кресимир Пендик
Это сработало для меня, тогда как wgetс правильным cookie - нет; Я подозреваю, что веб-служба проверяет наличие нескольких различных заголовков GET, даже, казалось бы, неважных, таких как «User-Agent» или «Cache-Control».
Артур
@ Артур для меня это решение было единственным, которое сработало. Я попытался удалить как можно больше данных заголовка из 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

baptx
источник
7
Потрясающий совет. Это полезно, когда вы можете получить доступ к куки-файлу со своего собственного компьютера, а затем использовать его с другого безголового компьютера из командной строки. :)
Tuxdude
3
Вы также можете установить несколько файлов cookie одновременно, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
Phil C
29

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

Когда вы получаете данные куки, есть также пример того, как их использовать с wget. Вам предоставляется простая командная строка copy-paste.

Тор-Эрик Родланд
источник
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, чтобы сделать данные формы POST. --post-data 'key1=value1&key2=value2'работает просто отлично. Примечание: вы также можете передать имя файла в wget с данными POST в файле.

Дж. Пил
источник
8

Если они используют базовую аутентификацию:

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

Если они используют данные формы POST, вам нужно использовать что-то вроде cURL .

ceejayoz
источник
У меня нет доступа, чтобы что-то изменить на сервере, это только для чтения
сеньор Регинольд Фрэнсис
7
Так? Ничто из этого не требует от вас что-либо менять на сервере.
ceejayoz
5

Решение, которое использует lynx и wget.

Примечание: Lynx должен быть скомпилирован с флагом --enable-persistent-cookies, чтобы это работало

Если вы хотите использовать wget для загрузки какого-либо файла с сайта, который требует входа в систему, вам просто нужен файл cookie. Чтобы создать файл cookie, я выбираю lynx. Lynx - это текстовый веб-браузер. Сначала вам нужен файл конфигурации для lynx, чтобы сохранить cookie. Создайте файл lynx.cfg. Запишите эти настройки в файл.

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

Затем запустите lynx с помощью этой команды:

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 - там, где есть две страницы куки!
Иосия Йодер
Конечно, Google использует секретные reCAPTCHA ... как я видел во многих местах, использование стандартных программных API является наиболее практичным вариантом в этом случае.
Иосия Йодер