Как использовать curl для получения запроса GET точно так же, как при использовании Chrome?


87

У меня есть веб-API, http://something.com/apiи я хочу использовать GET для получения тела ответа.

Это моя команда:

curl "http://something.com/api"

Конечно, он не работает и выдает сообщение об ошибке.

Когда я использую Chrome и ввожу указанный выше URL, все в порядке. Однако я делаю то же самое с Firefox, URL-адрес дает мне то же сообщение об ошибке. Я пытаюсь повторить действие с расширением Chrome DHC, запрос снова дает правильный ответ. После некоторых поисков я считаю, что вариант curl --user-agentимеет значение. Как правильно установить пользовательский агент в Chrome? Или дело не в этом, проблема в другом поле? Большое спасибо.

Ответы:


123

Если вам нужно установить строку заголовка пользователя в запросе curl, вы можете использовать -Hопцию для установки пользовательского агента, например:

curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome

Использование прокси-инструмента, такого как Charles Proxy, действительно помогает быстро справиться с чем-то вроде того, о чем вы просите. Вот что я делаю, используя эту страницу SO в качестве примера (по состоянию на июль 2015 года с использованием Charles версии 3.10):

  1. Запустите Charles Proxy
  2. Сделать веб-запрос через браузер
  3. Найдите желаемый запрос в Charles Proxy
  4. Щелкните правой кнопкой мыши по запросу в Charles Proxy
  5. Выберите "Копировать запрос cURL".

Скопируйте пример запроса cURL в Charles 3.10.2

Теперь у вас есть запрос cURL, который вы можете запустить в терминале, который будет отражать запрос, сделанный вашим браузером. Вот как выглядел мой запрос к этой странице (с удаленным заголовком cookie):

curl -H "Host: stackoverflow.com" -H "Cache-Control: max-age=0" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" -H "HTTPS: 1" -H "DNT: 1" -H "Referer: https://www.google.com/" -H "Accept-Language: en-US,en;q=0.8,en-GB;q=0.6,es;q=0.4" -H "If-Modified-Since: Thu, 23 Jul 2015 20:31:28 GMT" --compressed http://stackoverflow.com/questions/28760694/how-to-use-curl-to-get-a-get-request-exactly-same-as-using-chrome

Было бы намного лучше, если бы Чарльз поддерживал копирование / экспорт нескольких запросов cURL за один раз
мудрее

Некоторые API, такие как ArcGIS, будут учитывать только Accept: text/htmlзаголовок для принудительного вывода HTML.
sventechie

2
curl -A agent_name - это сокращение
ppostma1

26

Откройте Инструменты разработчика Chrome, перейдите на вкладку «Сеть», сделайте свой запрос (вам может потребоваться установить флажок «Сохранить журнал», если страница обновляется). Найдите запрос слева, щелкните правой кнопкой мыши «Копировать как cURL».


Но cookie в «Копировать как cURL» истекает через несколько минут. По крайней мере, в случае с большинством сайтов. Как я могу автоматизировать получение нового файла cookie?
Gaurav Kansal

6

Проверьте заголовки HTTP, которые Chrome отправляет с запросом (с использованием расширения браузера или прокси), затем попробуйте отправить те же заголовки с помощью CURL - возможно, по одному, пока вы не выясните, какой заголовок (-ы) заставляет запрос работать.

curl -A [пользовательский агент] -H [заголовки] " http://something.com/api "


Я не знаком с этим. Не могли бы вы привести мне несколько реальных примеров настройки пользовательского агента на хром и возможные заголовки?
wdetac 03
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.