2009-08-24 2 views
194

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

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

+2

Для завитка: http://stackoverflow.com/questions/12399087/curl-to-access-a-page-that-requires-a-login-from-a-different-page –

ответ

276

Основываясь на странице справочника:

# 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 правильно percent-encoded (особенно амперсанды!) Или запрос, скорее всего, не в состоянии. Также убедитесь, что user и password являются правильными ключами; вы можете узнать правильные ключи, проверив HTML-страницу входа (загляните в функцию «проверить элемент» вашего браузера и найдите атрибут name в полях имени пользователя и пароля).

+9

добавить -keep-session-cookies в первую команду или вторую? –

+4

Для этого вам не нужны '-p' (' --page-requisites'). –

+12

Также стоит добавить «-delete-after» в первый поиск, чтобы вы не смогли сохранить страницу результатов из входа. –

7

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

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

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

+0

Я не имею доступ для изменения чего-либо на сервере, только для чтения –

+7

Итак? Ничто из этого не требует изменения чего-либо на сервере. – ceejayoz

8

Для получения данных POSTED формы вам не требуется cURL. --post-data 'key1=value1&key2=value2' работает просто отлично. Примечание: вы также можете передать имя файла в wget с данными POST в файле.

21

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

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

+1

, к сожалению, не применяется в автоматизированных сценариях – Znik

40

Я напрямую передал файлы 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

+2

Удивительный совет. Это полезно, когда вы можете получить доступ к файлу cookie с вашей собственной машины, а затем использовать его с другого безголового компьютера из командной строки. :) – Tuxdude

20

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

screenshot Использование «Копировать в cURL "на вкладке« Сеть »инструментов разработчика (перезагрузите страницу после открытия) и замените флаг заголовка curl -H на wget's --header.

7

Мне нужен один вкладыш, который не загружал файлы; здесь приведен пример вывода файла 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' (это одна линия, хотя это скорее всего компрессы на вашем браузере)

Если вы хотите, чтобы вывод, сохраненные на file, change -O - to -O /some/file/name

0

Я использовал одно решение, которое использовало рысь и wget. Если вы хотите использовать wget для загрузки некоторого файла с сайта, для которого требуется логин, вам просто нужен файл cookie. Чтобы сгенерировать файл cookie, я выбираю lynx. lynx - это текстовой веб-браузер. Сначала вам нужен файл конфигурации для 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 
Смежные вопросы