Jak używać curl, aby uzyskać żądanie GET dokładnie tak samo, jak w przypadku Chrome?

85

Mam interfejs API sieci Web http://something.com/apii chcę użyć GET, aby uzyskać treść odpowiedzi.

To jest moje polecenie:

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

Oczywiście kończy się niepowodzeniem i wyświetla komunikat o błędzie.

Kiedy używam Chrome i wprowadzam powyższy adres URL, wszystko się zgadza. Jednak robię to samo z Firefoksem, adres URL wyświetla ten sam komunikat o błędzie. Próbuję powtórzyć akcję z rozszerzeniem Chrome DHC, żądanie ponownie daje poprawną odpowiedź. Po kilku poszukiwaniach uważam, że opcja curl --user-agentma znaczenie. Jaki jest prawidłowy sposób ustawienia klienta użytkownika na Chrome? A może nie o to chodzi, problem pochodzi z innych dziedzin? Dziękuję Ci bardzo.

wdetac
źródło

Odpowiedzi:

122

Jeśli potrzebujesz ustawić ciąg nagłówka użytkownika w żądaniu curl, możesz użyć -Hopcji ustawienia klienta użytkownika, na przykład:

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

Korzystanie z narzędzia proxy, takiego jak Charles Proxy, naprawdę pomaga w krótkiej pracy nad czymś, o co prosisz. Oto, co robię, używając tej strony SO jako przykładu (od lipca 2015 przy użyciu wersji Charles 3.10):

  1. Uruchom Charles Proxy
  2. Wyślij żądanie sieciowe za pomocą przeglądarki
  3. Znajdź żądane żądanie w Charles Proxy
  4. Kliknij prawym przyciskiem myszy żądanie w Charles Proxy
  5. Wybierz „Kopiuj żądanie cURL”

Skopiuj przykład żądania cURL w Charles 3.10.2

Masz teraz żądanie cURL, które możesz uruchomić w terminalu, które będzie odzwierciedlać żądanie wysłane przez Twoją przeglądarkę. Oto jak wyglądało moje żądanie do tej strony (z usuniętym nagłówkiem pliku 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
Mike Grace
źródło
Byłoby o wiele lepiej, gdyby Charles obsługiwał kopiowanie / eksportowanie wielu żądań cURL za jednym razem
mądrzejszy
Niektóre interfejsy API, takie jak ArcGIS, będą respektować Accept: text/htmlnagłówek tylko w celu wymuszenia wyjścia HTML.
sventechie
2
curl -A agent_name to skrót
ppostma1
23

Otwórz narzędzia Chrome Developer Tools, przejdź do zakładki Network, wyślij żądanie (może być konieczne sprawdzenie „Preserve Log”, jeśli strona odświeża się). Znajdź żądanie po lewej stronie, kliknij prawym przyciskiem myszy „Kopiuj jako cURL”.

kaptur
źródło
Ale plik cookie „Kopiuj jako cURL” wygasa po kilku minutach. Przynajmniej w przypadku większości witryn. Jak mogę zautomatyzować pobieranie nowego pliku cookie?
Gaurav Kansal
6

Sprawdź nagłówki HTTP, które Chrome wysyła z żądaniem (używając rozszerzenia przeglądarki lub serwera proxy), a następnie spróbuj wysłać te same nagłówki z CURL - prawdopodobnie pojedynczo, dopóki nie zorientujesz się, które nagłówki powodują, że żądanie działa.

curl -A [agent-użytkownika] -H [nagłówki] " http://something.com/api "

MegaAppBear
źródło
Nie znam tego. Czy możesz podać mi prawdziwe przykłady ustawiania klienta użytkownika na chrome i możliwe nagłówki?
wdetac