Como usar curl para obter uma solicitação GET exatamente igual ao uso do Chrome?


87

Eu tenho uma API da web http://something.com/apie quero usar GET para obter o corpo da resposta.

Este é o meu comando:

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

Claro, ele falha e exibe uma mensagem de erro.

Quando eu uso o Chrome e insiro o url acima, tudo está correto. No entanto, eu faço as mesmas coisas com o Firefox, o url me dá a mesma mensagem de erro. Tento repetir a ação com a extensão DHC do Chrome, a solicitação dá resposta correta novamente. Depois de algumas pesquisas, acredito que a opção curl --user-agentfaz a diferença. Qual é a maneira correta de definir o agente do usuário para o Chrome? Ou não é esse o ponto, o problema vem de outros campos? Muito obrigado.

Respostas:


123

Se você precisar definir a string de cabeçalho do usuário na solicitação curl, poderá usar a -Hopção de definir o agente do usuário como:

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

Usar uma ferramenta de proxy como Charles Proxy realmente ajuda a simplificar o trabalho de algo como o que você está pedindo. Aqui está o que eu faço, usando esta página SO como exemplo (em julho de 2015 usando Charles versão 3.10):

  1. Faça o Charles Proxy funcionar
  2. Faça uma solicitação da web usando o navegador
  3. Encontre a solicitação desejada em Charles Proxy
  4. Clique com o botão direito na solicitação em Charles Proxy
  5. Selecione 'Copiar solicitação cURL'

Copie o exemplo de solicitação cURL em Charles 3.10.2

Agora você tem uma solicitação cURL que pode ser executada em um terminal que irá espelhar a solicitação feita por seu navegador. Esta é a aparência da minha solicitação para esta página (com o cabeçalho do cookie removido):

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

Seria muito melhor se Charles suportasse copiar / exportar várias solicitações cURL de uma só vez
mais sábio

Algumas APIs, como ArcGIS, só respeitarão o Accept: text/htmlcabeçalho para forçar a saída HTML.
sventechie

2
curl -A agent_name é um atalho
ppostma1

26

Abra as Ferramentas do desenvolvedor do Chrome, vá para a guia Rede, faça sua solicitação (pode ser necessário marcar "Preservar registro" se a página for atualizada). Encontre a solicitação à esquerda, clique com o botão direito, "Copiar como cURL".


Mas o cookie em "Copiar como cURL" expira em alguns minutos. Pelo menos no caso da maioria dos sites. Como posso automatizar para buscar um novo cookie?
Gaurav Kansal

6

Verifique os cabeçalhos HTTP que o Chrome está enviando com a solicitação (usando a extensão do navegador ou proxy) e tente enviar os mesmos cabeçalhos com CURL - possivelmente um de cada vez até descobrir quais cabeçalhos fazem a solicitação funcionar.

curl -A [user-agent] -H [headers] " http://something.com/api "


Eu não estou familiarizado com isso. Você pode me dar alguns exemplos reais para definir o agente do usuário para o cromo e possíveis cabeçalhos?
wdetac
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.