PHP: Trabalhando com a biblioteca cURL

PHP: Trabalhando com a biblioteca cURL

A biblioteca cURL do PHP nos auxilia a buscar informações em outro sites, possibilitando a obtenção de dados remotos, como criação de WEB Services, bots de busca etc.

Vamos começar com um simples exemplo, acessando o site do Google e exibindo o conteúdo obtido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// página que desejamos acessar
$pagina = 'http://www.google.com.br';
 
// iniciamos uma instância do cURL
$ch = curl_init();
 
// definimos a URL a ser acessada
curl_setopt( $ch, CURLOPT_URL, $pagina );
 
// executamos a ação
curl_exec( $ch );
 
// encerramos a instância do cURL
curl_close( $ch );

Caso queira, em vez de exibir o conteúdo, retorná-lo a uma variável, para um tratamento de string, por exemplo, basta usar a opção RETURNTRANSFER. O código ficará assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$pagina = 'http://www.google.com.br';
 
$ch = curl_init();
 
curl_setopt( $ch, CURLOPT_URL, $pagina );
 
// define que o conteúdo obtido deve ser retornado em vez de exibido
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
 
$retorno = curl_exec( $ch );
 
curl_close( $ch );
 
// trocamos a palavra "Google" por "Beraldo"
echo preg_replace( "/google/i", "Beraldo", $retorno );

Será exibido o conteúdo, porém, com a palavra “Beraldo” substituindo todas as palavras “Google”.

Há diversas opções para usar com a função curl_setopt. Veja a lista completa no link da documentação dessa função.

Por padrão, o cURL não segue redirecionamentos. Por exemplo, se houver um header(“Location: url”);, o redirecionamento não será feito. Para contornar isso, usamos a opção CURLOPT_FOLLOWLOCATION. Usarei o site www.google.com para testar. Experimente retirar esta última opção inserida e veja que a página em português não e exibida.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$pagina = 'http://www.google.com';
 
$ch = curl_init();
 
curl_setopt( $ch, CURLOPT_URL, $pagina );
 
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
 
// define que deve-se seguir redirecionamentos
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
 
$retorno = curl_exec( $ch );
 
curl_close( $ch );
 
echo preg_replace( "/google/i", "Beraldo", $retorno );

Os exemplos acima poderiam perfeitamente funcionar com funções de manipulação de arquivos, como file_get_contents. Porém, essas funções não podem executar requisições com método POST. É aí que entra o cURL! :)

A opção CURLOPT_POST define que a requisição será pelo método POST. Para definir os campos da requisição, usaremos CURLOPT_POSTFIELDS. Vamos a um exemplo simples:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// campos da requisição POST
$postfields = array(
						'nome' => 'Beraldo',
						'site' => 'www.rberaldo.com.br'
					);
 
// página que receberá a requisição post
$pagina = 'http://localhost/tmp/curl/post.php';
 
$ch = curl_init();
 
curl_setopt( $ch, CURLOPT_URL, $pagina );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields );
 
curl_exec( $ch );
 
curl_close();

Código do arquivo post.php:

1
print_r( $_POST );

Isso mostrará os campos que definimos no nosso script de cURL.

Podemos usar a opção CURLOPT_HEADER para incluir na saída o cabeçalho da página. Por exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// campos da requisição POST
$postfields = array(
						'nome' => 'Beraldo',
						'site' => 'www.rberaldo.com.br'
					);
 
// página que receberá a requisição post
$pagina = 'http://localhost/tmp/curl/post.php';
 
$ch = curl_init();
 
curl_setopt( $ch, CURLOPT_URL, $pagina );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields );
 
// define que o cabeçalho deve ser incluso na saída da requisição
curl_setopt( $ch, CURLOPT_HEADER, true );
 
curl_exec( $ch );
 
curl_close();

É possível, inclusive, enviar arquivos por cURL, via POST. Basta incluir mais um campo e inserir o arroba (@) antes do caminho completo do arquivo. Por exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// campos da requisição POST
$postfields = array(
						'nome' => 'Beraldo',
						'site' => 'www.rberaldo.com.br',
						'arquivo' => '@/tmp/imagem.jpg'
					);
 
// página que receberá a requisição post
$pagina = 'http://localhost/tmp/curl/post.php';
 
$ch = curl_init();
 
curl_setopt( $ch, CURLOPT_URL, $pagina );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields );
curl_setopt( $ch, CURLOPT_HEADER, true );
 
curl_exec( $ch );
 
curl_close( $ch );

Se você inserir um print_r( $_FILES ); no post.php, verá os dados do arquivo enviado. ;)

Unindo as duas últimas opções (POST e HEADER), podemos falar sobre login usando cURL. Sim, é possível, inclusive, fazer login em sites usnado cURL. Afinal, essa biblioteca pode perfeitamente simular um navegador ou um bot de busca.

Primeiro vamos incluir a criação de um cookie no nosso arquivo post.php, deixando-o da seguinte forma:

1
2
setcookie( "test", "valor do cookie de teste", time() + 3600 );
print_r( $_POST );

E o nosso script de cURL passará a receber o valor do cookie que deve ser salvo no navegador.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// campos da requisição POST
$postfields = array(
						'nome' => 'Beraldo',
						'site' => 'www.rberaldo.com.br'
					);
 
// página que receberá a requisição post
$pagina = 'http://localhost/tmp/curl/post.php';
 
$ch = curl_init();
 
curl_setopt( $ch, CURLOPT_URL, $pagina );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $postfields );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HEADER, true );
 
$retorno = curl_exec( $ch );
 
curl_close( $ch );
 
preg_match( "/Set-Cookie:([^\n]+)/i", $retorno, $matches );
$cookie = $matches[1];
echo $cookie;

A variável $cookie conterá o valor do cookie que deve ser salvo no navegador. Para salvar esse cookie, usamos a opção CURLOPT_COOKIE. Tendo esse valor salvo numa variável, basta fazer isto no script que se conecta a uma página que exija esse cookie:

1
curl_setopt( $ch, CURLOPT_COOKIE, $cookie );

Na documentação das funções cURL (especialmente na da função curl_setopt) é possível encontrar muitas outras funcionalidades para a cURL. É possível definir cabeçalhos de navegador, idioma, usar SSL, proxy e muito mais.

Lista de funções da cURL:
http://www.php.net/manual/pt_BR/ref.curl.php

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.