почему скручивание и wget приводят к запрету 403?

57

Я пытаюсь загрузить файл с, wgetи curlон отклонен с ошибкой 403 (запрещено).

Я могу просмотреть файл с помощью веб-браузера на том же компьютере.

Я пытаюсь снова с пользовательским агентом моего браузера, полученным http://www.whatsmyuseragent.com . Я делаю это:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

а также

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

но это все еще запрещено. Какие другие причины , там может быть за 403, и каким образом я могу изменяю wgetи curlкоманды для их преодоления?

(речь идет не о возможности получить файл - я знаю, что могу просто сохранить его из браузера; речь идет о понимании того, почему инструменты командной строки работают по-разному)

Обновить

Спасибо всем за прекрасные ответы на этот вопрос. Конкретная проблема, с которой я столкнулся, заключалась в том, что сервер проверял реферер. Добавив это в командную строку, я мог получить файл, используя curlи wget.

Сервер, который проверил реферер, отскочил через 302 в другое место, которое вообще не выполняло никаких проверок, поэтому curlили wgetэтот сайт работал нормально.

Если кому-то интересно, это произошло потому, что я читал эту страницу, чтобы узнать о встроенном CSS, и пытался взглянуть на CSS сайта для примера. Фактический URL я получаю проблемы с было это и curlя закончил вверх с

curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

и виджет

 wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

Очень интересно.

starfry
источник
7
Страницы, которые проверяют реферера, действительно раздражают. Заголовок должен быть необязательным и использоваться для сбора статистики.
Зааде
Самая простая вещь, которую я нашел, - это преобразовать ее в zip-файл и использовать его таким образом.
Пиниини

Ответы:

40

HTTP-запрос может содержать больше заголовков, которые не установлены curl или wget. Например:

  • Cookie: это наиболее вероятная причина отклонения запроса, я видел, как это происходило на сайтах загрузки. Имея cookie key=val, вы можете установить его с помощью опции -b key=val(или --cookie key=val) для curl.
  • Referer (sic): при нажатии на ссылку на веб-странице большинство браузеров, как правило, отправляют текущую страницу в качестве реферера. На него не следует полагаться, но даже eBay не удалось сбросить пароль, когда этот заголовок отсутствовал. Так что да, это может случиться. curlВариантом является -e URLи --referer URL.
  • Авторизация: это становится все менее популярным в настоящее время из-за неконтролируемого пользовательского интерфейса диалога имени пользователя / пароля, но это все еще возможно. Это можно установить curlс помощью опции -u user:password(или --user user:password).
  • User-Agent: некоторые запросы будут давать разные ответы в зависимости от User Agent. Это может быть использовано хорошим способом (предоставление реальной загрузки, а не списка зеркал) или неправильным способом (отклонение пользовательских агентов, которые не запускаются Mozilla, или не содержат, Wgetили curl).

Обычно вы можете использовать инструменты разработчика вашего браузера (Firefox и Chrome поддерживают это), чтобы прочитать заголовки, отправленные вашим браузером. Если соединение не зашифровано (то есть не использует HTTPS), вы также можете использовать для этой цели анализатор пакетов, например Wireshark.

Помимо этих заголовков, веб-сайты могут также вызывать некоторые действия за кулисами, которые изменяют состояние. Например, при открытии страницы возможно выполнение запроса в фоновом режиме для подготовки ссылки на скачивание. Или перенаправление происходит на странице. Эти действия обычно используют Javascript, но также может быть скрытая рамка для облегчения этих действий.

Если вы ищете метод легко получить файлы с сайта загрузки, посмотрите на plowdown, включенный с лемехом .

Lekensteyn
источник
Другая действительно извращенная возможность состоит в том, что сервер по какой-то причине был настроен на возврат 403 вместо 200 при успешном завершении.
Касперд
1
Это дало мне подсказку, в которой я нуждался. Попробовав куки, я обнаружил, что проблема с реферером (теперь, если только это можно было бы правильно записать !!!)
starfry
2
Если он еще не удается в wgetпопытке добавления --auth-no-challenge. Работает как магия.
Джонатан
13

Просто хочу добавить к приведенным выше ответам, что вы можете использовать функцию «Копировать как cURL», присутствующую в инструментах разработчика Chrome (начиная с версии 26.0) и Firebug (начиная с версии 1.12 ). Вы можете получить доступ к этой функции, щелкнув правой кнопкой мыши строку запроса на вкладке Сеть.

solde9
источник
Это очень помогло, особенно инструменты в Chrome. Когда я попробовал в Firefox, заголовок запроса после 302 был все, что я мог видеть. В Chromium я мог видеть оба, и это дало мне информацию, чтобы решить проблему.
Starfry
1
@starfry Вам нужно поставить галочку Enable persistent logsна вкладке настроек инструментов разработчика Firefox, чтобы запретить очистку сетевых журналов при перенаправлении. У Chrome аналогичная опция. Кстати, «Копировать как cURL» уже давно присутствует в Firefox Nightly / Aurora / Beta и выйдет в следующем крупном выпуске (31.0).
Боб
9

Пробовал все вышеперечисленное, однако не повезло; использовал инструмент браузера dev для получения строки user-agent, как только я добавил следующее, успешно:

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
user3707737
источник
5

В зависимости от того, что вы просите, это может быть печенье. С Firefox, вы можете сделать щелчок правой кнопкой мыши, когда вы находитесь на странице, о которой идет речь, «Просмотр информации о странице». Выберите значок «Безопасность», а затем нажмите кнопку «Просмотр файлов cookie».

Для того, чтобы озадачить куки, необходим плагин Firefox «Live HTTP Headers». Вы можете видеть, какие файлы cookie установлены и какие файлы cookie отправляются обратно на веб-сервер.

wgetможет работать с файлами cookie, но это приводит в бешенство, поскольку не дает намек на то, что они не отправляли файлы cookie. Лучше всего, чтобы вы удалили все связанные куки из вашего браузера и прошли через любой начальный логин или последовательность просмотра страниц. Посмотрите на «Живые HTTP заголовки» для файлов cookie и любых параметров POST или GET. Выполните первый шаг входа в систему с wgetиспользованием параметров «--keep-session-cookies» и «--save-cookies». Это даст вам файл cookie, который вы можете просмотреть в текстовом редакторе. Используйте wget --load-cookiesс файлом cookie для следующих шагов.

Брюс Эдигер
источник
1
Я протестировал без файлов cookie в Firefox, открыв личное окно просмотра, и, как и ожидалось, я получил ошибку 403. Интересно, что вы не получите ошибку в новой вкладке. В Chromium новая вкладка возвращает 403.
starfry
1
Кстати, вы можете использовать вкладку сети инструментов разработчика Firefox для проверки отправленных и полученных файлов cookie без каких-либо надстроек. То же самое для Chrome / Хром.
Боб
@ Боб - да, я нашел это. Это заняло у меня несколько минут, потому что это не было чем-то. Firebug теперь имеет функцию «Копировать как CURL», но было бы неплохо увидеть и его нативные инструменты.
Звездный день
1

Еще одна причина, по которой это может произойти, - если сайт требует SSL. Ваш браузер будет автоматически пересылать с HTTP на HTTPS, но curl и wget не будут. Поэтому попробуйте запрос с HTTPS вместо HTTP.

Ричард
источник
3
Это закончится ошибкой 301 или 302, Перенаправить, если я прав.
Jakuje