Por que o download não será feito quando um navegador for?

21

Estou executando o Mac OS 10.11.6 El Capitan. Existe um link que eu gostaria de baixar programaticamente:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

Se eu colar este URL em qualquer navegador (por exemplo, Safari), o download funcionará perfeitamente.

No entanto, se eu tentar fazer o download da mesma URL a partir da linha de comando usando curl , isso não funcionará - o resultado é um arquivo vazio:

$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ ls -lA
total 0
-rw-r--r--  1 myname  staff  0 Nov  7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$ 

É claro que posso obter o arquivo por meio do navegador, mas gostaria de entender por que o comando curl acima não funciona.

Por que o curl não pode baixar este arquivo corretamente, quando ele está evidentemente presente no site e pode ser acessado e baixado corretamente por meio de um navegador gráfico?

    
por mattobob 07.11.2016 / 20:11

3 respostas

52

Há um redirecionamento no lado do servidor da web para o seguinte URL: http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg . Por ser um CDN, o comportamento exato (redirecionado ou não) pode depender da sua localização.

curl não segue redirecionamentos por padrão. Para dizer isso, adicione o argumento -L :

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
    
por 07.11.2016 / 23:47
2

Se o navegador conseguir baixar o arquivo, você poderá inspecionar o que o navegador está fazendo. No Google Chrome, você pode usar o seguinte para ver o que está acontecendo.

1) [Visualizar > Desenvolvedor > Ferramentas para desenvolvedores > Separador Rede > Guia Cabeçalhos]

2) Clique no link de download.

3) O link do arquivo aparecerá na guia de ferramentas do desenvolvedor.

4) Clique com o botão direito do mouse no arquivo e selecione Copiar > Copie como cURL.

Agora você tem um link de ativação que funcionará. Ele provavelmente terá parâmetros em excesso que você pode eliminar.

Mais detalhes: link

    
por 05.07.2018 / 12:27
0

Vou converter um dos comentários deste post para uma resposta.

Existem muitos links HTTP / HTTPS que exigem determinados cabeçalhos para funcionar. Isso resultará em uma resposta de trabalho de um navegador da Web, mas não em uma resposta de trabalho em uma solicitação da Web de backend, como curl.

Acabei de encontrar um site que exigia todos os cabeçalhos a seguir. A falha em especificá-los resultou em um tempo limite.

  httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
  httpget.setHeader("Upgrade-Insecure-Requests", "1");
  httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
  httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
  httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
  httpget.setHeader("Connection", "keep-alive");
  httpget.setHeader("Host", "www.thehost.com");
    
por 12.06.2018 / 16:39

Tags