Script para baixar arquivo de área restrita

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:

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.

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”.