O que o curl faz. curl_setopt - Define uma opção para uma sessão CURL. Enviando dados POST

16 de fevereiro de 2006 Jeff Felling

Curl ajuda você a gerenciar dados postados na Web Este artigo discute a ferramenta Curl gratuita, que permite enviar e receber páginas da Web a partir da linha de comando. Graças ao Curl, é fácil automatizar muitos

O Curl ajudará você a gerenciar os dados publicados na Web

Este artigo aborda a ferramenta gratuita Curl, que permite enviar e receber páginas da Web a partir da linha de comando. O Curl facilita a automatização de muitas tarefas de segurança e administração, como extrair uma página da Web para análise ou baixar um patch de segurança da Web.

Instalação de ondulação

O Curl está incluído em muitas distribuições Unix. Binários e fontes estão disponíveis para a maioria dos outros sistemas operacionais. Mesmo programadores PHP de código aberto podem usar o Curl para acessar com segurança o conteúdo da Web diretamente de scripts PHP.

O Curl requer que o pacote OpenSSL funcione com sites da Web Secure Sockets Layer (SSL). Existem duas versões do Curl, uma com SSL e outra sem SSL. Eu recomendo o primeiro, porque o SSL protege os dados com segurança.

Antes de poder usar a funcionalidade Curl com SSL, você deve baixar e instalar separadamente o pacote OpenSSL da web. Os binários do OpenSSL para Windows podem ser baixados do site do projeto GnuWin32 SourceForge em . Este site também tem muitas outras ferramentas úteis portadas para o Windows.

Baixe e instale o pacote OpenSSL e copie os dois arquivos DLL para o diretório system32:

Copie "C:Arquivos de ProgramasGnuWin32 binlibeay32.dll" %windir%system32 copie "C:Arquivos de ProgramasGnuWin32 binlibssl32.dll" %windir%system32

Depois disso, você pode instalar o Curl. Binários Curl compatíveis com SSL para Windows podem ser encontrados em http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi. A versão mais recente, curl 7.15.0, está em win32-ssl-sspi.zip, que contém o arquivo curl.exe e a documentação.

Depois de instalar o Curl, você deve se certificar de que funciona digitando o comando

Curl http://isc.sans.org/infocon.txt

Se uma palavra representando uma cor aparecer na tela (por exemplo, verde), então o Curl está funcionando. Neste exemplo simples, o Curl recupera o conteúdo do Infocon do site Internet Storm Center do SANS Institute. Verde significa que a Internet está funcionando normalmente e nenhuma ameaça grave foi detectada. Se, em vez de verde, aparecerem na tela as palavras amarelo, laranja ou vermelho, deixe este artigo de lado e visite o site http://isc.sans.org para aprender sobre estados de alto risco na Internet. Em caso de erro, você precisa verificar se o Curl está instalado corretamente.

Essencialmente, o Curl recupera uma página da Web e imprime a fonte HTML da página no console. No entanto, as possibilidades da utilidade são mais amplas. O Curl possui verificação de erros integrada. Por exemplo, o comando

Curl http://noserveraqui

dá erro Curl: (6) Não foi possível resolver host: noserverhere; hospedeiro não encontrado. Os códigos de erro podem ser usados ​​em scripts para testar a disponibilidade de uma página da Web ou a resposta de um servidor da Web. Por exemplo, se você usar o Curl para recuperar uma página da Web diariamente, especificamente as estatísticas diárias de um site, poderá adicionar código-fonte ao seu script que procura códigos de erro. Se o Curl fornecer o código de erro Curl: (7) não pôde se conectar ao host, você poderá enviar um alerta imediatamente ou enviar um e-mail.

Extraindo dados criptografados

Uma das vantagens mais importantes do Curl é sua compatibilidade com SSL. As páginas HTTPS solicitadas são enviadas criptografadas pela rede e, em seguida, o Curl exibe o texto recuperado na tela. Além disso, o Curl verifica os certificados - a data de expiração do certificado, o nome do host corresponde ao nome do host do certificado e o nível de confiança do certificado raiz - e avisa se o certificado é inválido. A opção -cacert permite especificar um arquivo de certificado específico. A verificação de certificado é desativada com a opção -k. Uma abordagem alternativa é usar a opção -insecure.

Não apenas para WWW

O Curl é mais do que apenas enviar arquivos pela Internet. Com o Curl, você pode listar rapidamente os diretórios de um site FTP:

Curl ftp://myftpsite

Para ver os subdiretórios do site, você deve digitar o comando

Curl ftp://myftpsite/subdir/

Para baixar um arquivo da rede, basta especificar o nome do arquivo na URL. No exemplo a seguir, um arquivo chamado readme.txt é carregado diretamente da linha de comando e exibido na tela:

Curl ftp://ftp.microsoft.com/deskapps/games/readme.txt

Muitas vezes, é mais fácil criar scripts com o Curl para inserir arquivos FTP do que usar o comando FTP interativamente.

Por padrão, a saída é gravada diretamente no console, mas pode ser redirecionada para um arquivo usando as opções -o e -O. Para obter a página e salvá-la em disco, use a opção -o. A opção -O salva a página resultante em um arquivo local e o Curl recupera o nome do documento remoto. Se nenhum nome de arquivo for especificado na URL, essa operação falhará. Se você usar Curl para enviar uma consulta a um site sem um nome de arquivo, mas quiser salvar o resultado em um arquivo, poderá especificar o nome do arquivo na linha de comando, assim:

Autenticação

Curl fornece métodos de autenticação Basic, Digest e Integrated. Na maioria dos sites, as páginas de autenticação baseadas em formulários podem ser acessadas usando as funções de envio do Curl, como será demonstrado em breve. Isso significa que você pode enviar dados de formulário, como nome de usuário e senha, para um site remoto que solicita informações em uma página da Web. Você pode usar a opção -u para enviar as credenciais ou pode incorporá-las na URL, o que tradicionalmente é feito no FTP, assim:

Curl ftp://nome de usuário: [e-mail protegido]

Usando o Curl, as técnicas emprestadas do FTP podem ser transferidas para o HTTP, como no exemplo a seguir:

Curl http://username:password @myhtmlsite/default.htm

O Curl também fornece acesso a páginas da Web por meio de um servidor proxy. Portanto, Curl pode ser configurado para usar um servidor proxy para autenticação Basic, Digest e NTLM.

Ler a documentação

É difícil cobrir todos os muitos recursos do Curl em um artigo, incluindo upload de arquivos para o servidor (-T), visualização apenas das informações no cabeçalho HTTP (-I), visualização de todos os dados no modo detalhado (-V) e ocultação saída (-s). Eu recomendo dar uma olhada nas funções Curl no tutorial postado em http://curl.haxx.se/docs .

Exemplo de ondulação

Agora que você está familiarizado com o básico do Curl, vejamos um exemplo simples de extração de dados de um site da Web com dados de entrada. Vamos construir uma ferramenta Whois simples que demonstre a facilidade e conveniência de usar o Curl e como enviar dados para um site usando a opção -d. Neste exemplo, Curl envia o endereço IP para o site Arin Whois e, em seguida, recupera os resultados desse site. O Whois procura informações sobre o proprietário de um endereço IP.

É importante pesquisar um site antes de começar, porque o código-fonte de cada site é diferente e o Curl nem sempre funciona da mesma forma para todos os sites. Uma visita preliminar ao site permite coletar as informações necessárias para o funcionamento do Curl. Neste exemplo, usei o navegador para visitar o site http://www.arin.net/whois/, e notamos que o site possui um único campo de entrada de dados no qual os visitantes indicam o endereço IP em que estão interessados. Você precisa obter os detalhes desse campo, que faz parte do formulário da Web. Este exemplo usa o script Perl formfind.pl ( http://cool.haxx.se/cvs.cgi/curl/perl/contrib/formfind?rev=HEAD&content-type=text/vnd.viewcvs-markup). O script Formfind.pl converte dados de formulário em saídas utilizáveis ​​e facilita a pesquisa manual de dados em HTML. Obviamente, o Perl deve ser implantado no computador para executar o Formfind. Um bom pacote Win32 Perl pode ser encomendado no site ActiveState ActivePerl em http://www.activestate.com .

Vamos considerar um exemplo com mais detalhes. Primeiro, vamos ver um site que contém um formulário que solicita informações:

Curl -o whoisOutputFile http://www.arin.net/whois/

Este comando recupera a página Whois de http://www.arin.net e a armazena em um arquivo de texto whoisOutputFile, que contém a fonte HTML que o navegador reproduz quando o site é visitado.

Então você precisa encontrar e destacar os dados do formulário:

./formfind.pl

Formfind retorna variáveis ​​de formulário e seus valores possíveis. Neste exemplo, os resultados de saída são bastante simples (veja abaixo). tela 1).

Observe a entrada de dados do formulário chamada queryinput. Este é um campo de texto onde o Curl deve enviar o endereço IP para pesquisar. O endereço IP específico não importa - neste exemplo, o endereço da Microsoft foi usado. Com a opção -d, o endereço IP pesquisado é enviado para o campo queryinput:

Curl -d "queryinput=207.46.133.140" http://ws.arin.net/cgibin/whois.pl

O comando Curl com a opção -d procura os dados no formulário, neste caso queryinput, que é o endereço IP a ser procurado. Isso altera o endereço de destino; o formulário deve enviar dados para uma nova URL que representa o script whois.pl. O novo endereço de destino pode ser visto na saída do formfind na Tela 1.

Neste exemplo, o texto fonte HTML da resposta Whois também é obtido, mas está oculto por um grupo de tags HTML. Por padrão, a mensagem de status Curl mostra o tamanho do documento, a porcentagem concluída e a taxa de transferência. Você pode limpar um pouco a saída e filtrar o nome da organização que possui o endereço IP. O status do curl pode ser desabilitado usando a opção -s. O comando deve ser executado através do grep para obter apenas o OrgName:

Curl -s -d "queryinput=207.46.133.140" http://ws.arin.net/cgibin/ whois.pl | grep OrganName

Neste exemplo, a saída mostra que OrgName é Microsoft Corp.

@echo off curl -k -s -d "queryinput= %1" http://ws.arin.net/cgibin/ whois.pl | grep OrganName



CURL é um pacote de software que consiste em um utilitário de linha de comando e uma biblioteca para transferência de dados usando a sintaxe de URL.

O CURL suporta muitos protocolos, incluindo DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet e TFTP.

Carregar um único arquivo
O comando a seguir obterá o conteúdo do URL e o exibirá na saída padrão (ou seja, seu terminal).

Curl https://mi-al.ru/ > mi-al.htm % Total % Recebido % Xferd Velocidade Média Tempo Tempo Tempo Dload Atual Upload Total gasto Esquerda Velocidade 100 14378 0 14378 0 0 5387 0 --: --:- - 0:00:02 --:--:-- 5387

Salvando a saída cURL em um arquivo
Podemos salvar o resultado do comando curl em um arquivo usando as opções -o/-O.
  • -o(o minúsculo) resultado será salvo no arquivo especificado na linha de comando
  • -O(O maiúsculo) O nome do arquivo será obtido da URL e será usado para armazenar os dados recuperados.

$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

A página gettext.html agora será salva em um arquivo chamado 'mygettext.html'. Quando o curl é executado com a opção -o, ele exibe uma barra de progresso de download como esta.

% Total % Recebido % Xferd Velocidade Média Tempo Tempo Tempo Dload Atual Upload Total Gasto Esquerdo Velocidade 66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900 100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987

Quando você usa curl -O (O maiúsculo), ele por si só salvará o conteúdo em um arquivo chamado 'gettext.html' na máquina local.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

Nota: Quando o curl precisa gravar dados no terminal, ele desliga a barra de progresso para que não haja confusão nos dados impressos. Podemos usar as opções ‘>’|’-o’|’-O’ para passar os resultados para um arquivo.

Selecionando vários arquivos ao mesmo tempo
Podemos baixar vários arquivos de uma vez, fornecendo todas as URLs na linha de comando.

Curl -O URL1 -O URL2

O comando abaixo fará o download de index.html e gettext.html e os salvará com os mesmos nomes no diretório atual.

Curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html

Observe que, quando baixamos vários arquivos do mesmo servidor, conforme mostrado acima, o curl tentará reutilizar a conexão.

Siga a localização HTTP nos cabeçalhos com a opção -L
Por padrão, o CURL não segue a localização HTTP nos cabeçalhos (redirecionamentos). Quando a página da Web solicitada for movida para outro local, a resposta apropriada será enviada nos cabeçalhos HTTP Location.
Por exemplo, quando alguém digita google.com na barra do navegador de seu país, ele será redirecionado automaticamente para 'google.co.xx'. Isso é feito com base no cabeçalho HTTP Location, conforme mostrado abaixo.

Curl https://www.google.com/?gws_rd=ssl

302 Movido

302 Movido

O documento foi movido para cá.

A saída acima diz que o documento solicitado foi movido para '

Escondido dos convidados

.
Você pode dizer ao curl para seguir os redirecionamentos, isso é feito usando a opção -L, conforme mostrado abaixo. Agora o código-fonte html será carregado de

Escondido dos convidados

.

Curl -L https://www.google.com/?gws_rd=ssl

Retomar um download anterior

Usando a opção -C, você pode continuar um download que foi interrompido por algum motivo. Isso será útil quando o download de arquivos grandes falhar.
Se dissermos '-C -', o curl procurará onde retomar o download. Também podemos especificar '-C<смещение>'. O deslocamento de byte especificado será ignorado desde o início do arquivo de origem.
Inicie um grande download com curl e pressione Ctrl-C para parar no meio do download.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html ############## 20,1%

O download foi interrompido em 20,1%. Usando “curl -C -” podemos continuar o download de onde paramos. Agora o download continuará em 20,1%.

Curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html ############### 21,1%

Limitação da taxa de dados
Você pode limitar a quantidade de taxa de transferência de dados com a opção --limit-rate. Você pode passar a velocidade máxima como um argumento.

$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

O comando acima limitará a taxa de transferência a 1000 bytes/segundo. curl pode usar velocidades mais altas nos picos. Mas a velocidade média será de cerca de 1000 bytes/segundo.
A barra de progresso para o comando acima é mostrada abaixo. Você pode ver que a velocidade atual é de cerca de 1000 bytes.

% Total % Recebido % Xferd Velocidade Média Tempo Tempo Tempo Dload Atual Upload Total Gasto Esquerdo Velocidade 1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999 1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999 1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999

Carregue um arquivo somente se ele foi modificado antes/depois do horário especificado
Você pode obter arquivos que foram modificados após um certo tempo usando a opção -z no curl. Isso funcionará para FTP e HTTP.

O comando acima só carregará yy.html se tiver sido modificado depois da data e hora especificadas.

O comando acima fará o download do arquivo file.html se ele tiver sido modificado antes da data e hora especificadas. Digite 'man curl_getdate' para saber mais sobre as várias sintaxes suportadas para expressões de data.

Passando a autenticação HTTP no cURL
Às vezes, os sites exigem um nome de usuário e uma senha para visualizar seu conteúdo. Com a opção -u, você pode passar essas credenciais do cURL para o servidor web, conforme mostrado abaixo.

$ curl -u nome de usuário:URL da senha

Nota: Por padrão, o curl usa autenticação básica HTTP. Podemos definir outros métodos de autenticação usando –ntlm | -digerir.


cURL também pode ser usado para baixar arquivos de servidores FTP. Se o caminho de FTP especificado for um diretório, a lista de arquivos nele será exibida por padrão.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php

O comando acima fará o download do arquivo xss.php do servidor ftp e o armazenará em um diretório local.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/

Aqui a URL se refere a um diretório. Portanto, o cURL fará uma lista de arquivos e diretórios no URL fornecido.


CURL suporta intervalos de URL. Quando um intervalo é fornecido, os arquivos correspondentes dentro desse intervalo serão carregados. Isso será útil ao baixar pacotes de sites espelho de FTP.

$ curl ftp://ftp.uk.debian.org/debian/pool/main//

O comando acima listará todos os pacotes no intervalo a-z no terminal.

Carregar arquivos para um servidor FTP
Curl também pode ser usado para fazer upload para um servidor FTP com a opção -T.

$ curl -u ftpuser:ftppass -T meuarquivo.txt ftp://ftp.testserver.com

O comando acima fará upload de um arquivo chamado myfile.txt para um servidor FTP. Você também pode fazer upload de vários arquivos de uma vez usando intervalos.

$ curl -u ftpuser:ftppass -T "(arquivo1,arquivo2)" ftp://ftp.testserver.com

Opcionalmente, podemos usar “.” para obter da entrada padrão e passá-la para a máquina remota.

$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

O comando acima pegará a saída do usuário da entrada padrão e armazenará o conteúdo no servidor ftp sob o nome 'myfile_1.txt'.
Você pode especificar '-T' para cada URL, e cada par de arquivo de URL determinará o que fazer upload e onde

Mais informações com maior detalhamento e opção de rastreamento
Você pode descobrir o que está acontecendo usando a opção -v. A opção -v ativa o modo detalhado e imprimirá os detalhes.

Curl -v https://www.google.co.th/?gws_rd=ssl

O comando acima produzirá o seguinte

* URL reconstruída para: https://www.google.co.th/?gws_rd=ssl * O nome do host NÃO foi encontrado no cache DNS * Tentando 27.123.17.49... * Conectado a www.google.co.th (27.123. 17.49) porta 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: www.google.co.th > Accept: */* >< HTTP/1.1 200 OK < Date: Fri, 14 Aug 2015 23:07:20 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=windows-874 < P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info." * Server gws is not blacklisted < Server: gws < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th ... ... ...

Se você precisar de informações mais detalhadas, poderá usar a opção --trace. A opção --trace habilitará um dump de rastreamento completo de todos os dados de entrada/saída para o arquivo fornecido
curl dict://dict.org/d:girl:fd-eng-rus 220 pan.alephnull.com dictd 1.12.1/rf no Linux 3.14-1-amd64 <[e-mail protegido]> 250 ok 150 1 definições recuperadas 151 "girl" fd-eng-rus "Inglês-Russo FreeDict Dictionary ver. 0.3" girl /gəːl/ girl. 250 ok 221 tchau

Mais informações sobre o DICT podem ser encontradas lendo

Escondido dos convidados

.

Usando um proxy para baixar um arquivo
Podemos dizer ao cURL para usar um proxy para certas operações, isso é feito com a opção -x. Precisamos definir o host e a porta do proxy.

$ curl -x proxysever.test.com:3128 https://www.google.co.in/?gws_rd=ssl

Enviando e-mail usando o protocolo SMTP em curl
cURL também pode ser usado para enviar e-mail via SMTP. Você precisa especificar o endereço de quem, o endereço de quem e o endereço IP do servidor de e-mail, conforme mostrado abaixo.

$ curl --mail-from [e-mail protegido]--mail-rcpt [e-mail protegido] smtp://mailserver.com

Quando o comando for digitado, começará a aguardar que o usuário insira os dados para a letra. Quando terminar de digitar sua mensagem, digite. (ponto) como última linha e o e-mail será enviado imediatamente.

Assunto: Testing Este é um email de teste.



Usando libcurl com C e Python

Desenvolver aplicativos que dependem de protocolos da camada de aplicativos, como HTTP e FTP, não é muito difícil, mas também não é trivial. Além disso, tal desenvolvimento não está no centro das atenções, pois na maioria dos casos o que está acima desses protocolos é muito mais importante. A Libcurl é interessante porque foca na aplicação, e não no aspecto transitório do desenvolvimento. Observe que poucos aplicativos têm sua própria pilha TCP/IP, porque reutilizar tudo o que é possível minimiza a carga do programador e aumenta a confiabilidade do aplicativo.

Este artigo começa com uma breve introdução aos protocolos da camada de aplicação e, em seguida, avança para aprender sobre cURL, libcurl e como usá-los.

Protocolos da web

O desenvolvimento de aplicativos modernos é significativamente diferente do que era no passado recente. Os aplicativos de hoje devem se comunicar em uma rede ou na Internet, expondo os usuários a uma API ou interface de rede, e fornecer flexibilidade por meio de scripts personalizados. Normalmente, os aplicativos modernos exportam a interface da Web usando HTTP e enviam notificações de exceção usando o Simple Mail Transport Protocol (SMTP). Esses protocolos permitem que um navegador da Web executado em um dispositivo envie configuração ou status e receba mensagens padrão de dispositivos para um cliente de e-mail padrão (via HTTP e SMTP, respectivamente).

Esses serviços da Web geralmente são construídos no topo da camada de soquete da pilha de protocolos de rede (Figura 1). A camada de soquete implementa uma API que retorna ao sistema operacional Berkeley Software Distribution (BSD) e isola os detalhes dos protocolos de camada de rede e transporte subjacentes.

Figura 1. Pilha de protocolo de rede e libcurl

Os serviços da Web fornecem comunicação entre os protocolos do cliente e do servidor. No contexto do HTTP, o servidor é o dispositivo final e o cliente é o navegador no local remoto. Para SMTP, o servidor é o gateway de correio ou usuário remoto e o cliente é o dispositivo final. Em alguns casos, a interação do protocolo ocorre em duas etapas (solicitação e resposta), enquanto em outros, é necessário muito mais tráfego para manter a comunicação. Essa interação pode criar dificuldades significativas que são superadas com APIs como libcurl.

Introdução ao cURL

Origem e conteúdo do cURL

O cURL foi proposto por Daniel Stenberg, mas mais de 600 programadores contribuíram para o desenvolvimento. Sem dúvida, esta é uma tecnologia útil com uma ampla gama de aplicações.

O cURL foi originalmente desenvolvido como um meio de mover arquivos entre terminais usando vários protocolos, como FTP, HTTP, SCP e outros. No início era um utilitário de linha de comando, mas agora também é uma biblioteca com ligações para mais de 30 idiomas. Portanto, agora, em vez de usar cURL na linha de comando, você pode criar aplicativos que incluem esses recursos importantes. A biblioteca libcurl também é portátil e suporta Linux®, IBM® AIX®, BSD, Solaris e muitas outras variantes do UNIX®.

Obtendo e instalando cURL/libcurl

Obter e instalar o libcurl é fácil, mas o processo depende da distribuição Linux. No Ubuntu, esses pacotes podem ser instalados usando o utilitário apt-get. As próximas duas linhas mostram como instalar o libcurl e as ligações do Python para libcurl:

$ sudo apt-get install libcurl3 $ sudo apt-get install python-pycurl

O utilitário apt-get garante que todas as dependências sejam respeitadas durante o processo de instalação.

cURL na linha de comando

O cURL começou como uma ferramenta de linha de comando para transferir dados usando a sintaxe Uniform Resource Locator (URL). Devido à popularidade desse recurso em forma de linha de comando, foi criada uma biblioteca para integrá-lo em aplicativos. Hoje o cURL para a linha de comando serve como um wrapper em torno da biblioteca cURL. Este artigo começa aprendendo sobre o cURL na linha de comando e, em seguida, mergulha no uso dele como uma biblioteca.

Dois usos típicos para cURL são transferências de arquivos usando os protocolos HTTP e FTP. O cURL fornece uma interface simples para esses e outros protocolos. Para recuperar um arquivo de um site usando HTTP, tudo o que você precisa fazer é especificar cURL o nome do arquivo local no qual deseja gravar a página da Web, bem como a URL do site e o arquivo a ser carregado. Muitas palavras para a linha de comando simples mostrada na Listagem 1.

Listagem 1. Um exemplo de uso de cURL para recuperar um arquivo de um site
$ curl -o test html www.exampledomain.com % Total % Recebido % Xferd Velocidade Média Tempo Tempo Tempo Dload Atual Upload Total Gasto Esquerdo Velocidade 100 43320 100 43320 0 0 55831 0 --:--:-- - -:-- :-- --:--:-- $89299

Observe que especifiquei um domínio, não um arquivo, então obterei o arquivo raiz (index.html). Para carregar esse arquivo em um site FTP usando cURL, especifique o arquivo a ser carregado com a opção -T e insira a URL do site FTP e o caminho do arquivo (Lista 2).

Listagem 2. Um exemplo de uso do cURL para fazer upload de um arquivo para um site FTP
$ curl -T test.html ftp://usuário: [e-mail protegido]/ftpdir/ % Total % Recebido % Xferd Velocidade Média Tempo Tempo Tempo Dload Atual Upload Total Gasto Esquerdo Velocidade 100 43320 0 0 100 43320 0 38946 0:00:01 0:00:01 --:--:- - 124 mil dólares

É mais fácil? Basta dominar alguns modelos simples e o cURL será extremamente fácil de usar. Mas a variedade de opções disponíveis é muito grande - solicitar ajuda da linha de comando cURL (--help) imprime 129 linhas. Um grande número de opções permite que você controle tudo, desde verbosidade até segurança e vários elementos personalizáveis ​​específicos de protocolo.

Do ponto de vista de um desenvolvedor, esse não é o aspecto mais agradável do cURL. Vamos mergulhar na biblioteca cURL e ver como adicionar esses protocolos de transferência de arquivos ao seu aplicativo.

cURL como uma biblioteca

Se você tem observado linguagens de script nos últimos 10 anos, notou uma clara mudança em sua composição. Linguagens de script como Python, Ruby, Perl e muitas outras incluem não apenas uma camada de soquete, como C ou C++, mas também interfaces de protocolo de camada de aplicação. Essas linguagens de script contêm recursos de alto nível que tornam trivial a criação de um servidor ou cliente HTTP, por exemplo. A biblioteca libcurl adiciona funcionalidades semelhantes a linguagens como C e C++, mas de uma forma que pode funcionar com muitas linguagens. O Libcurl se comporta aproximadamente da mesma forma em todas as linguagens que suporta, embora, como essas linguagens podem variar muito (C e Scheme), a maneira como esse comportamento é aplicado também pode ser diferente.

A biblioteca libcurl inclui funções que são ilustradas nas listagens e , na forma de uma API, para que possa ser utilizada em linguagens de alto nível (mais de 30 hoje). Este artigo fornece dois exemplos de uso de libcurl. O primeiro explora um cliente HTTP simples em C (adequado para construir web spiders), e o segundo é um cliente HTTP simples em Python.

Cliente HTTP em linguagem C

A API C fornece duas APIs além da funcionalidade libcurl. Uma interface simples é uma API síncrona simples (ou seja, quando libcurl faz uma solicitação, ela a executa até o final ou para uma mensagem de erro). A multiinterface fornece controle sobre libcurl, permitindo que um aplicativo execute várias transferências simultâneas e controle onde e quando libcurl transfere dados.

Este exemplo usa uma interface simples. Essa API fornece algum controle sobre o processo de movimentação de dados (usando retornos de chamada), mas faz jus ao seu nome. A Listagem 3 mostra um exemplo C para HTTP.

Listagem 3. Cliente HTTP em C usando a interface libcurl simples
#incluir #incluir #incluir #define MAX_BUF 65536 char wr_buf; int wr_index; /* * Write data callback function (chamado dentro do contexto de * curl_easy_perform. */ size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) ( int segsize = size * nmemb; /* Verifique se isso data excede o tamanho do nosso buffer. Se sim, * defina o valor de contexto definido pelo usuário e retorne 0 para indicar um * problema para curl.*/ if (wr_index + segsize > MAX_BUF) ( *(int *)userp = 1; return 0; ) /* Copia os dados do buffer curl para nosso buffer */ memcpy((void *)&wr_buf, buffer, (size_t)segsize); /* Atualiza o índice de gravação */ wr_index += segsize; /* Null encerrar o buffer */ wr_buf = 0; /* Retorna o número de bytes recebidos, indicando ao curl que está tudo bem */ return segsize; ) /* * Aplicativo curl simples para ler o arquivo index.html de um site.* / int main(void) ( CURL *curl; CURLcode ret; int wr_error; wr_error = 0; wr_index = 0; /* Primeiro passo, init curl */ curl = curl_easy_init(); if (!curl) ( printf("couldn "t init curl\n"); retornar 0; ) /* Diz ao curl a URL do arquivo que vamos recuperar */ curl_easy_setopt(curl, CURLOPT_URL, "www.exampledomain.com"); /* Diz ao curl que vamos receber dados para a função write_data, e * também fornece um ponteiro de contexto para nosso retorno de erro. */ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&wr_error); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); /* Permitir que o curl execute a ação */ ret = curl_easy_perform(curl); printf("ret = %d (write_error = %d)\n", ret, wr_error); /* Emitir a página se curl indicar que nenhum erro ocorreu */ if (ret == 0) printf("%s\n", wr_buf); curl_easy_cleanup(curl); retornar 0; )

No topo estão os arquivos de inclusão necessários, incluindo o arquivo cURL raiz. Em seguida, defini algumas variáveis ​​para passar. O primeiro, wr_buf , é o buffer no qual a entrada será gravada. wr_index reflete o índice da entrada de buffer atual.

Vamos descer para a função main, que faz a instalação usando uma API simples. Todas as chamadas cURL passam por um ponteiro que armazena o estado de uma determinada solicitação. Ele é definido como uma referência de ponteiro CURL. Este exemplo também cria um código de retorno especial chamado CURLcode . Antes de usar qualquer função libcurl, curl_easy_init deve ser chamado para obter o ponteiro CURL. Em seguida, observe várias chamadas para a função curl_easy_setopt. Estas são configurações de ponteiro para uma operação específica. Para essas chamadas, um ponteiro, comando e opção são inseridos. Este exemplo usa primeiro a instrução CURLOPT_URL para especificar a URL dos dados a serem recuperados. Isso é seguido por CURL_WRITEDATA para criar uma variável de contexto (no nosso caso, a variável de gravação de erro interno). Finalmente, CURLOPT_WRITEFUNCTION define a função a ser chamada quando houver dados. A API chamará essa função uma ou mais vezes com os dados lidos desde o sinal de início.

Para iniciar a transferência, chame a função curl_easy_perform. Sua tarefa é realizar a transmissão de acordo com uma configuração predefinida. Quando esta função é chamada, ela retorna o resultado somente após uma transferência bem-sucedida ou um erro. Os últimos elementos de main são para passar os status retornados, iniciar a leitura da página e, finalmente, limpar com a função curl_easy_cleanup (na conclusão da operação).

Agora considere a função write_data. Esta é uma função de retorno de chamada que é chamada quando os dados de uma operação específica são recebidos. Observe que quando os dados são lidos do site, eles são gravados em você (write_data). O retorno de chamada contém um buffer (com dados prontos), o número de elementos e seu tamanho (seu produto fornece a quantidade total de dados no buffer) e um ponteiro de contexto. A primeira tarefa é fornecer capacidade de buffer suficiente (wr_buf) para gravar dados. Caso contrário, ele define o ponteiro de contexto e retorna zero, indicando que há um problema. Caso contrário, ele copia os dados do buffer cURL em seu buffer e incrementa o índice para apontar para o próximo local de gravação. Neste exemplo, a string é terminada para que printf possa ser aplicado a ela posteriormente. Por fim, retorna para libcurl o número de bytes processados. Isso informa à libcurl que os dados foram aceitos e podem ser removidos. É isso - não é uma maneira simples de ler um arquivo de um site na memória?

Cliente HTTP em Python

Esta seção fornece um exemplo semelhante ao cliente HTTP C, mas desta vez escrito em Python. Python é uma linguagem de script orientada a objetos útil que é ótima para prototipagem e software comercial. O exemplo pressupõe que você tenha algum conhecimento de Python, mas é usado muito pouco, portanto, nenhum conhecimento avançado é necessário.

O código para um cliente HTTP simples, escrito em Python usando pycurl , é mostrado na Listagem 4.

Listagem 4. Cliente HTTP Python usando a interface pycurl da libcurl
import sys import pycurl wr_buf = "" def write_data(buf): global wr_buf wr_buf += buf def main(): c = pycurl.Curl() c.setopt(pycurl.URL, "http://www.exampledomain.com ") c.setopt(pycurl.WRITEFUNCTION, write_data) c.perform() c.close() main() sys.stdout.write(wr_buf)
Prototipagem em Python

Isso ilustra uma das vantagens da linguagem Python quando se trata de prototipagem. Funcionalidade bastante ampla é alcançada com uma pequena quantidade de código. Você pode obter melhor desempenho em C, mas se seu objetivo é gerar código rapidamente para testar uma ideia, é melhor usar linguagens de script de alto nível como Python.

Este código é muito mais simples que a versão C. Ele começa importando os módulos necessários (o módulo padrão do sistema sys e o módulo pycurl). Em seguida, o buffer de gravação (wr_buf) é definido. Como no programa C, declaro a função write_data. Observe que essa função recebe um argumento: um buffer de dados lidos do servidor HTTP. Eu apenas peguei esse buffer e o adicionei ao buffer de gravação global. A função principal começa criando um ponteiro Curl e, em seguida, usa os métodos setopt para definir a URL e WRITEFUNCTION para gravar. Ele chama o método perform para iniciar a transferência e fecha o ponteiro. Finalmente, ele chama a função main e passa o buffer de gravação para stdout . Observe que, neste caso, o ponteiro de erro de contexto não é necessário porque a concatenação de strings do Python é usada, o que significa que não há necessidade de usar uma string de tamanho estático.

Qual é o próximo

Este artigo está apenas arranhando a superfície do libcurl dado o grande número de protocolos e linguagens suportados pela biblioteca. Mas esperamos que demonstre como é fácil construir aplicativos que usam protocolos da camada de aplicativos, como HTTP. O site libcurl (consulte a seção ) contém um grande número de exemplos e uma quantidade significativa de documentação útil. Portanto, da próxima vez que você estiver desenvolvendo um navegador da Web, spider ou outro aplicativo que exija um protocolo de camada de aplicativo, tente libcurl. Isso certamente irá acelerar o processo de desenvolvimento e você vai se divertir.

Este artigo pressupõe que você esteja familiarizado com os conceitos básicos de rede e a linguagem HTML.

A capacidade de escrever scripts é essencial para construir um bom sistema de computador. A extensibilidade de sistemas Unix através de shell scripts e vários programas que executam comandos automatizados é uma das razões do seu sucesso.

O número crescente de aplicativos que estão migrando para a web levou ao fato de que o tópico de scripts HTTP está se tornando cada vez mais procurado. Tarefas importantes nesta área são a extração automática de informações da Internet, envio ou download de dados para servidores web, etc.

Curl é uma ferramenta de linha de comando que permite fazer manipulação de URL e passar vários tipos. Este artigo se concentra em fazer solicitações HTTP simples. Supõe-se que você já saiba para onde discar

# curl --ajuda

# curl --manual

para obter informações sobre ondulação.

O Curl não é uma ferramenta que fará tudo por você. Ele cria solicitações, recebe dados e envia dados. Você pode precisar de alguma "cola" para manter tudo junto, talvez alguma linguagem de script (como bash) ou algumas chamadas manuais.

1. Protocolo HTTP

HTTP é o protocolo usado ao receber dados de servidores web. É um protocolo muito simples que é construído em cima do TCP/IP. O protocolo também permite que informações do cliente sejam enviadas ao servidor por meio de diversos métodos, como será mostrado a seguir.

HTTP são strings de texto ASCII enviadas de um cliente para um servidor para solicitar alguma ação. Quando uma solicitação é recebida, o servidor responde ao cliente com várias linhas de texto de serviço e, em seguida, com o conteúdo real.

Usando a opção curl -v, você pode ver quais comandos o curl envia ao servidor, bem como outros textos informativos. A opção -v talvez seja a única maneira de depurar ou até mesmo entender a interação entre o curl e o servidor web.

2.URL

O formato URL (Uniform Resource Locator - endereço de recurso universal) especifica o endereço de um recurso específico na Internet. Você provavelmente sabe disso, exemplos de URLs são http://curl.haxx.se ou https://yourbank.com.

3. Obter (GET) página

A solicitação HTTP mais simples e comum é obter o conteúdo de uma URL. A URL pode se referir a uma página da Web, uma imagem ou um arquivo. O cliente envia uma solicitação GET ao servidor e recebe o documento solicitado. Se você executar o comando

# curl http://curl.haxx.se

você receberá uma página da Web exibida na janela do seu terminal. O documento HTML completo contido neste URL.

Todas as respostas HTTP contêm um conjunto de cabeçalhos que geralmente estão ocultos. Para vê-los junto com o próprio documento, use a opção curl -i. Você também pode solicitar apenas cabeçalhos com a opção -I (que forçará o curl a fazer uma solicitação HEAD).

4. Formas

Os formulários são a principal maneira de apresentar um site como uma página HTML com campos nos quais o usuário insere dados e clica em um botão OK ou Enviar, após o qual os dados são enviados ao servidor. O servidor então usa os dados recebidos e decide como proceder: procurar as informações no banco de dados, mostrar o endereço inserido no mapa, adicionar uma mensagem de erro ou usar as informações para autenticar o usuário. Claro, existe algum programa no lado do servidor que aceita seus dados.

4.1 OBTER

O formulário GET usa o método GET, assim:

Se você abrir este código em seu navegador, verá um formulário com uma caixa de texto e um botão que diz "OK". Se você digitar "1905" e clicar em OK, o navegador gerará uma nova URL a ser seguida. A URL será uma string que consiste no caminho da URL anterior e uma string como "junk.cgi?birthyear=1905&press=OK".

Por exemplo, se o formulário estiver localizado em "www.hotmail.com/when/birth.html", clicar no botão OK levará você à URL "www.hotmail.com/when/junk.cgi?birthyear= 1905&press=OK" .

A maioria dos motores de busca funciona desta forma.

Para que o curl gere uma solicitação GET, basta digitar o que você esperaria do formulário:

# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

O método GET faz com que todas as informações inseridas sejam exibidas na barra de endereços do seu navegador. Isso pode ser bom quando você precisa marcar uma página, mas é uma desvantagem óbvia quando você insere informações secretas em campos de formulário ou quando a quantidade de informações inseridas nos campos é muito grande (resultando em uma URL ilegível).

O protocolo HTTP fornece o método POST. Com ele, o cliente envia os dados separadamente da URL e, portanto, você não os verá na barra de endereços.

O formulário que gera a solicitação POST é semelhante ao anterior:

Curl pode formar uma solicitação POST com os mesmos dados da seguinte forma:

# curl -d "ano de nascimento=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Esta solicitação POST usa "Content-Type application/x-www-form-urlencoded", que é a maneira mais usada.

Os dados que você envia para o servidor devem ser codificados corretamente, o curl não fará isso por você. Por exemplo, se você quiser que os dados contenham um espaço, será necessário substituir esse espaço por %20 e assim por diante. A falta de atenção a essa questão é um erro comum, pelo qual os dados não são transmitidos como deveriam.

Em 1995, uma maneira adicional de transferir dados por HTTP foi definida. Está documentado na RFC 1867, razão pela qual às vezes é chamado de postagem RFC1867.

Esse método foi projetado principalmente para oferecer melhor suporte a uploads de arquivos. O formulário que permite ao usuário fazer upload de um arquivo se parece com isso em HTML:

Observe que o Content-Type está definido como multipart/form-data.

Para enviar dados para esse formulário usando curl, digite o comando:

# curl -F [e-mail protegido]-Fpress=OK

4.4 Campos ocultos

Uma maneira comum de comunicar informações de estado em aplicativos HTML é usando campos ocultos em formulários. Os campos ocultos não são preenchidos, são invisíveis ao usuário e são passados ​​da mesma forma que os campos regulares.

Um exemplo simples de um formulário com um campo visível, um campo oculto e um botão OK:

Para enviar uma solicitação POST com curl, você não precisa pensar se o campo está oculto ou não. Para curl são todos iguais:

# curl -d "ano de nascimento=1905&press=OK&pessoa=daniel"

4.5 Descubra como é uma solicitação POST

Quando você deseja preencher um formulário e enviar dados para o servidor usando curl, provavelmente deseja que a solicitação POST seja exatamente igual à feita usando o navegador.

Uma maneira fácil de ver sua solicitação POST é salvar a página HTML do formulário em disco, alterar o método para GET e clicar no botão "Enviar" (você também pode alterar a URL para a qual os dados serão enviados).

Você verá que os dados foram anexados à URL, separados por caracteres "?", conforme esperado ao usar formulários GET.

5. COLOCAR

Talvez a melhor maneira de fazer upload de dados para um servidor HTTP seja usar PUT. Novamente, isso requer um programa (script) no back-end que saiba o que fazer e como aceitar um fluxo HTTP PUT.

Envie um arquivo para o servidor usando curl:

# curl -T uploadfile www.uploadhttp.com/receive.cgi

6. Autenticação

Autenticação - passando um nome de usuário e senha para o servidor, após o que verifica se você tem o direito de realizar a solicitação solicitada. A autenticação básica (que o curl usa por padrão) é baseada em texto simples, o que significa que o nome de usuário e a senha não serão criptografados, mas apenas ligeiramente "ofuscados" com o algoritmo Base64, permitindo que os invasores descubram essas informações no caminho entre você e o servidor HTTP.

Diga ao curl para usar nome de usuário e senha:

# curl -u nome:senha www.secrets.com

O site pode exigir o uso de um método de autenticação diferente (veja o que o servidor escreve nos cabeçalhos), nestes casos, você pode usar as chaves --ntlm, --digest, --negotiate ou mesmo --anyauth. Às vezes, o acesso a servidores HTTP externos ocorre por meio de um proxy, como costuma ser feito em empresas e firmas. Um proxy HTTP pode exigir seu próprio nome de usuário e senha para acessar a Internet. Chave de curl relevante:

# curl -U proxyuser:proxypassword curl.haxx.se

Se o proxy exigir autenticação NTLM, especifique --proxy-ntlm, se o método Digest, então --proxy-digest.

Se você não especificar uma senha nas opções -u e -U, o curl solicitará a você interativamente.

Observe que quando o curl está em execução, a string de execução (e com ela as chaves e senhas) pode ficar visível para outros usuários em seu sistema na lista de tarefas. Existem maneiras de evitar isso. Mais sobre isso abaixo.

7. Referenciador

Uma solicitação HTTP pode incluir um campo "referenciador" que indica a URL de onde o usuário chegou a esse recurso. Alguns programas/scripts verificam o campo "referer" e não executam a requisição se o usuário vier de uma página desconhecida. Embora essa seja uma maneira boba de verificar, muitos scripts a usam mesmo assim. Com o curl, você pode colocar qualquer coisa no campo "referer" e assim forçá-lo a fazer o que quiser.

Isso é feito da seguinte maneira:

# curl -e http://curl.haxx.se daniel.haxx.se

8. Agente do usuário

Todas as solicitações HTTP suportam um campo "User-Agent" que especifica o aplicativo cliente do usuário. Muitos aplicativos da Web usam essas informações para exibir a página de uma forma ou de outra. Os programadores da Web criam várias versões de uma página para usuários de diferentes navegadores a fim de melhorar a aparência, usam diferentes scripts javascript, vbscript, etc.

Às vezes, você pode descobrir que o curl retorna uma página que não é a que você viu em seu navegador. Neste caso, é apropriado utilizar o campo "User Agent" para enganar novamente o servidor.

Disfarce curl como Internet Explorer em uma máquina Windows 2000:

# curl -A "Mozilla/4.0 (compatível; MSIE 5.01; Windows NT 5.0)"

Por que não se tornar Netscape 4.73 em uma máquina Linux (PIII):

# curl -A "Mozilla/4.73 (X11; U; Linux 2.2.15 i686)"

9. Redirecionamentos

Em resposta à sua solicitação, o servidor, em vez da própria página, pode retornar uma indicação de onde o navegador deve ir em seguida para chegar à página desejada. O cabeçalho que informa ao navegador que esse redirecionamento é "Location:".

Por padrão, o curl não vai para o endereço especificado em "Location:", mas simplesmente exibe a página como de costume. Mas você pode enviar assim:

# curl -L www.sitethatredirects.com

Se estiver usando curl para solicitações POST para um site que redireciona imediatamente para outra página, você pode usar com segurança -L e -d/-F. O Curl fará uma solicitação POST para a primeira página e, em seguida, uma solicitação GET para a próxima.

10. Biscoitos

Os cookies permitem que os navegadores da Web controlem o estado no lado do cliente. Cookie é um nome com conteúdo anexado. O servidor, enviando cookies, informa ao cliente o caminho e o nome do host para onde os cookies devem ser enviados da próxima vez, informa o tempo de vida do cookie e alguns outros parâmetros.

Quando um cliente se conecta ao servidor no endereço especificado no cookie recebido, o cliente envia esse cookie ao servidor (se o tempo de vida não tiver expirado).

Muitos aplicativos e servidores usam esse método para combinar várias solicitações em uma sessão lógica. Para que o curl também execute essa função, devemos ser capazes de salvar e enviar cookies, assim como os navegadores.

A maneira mais fácil de enviar um cookie ao servidor ao buscar uma página com curl é adicionar a opção apropriada na linha de comando:

# curl -b "name=Daniel" www.cookiesite.com

Os cookies são enviados como cabeçalhos HTTP normais. Isso permite que o curl armazene cookies armazenando cabeçalhos. Salvar cookies com curl é feito com o comando:

# curl -D headers_and_cookies www.cookiesite.com

(a propósito, é melhor usar a opção -c para salvar cookies, mais sobre isso abaixo).

curl tem um manipulador de cookies completo que é útil quando você deseja se conectar ao servidor novamente e usar os cookies que você salvou da última vez (ou criados à mão). Para usar cookies armazenados em um arquivo, chame curl assim:

# curl -b stored_cookies_in_file www.cookiesite.com

O mecanismo de cookie curl é ativado quando você especifica a opção -b. Se você quiser que o curl aceite apenas cookies, use -b com um arquivo que não existe. Por exemplo, se você quiser que o curl aceite cookies de uma página e siga um redirecionamento (talvez dando o cookie que acabou de ser aceito), você pode chamar o curl assim:

# curl -b nada -L www.cookiesite.com

Curl pode ler e escrever cookies no formato Netscape e Mozilla. Esta é uma maneira conveniente de trocar cookies entre navegadores e scripts automatizados. A opção -b detecta automaticamente se um determinado cookie é um cookie dos navegadores especificados e o trata de acordo, e usando a opção -c/--cookie-jar você pode forçar o curl a gravar um novo cookie quando a operação for concluída:

# curl -b cookies.txt -c newcookies.txt www.cookiesite.com

11. HTTPS

Existem várias maneiras de proteger suas transmissões HTTP. O protocolo mais conhecido que resolve esse problema é o HTTPS, ou HTTP sobre SSL. O SSL criptografa todos os dados enviados e recebidos pela rede, o que aumenta a probabilidade de suas informações permanecerem secretas.

O Curl suporta solicitações para servidores HTTPS graças à biblioteca OpenSSL gratuita. As solicitações são feitas da maneira usual:

# curl https://that.secure.server.com

11.1 Certificados

No mundo HTTPS, você usa certificados para autenticação além do nome de usuário e senha. O Curl suporta certificados no lado do cliente. Todos os certificados são bloqueados com uma senha que você precisa inserir antes que o curl possa começar a trabalhar com eles. A senha pode ser especificada na linha de comando ou inserida interativamente. Certificados em curl são usados ​​assim:

# curl -E mycert.pem https://that.secure.server.com

O Curl também autentica o servidor verificando o certificado do servidor em relação a um armazenado localmente. Uma incompatibilidade resultará na recusa de conexão do curl. Para ignorar a autenticação, use a opção -k.

Mais informações sobre certificados podem ser encontradas em http://curl.haxx.se/docs/sslcerts.html.

12. Cabeçalhos de solicitação arbitrária

Pode ser necessário modificar ou adicionar elementos de solicitações de curl individuais.

Por exemplo, você pode alterar a solicitação POST para PROPFIND e enviar os dados como "Content-Type: text/xml" (em vez do Content-Type usual):

# curl -d " " -H "Tipo de conteúdo: texto/xml" -X PROPFIND url.com

Você pode remover qualquer cabeçalho especificando-o sem conteúdo. Por exemplo, você pode remover o cabeçalho "Host:", tornando a solicitação "vazia":

# curl -H "Host:" http://mysite.com

Você também pode adicionar cabeçalhos. Seu servidor pode precisar de um cabeçalho "Destination:":

# curl -H "Destino: http://moo.com/nowhere" http://url.com

13. Depuração

Muitas vezes acontece que um site responde a solicitações de curl de maneira diferente das solicitações do navegador. Nesse caso, você precisa assimilar o curl ao navegador o máximo possível:

  • Use a opção --trace-ascii para salvar um relatório detalhado de solicitações para que você possa examiná-las em detalhes e entender o problema.
  • Certifique-se de verificar os cookies e usá-los quando necessário (leia -b switch e salve -c switch)
  • Especifique um dos navegadores populares mais recentes no campo "user-agent"
  • Preencha o campo "referenciador" como o navegador faz
  • Se você estiver usando solicitações POST, certifique-se de que todos os campos sejam passados ​​na mesma ordem do navegador (veja acima, ponto 4.5)

Um bom auxiliar nesta difícil tarefa é o plugin Mozilla/Firefox LiveHTTPHeader, que permite visualizar todos os cabeçalhos que este navegador envia e recebe (mesmo quando usando HTTPS).

Uma abordagem de nível mais baixo é capturar o tráfego HTTP na rede usando programas como ethereal ou tcpdump e, em seguida, analisar quais cabeçalhos foram recebidos e enviados pelo navegador (HTTPS torna essa abordagem ineficiente).

RFC 2616 é leitura obrigatória para quem quer entender o protocolo HTTP.

RFC 2396 explica a sintaxe do URL.

A RFC 2109 define como os cookies funcionam.

A RFC 1867 define o formato de postagem de upload de arquivo.

http://openssl.planetmirror.com - página inicial do projeto OpenSSL

http://curl.haxx.se - página inicial do projeto cURL

Para que serve o cURL?

  • cURL é ótimo para simular ações do usuário em um navegador.

Um exemplo prático real: você precisa reiniciar o roteador (modem) para alterar o endereço IP. Para fazer isso, você precisa: fazer login no roteador, acessar a página de manutenção e clicar no botão "Reiniciar". Se esta ação precisar ser executada várias vezes, o procedimento deverá ser repetido. Concordo, você não quer fazer essa rotina manualmente todas as vezes. cURL permite automatizar tudo isso. Com apenas alguns comandos cURL, você pode obter autorização e concluir a tarefa no roteador.

  • cURL é útil para obter dados de sites na linha de comando.

Outro exemplo prático: queremos implementar a exibição de estatísticas gerais para vários sites. Se você usa cURL, isso se torna uma tarefa completamente trivial: usando cURL, nos autenticamos no serviço de coleta de estatísticas (se necessário), então (novamente, usando comandos cURL) obtemos as páginas necessárias, analisamos os dados necessários; o procedimento é repetido para todos os nossos sites, então somamos e exibimos o resultado final.

Aqueles. Os casos de uso do cURL são bastante reais, embora, na maioria dos casos, os programadores que o usam para seus programas precisem do cURL.

cURL suporta muitos protocolos e métodos de autorização, pode transferir arquivos, funciona corretamente com cookies, suporta certificados SSL, proxies e muito mais.

cURL em PHP e linha de comando

Podemos usar cURL de duas maneiras principais: em scripts PHP e na linha de comando.

Para habilitar cURL em PHP no servidor, você precisa descomentar a linha no arquivo php.ini

Extensão=php_curl.dll

E então reinicie o servidor.

No Linux, você precisa instalar o pacote curl.

No Debian, Ubuntu ou Linux Mint:

$ sudo apt-get install curl

No Fedora, CentOS ou RHEL:

$ sudo yum install curl

Para ver claramente a diferença de uso em PHP e na linha de comando, executaremos as mesmas tarefas duas vezes: primeiro em um script PHP e depois na linha de comando. Vamos tentar não nos confundir.

Obtendo dados com cURL

Obtendo dados com cURL em PHP

Exemplo de PHP:

Tudo é muito simples:

$target_url- o endereço do site em que estamos interessados. Após o endereço do site, você pode colocar dois pontos e adicionar o endereço da porta (se a porta for diferente da padrão).

curl_init- inicializa uma nova sessão e retorna um handle, que em nosso exemplo é atribuído a uma variável $ch.

Em seguida, executamos a solicitação cURL com a função curl_exec, que recebe um descritor como parâmetro.

Tudo é muito lógico, mas quando esse script for executado, o conteúdo do site será exibido em nossa página. Mas e se não quisermos exibir o conteúdo, mas escrevê-lo em uma variável (para processamento adicional ou análise).

Vamos adicionar um pouco ao nosso script:

0) ( echo "erro de ondulação: " . curl_error($ch); ) curl_close($ch); ?>

temos uma linha curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt- define opções. Uma lista completa de opções pode ser encontrada nesta página: http://php.net/manual/en/function.curl-setopt.php

$response_data = curl_exec($ch);

Agora o valor do script é atribuído à variável $response_data, que pode ser usada para outras operações. Por exemplo, você pode exibir seu conteúdo.

If (curl_errno($ch) > 0) ( echo "curl error: " . curl_error($ch); )

são usados ​​para depuração em caso de erros.

Obtendo dados com cURL na linha de comando

Na linha de comando, basta digitar

Curl mi-al.ru

onde em vez de mi-al.ru- o endereço do seu site.

Se você precisar copiar os dados para uma variável e não exibir o resultado na tela, faça o seguinte:

Temp=`curl mi-al.ru`

No entanto, alguns dados ainda são exibidos:

Para que não sejam exibidos, adicione a chave -s:

Temp=`curl -s mi-al.ru`

Você pode ver o que foi gravado:

eco $temp | menos

Autenticação básica e HTTP

Autenticação, simplesmente, é a introdução de um nome de usuário e senha.

A autenticação básica é a autenticação do servidor. Para isso, são criados dois arquivos: .htaccess e .htpasswd

O conteúdo do arquivo .htaccess é algo assim

AuthName "Somente para usuários registrados!" AuthType Basic requer AuthUserFile de usuário válido /home/freeforum.biz/htdocs/.htpassw

O conteúdo do arquivo .htpasswd é algo assim:

Mial:CRdiI.ZrZQRRc

Aqueles. hash de login e senha.

Quando você tenta acessar uma pasta protegida por senha, o navegador exibirá algo assim:

A autenticação HTTP é o caso quando digitamos um nome de usuário e senha em um formulário em um site. É essa autenticação que é usada ao entrar em e-mails, fóruns, etc.

Autenticação básica cURL (PHP)

Existe um site http://62.113.208.29/Update_FED_DAYS/ que exige que façamos login:

Vamos tentar nosso script inicial:

0) ( echo "curl error: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Embora o script considere que não há erro, não gostamos nada do resultado de saída:

Adicionamos duas linhas:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");

Na primeira linha, definimos o tipo de autenticação - básico. A segunda linha contém o nome e a senha separados por dois pontos (no nosso caso, o nome e a senha são os mesmos - ru-board). Ficou assim:

0) ( echo "curl error: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Autenticação cURL básica (na linha de comando)

O mesmo pode ser alcançado na linha de comando com uma linha:

Curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Não esqueci de especificar o tipo de autenticação, só que no cURL o tipo de autenticação básico é o padrão.

Na linha de comando, tudo aconteceu tão rápido que, por frustração, escrevi este programa. Ela se conecta ao site e baixa a atualização mais recente:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Atualizar_FED_201(1).(2).(2).7z" | único | cauda -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Apenas mais alguns comandos podem ser adicionados:

  • descompactar o arquivo para o diretório especificado;
  • lançamento de atualizações do ConsultantPlus (essas são atualizações para ele);
  • você pode implementar uma verificação - se a última atualização disponível já foi baixada ou se apareceu uma nova;
  • adicione tudo ao Cron para atualizações diárias.

Autenticação HTTP cURL

Autenticação HTTP cURL em PHP

Nós precisamos saber:

  • endereço para onde enviar dados para autenticação
  • enviar método GET ou POST
  • Conecte-se
  • senha

Às vezes, esses dados não são suficientes. Vamos descobrir.

O endereço para onde você deseja enviar os dados pode ser obtido no formulário de autenticação. Por exemplo:

Nós olhamos para a propriedade ação. Aqueles. página final é login.php. Precisamos do endereço completo, como este http://188.35.8.64:8080/login.php

Aqui também encontramos o método de envio: método="postar"

Também sei o login e a senha: admin e qwerasdfzxcv

Apenas no caso, este não é o meu roteador (e eu não sei de quem), então se você quer me irritar, então você não precisa mexer com este roteador.

Aqueles. uma string é passada para o servidor a partir do formulário usando o método POST. Teoricamente, nosso script anterior, no qual adicionamos uma nova linha, deve funcionar. Aqueles. autenticação deve ocorrer.

0) ( echo "erro de ondulação: " . curl_error($ch); ) else ( ) curl_close($ch); ?>

Nova linha no script

curl_setopt($ch, CURLOPT_POSTFIEELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");

Aqui curl_setopt- uma função já familiar para nós para definir opções para cURL, CURLOPT_POSTFIELDSé o nome da opção que estamos configurando. CURLOPT_POSTFIELDS contém todos os dados enviados pelo método POST. Bem, a própria linha LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- estes são os dados que transmitimos.

Se você examinar cuidadosamente o formulário, poderá ver que ele também contém campos ocultos. E os dados podem ser processados ​​ou complementados com JavaScript "s. Você pode estudar tudo isso, mas eu prefiro a forma mais simples.

Estou usando o Wireshark. Este programa é projetado para sniffing (interceptação) de tráfego. E é nele que é muito conveniente ver o que exatamente é transmitido para o site.

Assista a este pequeno vídeo:

Aqueles. com o endereço para onde os dados são transferidos, imaginei. Mas a string transmitida acabou sendo muito mais complicada.

Digitei o parâmetro correto e também modifiquei um pouco o script para que ele não apenas efetuasse login, mas também recebesse algo do roteador:

0) ( echo "Erro de curvatura: " . curl_error($ch); ) else ( $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ ch2, CURLOPT_RETURNTRANSFER, 1); $response_data2 = curl_exec($ch2); preg_match("|f.ssid.value = "(.*)";|", $response_data2, $results2); $results2 = str_replace("f .ssid.value = "", "", $results2); $results2 = str_replace("";", "", $results2); echo "Nome da rede Wifi: $resultados2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $resultados3 = str_replace("f_wpa.wpapsk1.value", "", $resultados3); $resultados3 = str_replace("="", "", $resultados3); $resultados3 = str_replace("";", "", $resultados3); echo "Senha da rede Wi-Fi: $resultados3"; ) curl_close($ch); ?>

A propósito, se o proprietário atualizar a senha (mas não atualizar o firmware), a nova senha sempre poderá ser visualizada em http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc /httppasswd

(Esta é uma vulnerabilidade bem conhecida nos roteadores D-Link DIR-300, D-Link DIR-320 e D-Link DAP-1353).

Autenticação HTTP cURL na linha de comando

Já sabemos o endereço completo, bem como a string a ser transmitida. Portanto, tudo é simples:

Curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php

Acho que está tudo claro, porque já consideramos esses termos. Se alguém não estiver claro - pergunte nos comentários.

Um exemplo de uso de cURL para obter e analisar dados seria o seguinte conjunto de comandos:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn " && echo "Nome da rede Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "senha da rede Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Casos de autorização complexos: AJAX, JQuery, JavaScript, etc.

Seria mais correto escrever os dados do cabeçalho assim: Casos "complexos" de autorização. Aqueles. coloque a palavra "complexo" entre aspas. Eles parecem complicados apenas à primeira vista, quando não está claro: onde o envio ocorre, quais são os nomes dos campos, o que exatamente é enviado etc.

Mas, na verdade, todos eles se resumem aos métodos POST ou GET. Para entender exatamente o que está sendo enviado, você pode salvar a página com o formulário em seu disco e travar a função de mostrar os dados gerados para envio no botão enviar. Ou ainda mais simples - como eu, Wireshark "ohm.

Se os dados estiverem corretos e a autenticação não ocorrer, você precisará cavar nas seguintes direções:

  • defina a string de referência correta
  • defina a string "correta" do agente do usuário.

Tudo isso pode ser feito com métodos cURL básicos, mas não vou me deter nisso. A lição já era grande, mas eu também queria mostrar alguns truques com cURL.

Dicas e truques cURL

cURL e obtendo cookies além de CURLOPT_COOKIEJAR

Acho que já ficou claro que o cURL trata os cookies corretamente - os salva, os usa quando o servidor solicita, etc. Mas às vezes os cookies precisam ser salvos. Existe uma opção CURLOPT_COOKIEJAR para isso, mas nem sempre é possível usá-la. Este é o nosso primeiro truque.

Às vezes, devido às peculiaridades das configurações do PHP no servidor, opções como CURLOPT_COOKIEJAR (permite salvar cookies recebidos em um arquivo) e CURLOPT_COOKIEFILE (permite usar cookies de um arquivo) não estão disponíveis para nós. Porque eles dizem que, usando essas opções, poderemos extrair qualquer arquivo do servidor. Aqui está a solução para este problema:

1) Não use CURLOPT_FOLLOWLOCATION

2) Use curl_setopt($ch, CURLOPT_HEADER, 1)

3) Coletamos cookies do cabeçalho assim:

preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implodir(";", $resultados);

4) Defina-os usando curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Segunda dica. De atacantes podemos nos transformar em vítimas. Para não nos tornarmos vítimas de um ataque man-in-the-middle, fazemos isso.

Por favor, todos, parem de definir a configuração CURLOPT_SSL_VERIFYPEER para false ou 0. Se sua instalação PHP não tiver um conjunto atualizado de certificados raiz CA, baixe um do site curl e salve-o em seu servidor:

Em seguida, defina o caminho em seu arquivo php.ini, por exemplo no Windows:

curl.cainfo=c:phpcacert.pem

Desabilitar CURLOPT_SSL_VERIFYPEER permite um ataque man-in-the-middle (MITM), que não queremos!

Bem, uma última dica para hoje. Você sabia que é possível um grande número de solicitações de curl assíncronas?

Para isso você pode usar curl_multi_init. Detalhes e código de exemplo na documentação oficial http://php.net/manual/ru/function.curl-multi-init.php

Sobre cURL na linha de comando

caracol

A segunda parte da lição também foi preparada para leitura em russo ondulação: " ".