Wie verwende ich Curl, um eine GET-Anfrage genau wie bei Chrome zu erhalten?

85

Ich habe eine Web-API http://something.com/apiund möchte GET verwenden, um den Antworttext zu erhalten.

Das ist mein Befehl:

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

Natürlich schlägt es fehl und gibt eine Fehlermeldung aus.

Wenn ich Chrome verwende und die obige URL eingebe, stimmt alles. Wie auch immer ich mit Firefox mache, die URL gibt mir die gleiche Fehlermeldung. Ich versuche, die Aktion mit der Chrome-Erweiterung DHC zu wiederholen. Die Anfrage gibt erneut die richtige Antwort. Nach einigem Suchen glaube ich, dass die Curl-Option --user-agenteinen Unterschied macht. Wie kann der Benutzeragent auf Chrome eingestellt werden? Oder ist das nicht der Punkt, das Problem kommt aus anderen Bereichen? Vielen Dank.

wdetac
quelle

Antworten:

122

Wenn Sie die Benutzer-Header-Zeichenfolge in der Curl-Anforderung festlegen müssen, können Sie die -HOption verwenden, um den Benutzeragenten wie folgt festzulegen:

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

Die Verwendung eines Proxy-Tools wie Charles Proxy hilft wirklich dabei, so etwas wie das, was Sie fragen, kurz zu machen. Folgendes mache ich am Beispiel dieser SO-Seite (Stand Juli 2015 mit Charles Version 3.10):

  1. Bringen Sie Charles Proxy zum Laufen
  2. Stellen Sie eine Webanforderung mit dem Browser
  3. Finden Sie die gewünschte Anfrage in Charles Proxy
  4. Klicken Sie mit der rechten Maustaste auf Anfrage in Charles Proxy
  5. Wählen Sie 'cURL-Anfrage kopieren'

Beispiel für eine cURL-Anforderung in Charles 3.10.2 kopieren

Sie haben jetzt eine cURL-Anforderung, die Sie in einem Terminal ausführen können, das die von Ihrem Browser gestellte Anforderung widerspiegelt. So sah meine Anfrage auf dieser Seite aus (mit entferntem Cookie-Header):

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
quelle
Es wäre viel besser, wenn Charles das Kopieren / Exportieren mehrerer cURL-Anfragen auf einmal unterstützen würde
weiser
Einige APIs, wie z. B. ArcGIS, berücksichtigen nur den Accept: text/htmlHeader, um die HTML-Ausgabe zu erzwingen.
Sventechie
2
curl -A Agent_name ist eine Abkürzung
ppostma1
23

Öffnen Sie die Chrome Developer Tools, wechseln Sie zur Registerkarte "Netzwerk" und stellen Sie Ihre Anfrage (möglicherweise müssen Sie "Protokoll beibehalten" aktivieren, wenn die Seite aktualisiert wird). Suchen Sie die Anfrage links und klicken Sie mit der rechten Maustaste auf "Als cURL kopieren".

Hoodslide
quelle
Der Cookie in "Als cURL kopieren" läuft jedoch innerhalb weniger Minuten ab. Zumindest bei den meisten Websites. Wie kann ich es automatisieren, um neue Cookies abzurufen?
Gaurav Kansal
6

Überprüfen Sie die HTTP-Header, die Chrome mit der Anforderung sendet (mithilfe der Browsererweiterung oder des Proxys), und versuchen Sie dann, dieselben Header mit CURL zu senden - möglicherweise einzeln, bis Sie herausgefunden haben, mit welchen Headern die Anforderung funktioniert.

curl -A [Benutzeragent] -H [Header] " http://something.com/api "

MegaAppBear
quelle
Ich kenne mich damit nicht aus. Können Sie mir einige echte Beispiele für das Setzen von User-Agent auf Chrome und mögliche Header geben?
wdetac