Na biblioteca padrão, não existe função para baixar uma página web e, nem funções para se comunicar utilizando o protocolo HTTP.
Existem apenas duas maneiras:
A Libcurl é uma dessas livrarias que também suporta muitos outros protocolos como o ftp, o Idap, etc... Ela também é uma biblioteca livre e portátil (passa tanto no Windows quanto no Unix, por exemplo).
Abra um shell e digite:
sudo apt-get install libcurl3 libcurl3-dev
Pronto, você instalou a biblioteca e seus arquivos de cabeçalho.
Isso foi testado apenas com a versão 4.9.9.2.
Com o IDE gratuito Dev C++, a instalação é bem simples; assim, eu recomendo este software no nosso exemplo, ainda mais que ele é gratuito e livre.
Primeiro, vamos instalar a biblioteca zlib, da qual depende a libcurl, já que instalaremos a libcurl depois.
Abra então o Dev C++ e vá no menu Ferramentas/Novas Versões de Pacotes.
No menu dropdown intitulado "Select devpack server" no topo da janelinha de gestão de pacotes, selecione devpacks.org e clique no botão "Check for updates".
Nomes de biblioteca aparecerão, procure por "zlib" e selecione a versão mais recente.
Clique em "Download selected" e deixe-se guiar pelo instalador.
Em seguida, na mesma lista, procure a libcurl e verifique se a versão contém a menção "no_ssl", selecione-a e clique novamente em "Download Selected" e idem, deixe-se guiar.
Pronto, foi instalado!
Explicação sobre a instalação com o Visual C++ (em inglês)
Agora, olhemos de mais perto como utilizar esta biblioteca para baixar uma página web.
Alguns recursos úteis estão descritos aqui.
Vamos precisar das seguintes funções:
CURL *curl_easy_init( );
Esta função é a primeira a ser chamada, ela inicializa a sessão e armazena em uma variável do tipo CURL * que é um tipo próprio da biblioteca, você não precisa se preocupar.
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
Esta função é a mais difícil de usar. É aqui que tudo acontece, de uma certa forma. O primeiro argumento é a sessão que você inicializou. A opção e o parâmetro formam um casal de dados que, por sua vez, forma uma direção conjunta. É nesse casal que você configura tudo: o URL, a função a ser utilizada para registrar o conteúdo baixado, o nome do arquivo, etc ... Por exemplo, para colocar o url da página a ser baixada, a opção será igual a CURLOPT_URL e o parâmetro será o url do tipo http://coisa.com. Vamos ver isso no exemplo. Mas lembre-se que o tipo de parâmetro depende muito da opção. Chamamos esta função tantas vezes quanto temos parâmetros a serem passados.
CURLcode curl_easy_perform(CURL * handle );
Essa é a função mágica, ele executa o download.
Essa é uma função que não deve ser esquecida: ela libera os recursos utilizados durante a sessão que você inicializou.
Vamos pô-la em prática!
Precisamos baixar a página inicial do KIOSKEA.
Vamos salvar a pagina http://www.ccm.net no arquivo ./index_ccm.html
#include <curl/curl.h>
#include <stdio.h>
.
CURL *sessão = curl_easy_init(); //É, muito fácil
.
curl_easy_setopt(session, CURLOPT_URL, "http://www.ccm.net");
FILE * fp = fopen("./index_ccm .html", "w"); //Criação do nosso arquivo
curl_easy_setopt(sessão, CURLOPT_WRITEDATA, fp)//Nós equilibramos o nosso ponteiro de arquivo como destino
.
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
. Você poderá criar uma função de gravação de sua escolha e colocá-la em parâmetro curl_easy_setopt, enquanto ela tiver o mesmo cabeçalho que o fwrite. Mas se você realmente não quiser se aporrinhar, utilize o fwrite já está pronto:
curl_easy_setopt (sessão, CURLOPT_WRITEFUNCTION, fwrite)
.
curl_easy_perform (sessão);
fclose(fp)
curl_easy_cleanup(sessão);
Veja o que dá o nosso exemplo:
#include <curl/curl.h> #include <stdio.h> int main(int argc, char **argv) { CURL *sessão = curl_easy_init(); curl_easy_setopt(sessão, CURLOPT_URL, "http://www.ccm.net"); FILE * fp = fopen("./index_ccm .html", "w"); curl_easy_setopt(sessão, CURLOPT_WRITEDATA, fp); curl_easy_setopt(sessão, CURLOPT_WRITEFUNCTION, fwrite); curl_easy_perform(sessão); fclose(fp); curl_easy_cleanup(sessão); return 0; }
Agora vamos compilá-lo. Vamos chamar nosso arquivo de ccm.c
Para compilar, é importante especificar que usamos a libcurl no editor de links, para que ele saiba onde encontrar as funções da libcurl. Então, vamos adicionar a opção -lcurl:
gcc ccm.c -o ccm -lcurl
Prontinho, agora é só executar a nossa aplicação:
./ccm
Testado com a versão 4.9.9.2, como para a instalação.
Crie um novo projeto de aplicação em modo console.
Em seu main.c, cole o código do arquivo fonte da seção anterior. Agora, o nosso objetivo será o de indicar ao compilador e ao editor de links, as opções necessárias para a criação do nosso executável.
Para definir tudo isso, vá em Ferramentas/Opções do compilador e adicione o seguinte comando para o compilador:
-DCURL_STATICLIB
e os seguintes comandos para o editor de links:
-lcurl -lWs2_32 -lz -lWinmm
Clique em OK e no ícone "Reconstruir tudo", e em princípio, e pronto.
Explicação para compilar com o Visual C++ (mesmo documento que para a instalação) - em inglês
Esta biblioteca é, certamente, um pouco mágica, mas há limites: