O comando cURL permite baixar um arquivo na internet em área restrita (desde que você tenha usuário e senha para acessar) de modo automático – sem interação do usuário. Ele foi testado com acessando o Microsoft SharePoint, uma plataforma de aplicações Web voltada para o compartilhamento de arquivos na web. Existe uma forma de fazer esse download automático usando PowerShell (framework da Microsoft para automação de tarefas e gerenciamento de configuração, embutida no framework .NET), mas nesse caso é possível fazer essa tarefa do Linux também.
Acesso restrito
Quando é permitido que somente algumas pessoas possam acessar/ver/executar determinada página ou conteúdo, esses diretórios e arquivos pertencem a uma área de acesso restrito. Isso é muito útil para uma empresa que deseja compartilhar documentos somente para seus funcionários, ou faculdades com seus alunos, etc.
O acesso a essa área geralmente ocorre através de uma página em um navegador que recebe login e senha. Esses parâmetros são digitados pelo usuário e enviados ao servidor, o que pode ser feito via código HTML (métodos POST e GET). Além dessa medida de segurança, é comum o uso de cookies para identificar o usuário.
Quando o usuário visita o site, um pequeno pacote de dados é enviado pelo site para o navegador do usuário. Esse arquivo é gravado no computador e recebe o nome de cookie. Cada vez que o usuário visita o site novamente, o navegador envia o cookie de volta para o servidor, notificando atividades prévias do usuário. Quando você habilita a opção “Lembrar-me”, seus detalhes de login são armazenados em um cookie com seu navegador, e o período de tempo que você permanece logado automaticamente depende da data de expiração em que o cookie foi fornecido.
O cookie geralmente contém um ID de sessão, que é armazenado no servidor junto com os dados associados a essa sessão – no PHP, eles são armazenados em um arquivo com um nome correspondente ao ID da sessão. Esse valor é muito longo e computacionalmente difícil de prever (é como uma senha). Quando o servidor recebe o cookie que contém esse ID, ele deve corresponder ao ID de sessão armazenado no servidor. Geralmente essa informação tem uma validade de alguns minutos ou horas. Se não estiver especificada a data de validade para o cookie, ele irá expirar assim que o usuário fechar o navegador ou fizer logout. Caso contrário, será preciso fazer um novo login e salvar o novo cookie.
Editar um cookie é mais complicado do que simplesmente abri-lo com o bloco de notas e alterar alguns valores, e mudar a data de validade não pode ser feito a menos que use um navegador ou um software de terceiros, já que envolve o reenvio das informações. Esse site sugeres algumas extensões para editar cookies nos principais navegadores. No Chrome, a extensão Edit this cookie permite alterar a data de expiração usando o scroll do mouse sobre um menu de datas. Depois, basta clicar no “check” para enviar as alterações no cookie.
Para esse exercício de fazer o login automaticamente, será necessário alterar a data para um valor bem alto (concofrme explicado no parágrafo anterior) e então salvar manualmente essa cookie em um diretório desejado. Uma das formas de fazer isso é através do navegador Chrome, instalando a extensão cookies.txt (disponível no link). Ao acessar o site e realizar o login manualmente, clique no botão dessa extensão e será aberto um balão com informações desse tipo:
# HTTP Cookie File for URL_DO_SITE by Genuinous @genuinous. # To download cookies for this tab click here, or download all cookies. # Usage Examples: # 1) wget -x --load-cookies cookies.txt "https://caminho/pagina" # 2) curl --cookie cookies.txt "https://caminho/pagina" # 3) aria2c --load-cookies cookies.txt "https://caminho/pagina" # .netscape.com TRUE / FALSE 946684799 NETSCAPE_ID 100103
A última linha é um exemplo qualquer. Basta clicar no lugar indicado e salvar o arquivo cookie.txt no seu diretório de trabalho.
De acordo com o Unofficial Cookie FAQ, um cookie costuma usar um padrão no formato Netscape, onde cada linha contém um par nome-valor, representando uma única informação armazenada. Uma tabulação é inserida entre cada um dos campos. Da esquerda para a direita, cada campo representa:
- domínio – domínio que criou e que pode ler a variável;
- flag – valor TRUE ou FALSE indicando se todas as máquinas dentro de um determinado domínio podem acessar a variável. Esse valor é definido automaticamente pelo navegador, dependendo do valor definido para o domínio;
- caminho – caminho dentro do domínio para o qual a variável é válida (só aparece quando é o caso);
- segurança – valor TRUE ou FALSE indicando se uma conexão segura com o domínio é necessária para acessar a variável;
- expiração – tempo UNIX em que a variável expirará (definido como o número de segundos desde 01 de janeiro de 1970 00:00:00 GMT);
- Nome – nome da variável;
- valor – valor da variável.
Em muitos casos, os sites também usam certificados SSL (Secure Socket Layer) para gerar um tráfego criptografado com o visitante, criando uma conexão HTTPS segura.
cURL
O cURL é uma ferramenta para transferir dados de/para um servidor, usando um dos protocolos suportados (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP ou FILE). O comando é projetado para funcionar sem a interação do usuário. Assim, ele oferece vários truques úteis como: suporte de proxy, autenticação de usuário, upload de FTP, postagem HTTP, conexões SSL, cookies, etc. No Linux, é alimentado pela biblioteca libcurl, e pode ser instalado através do comando “sudo apt-get install curl”.
Dentre as várias opções do programa, as que são usadas nesse exemplo são:
- -A/–user-agent : Especifica a sequência de Agentes/Navegadores para enviar ao servidor HTTP. Alguns scripts CGIs (pequenos programas que interpretam esses parâmetros e geram a página depois de os processar) mal feitos falham se este campo não estiver definido. Para codificar espaços em branco na seqüência de caracteres, rode a string com aspas. Veja esse exemplo listando vários agentes: “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13”.
- -b/–cookie : Passa os dados para o servidor HTTP como um cookie. Se nenhum símbolo ‘=’ for usado na linha, ele é tratado como um nome de arquivo para usar para ler as linhas de cookies previamente armazenadas. ((O uso deste método também ativa o “analisador de cookies”, o que vai fazer o arquivo de cookies gravar novas cookies vindas do site também.)) O formato do arquivo deve ser de um cabeçalho HTTP simples ou de arquivo de cookie do Netscape / Mozilla.
- -c/–cookie-jar : Especifica o arquivo para gravar todas os cookies enviadas pelo site após completar a operação do comando. Ele escreve todos os cookies previamente lidos a partir de um arquivo especificado, bem como todos os cookies recebidos dos servidores remotos. O arquivo será escrito usando o formato de arquivo de cookie da Netscape. No caso de redirecionamentos (vide opção -L), este método também ativa o “analisador de cookies”, o que faz o cURL gravar os novos cookies de entrada.
- -L/–location: Se o servidor relatar que a página solicitada foi movida para uma localização diferente (indicada com um cabeçalho de localização: e um código de resposta 3XX), esta opção fará com que o cURL refaça o pedido no novo local. Quando a autenticação é usada, o cURL envia suas credenciais para o host inicial. Quando curl segue um redirecionamento e a solicitação não é um GET simples (por exemplo, POST ou PUT), ele fará o pedido seguinte com um GET se a resposta HTTP for 301, 302 ou 303. Se o código de resposta fosse outro 3xx código, curl irá reenviar o seguinte pedido usando o mesmo método não modificado.
- -O/–remote-name: Escreve a saída para um arquivo local com o mesmo nome do arquivo remoto (somente a parte do arquivo remoto, obtido pela URL, é usada, e o caminho é cortado).
- -3/–sslv3: (SSL) Força o curl usar SSL versão 3 ao negociar com um servidor SSL remoto.
- -u/–user : Especifica o nome de usuário e a senha para usar na autenticação do servidor.
Mais opções podem ser vistas no manual do cURL.
Script
Segue um script em bash (para facilitar a definição de variáveis) usando o cURL para acessar uma área restrita (com usuário, senha e cookie) e baixar um arquivo TXT.
#!/bin/bash ## Script para baixar arquivo em área restrita # Credenciais cookie_in='cookies.txt' cookie_out='cookies.txt' agents='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13' user='NOME_DO_USUARIO' pass='SENHA_DO_USUARIO' url='https://caminho/arquivo.txt' # Executar o comando para baixar o arquivo curl --cookie $cookie_in --cookie-jar $cookie_out -L --sslv3 -A "$agents" --user $user:$pass -O $url
Uma opção interessante pode ser a de receber a URL como um parâmetro de entrada nesse script. Isso pode ser feito substituindo a string da variável “url” por “$1” e chamando o script como “./nome_do_script.sh http://caminho/pagina”.