Buenas, en este post os voy a explicar el funcionamiento de la clase CURL, muy útil para hacer peticiones personalizadas con el protocolo HTTP.
Esta clase tiene estas principales funciones que mas se usan:
- curl_init - Inicia una nueva sesion CURL.
- curl_setopt - Define opciones para nuestra sesion CURL.
- curl_getinfo - Obtiene información de la última transferencia.
- curl_exec - Ejecuta la petición HTTP
- curl_close - Cierra la sesion CURL.
Os voy a mostrar un ejemplo para que os orientéis un poco:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_exec($ch);
curl_close($ch);
?>
De este modo nos muestra la pagina
www.example.com.
Pero si queremos que el
output que devuelve la pagina se almacene en una variable,
podemos utilizar la opción CURLOPT_RETURNTRANSFER mediante la función curl_setopt
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$xxx = curl_exec($ch);
curl_close($ch);
?>
Algunas opciones de la función
curl_setopt:
Solamente la opción CURLOPT_URL es obligatoria, el resto son totalmente opcionales- CURLOPT_URL - Define la URL de la petición HTTP (Obligatorio)
- CURLOPT_PORT - Puerto alternativo
- CURLOPT_FOLLOWLOCATION - True: Sigue cualquier encabezado "Location: ". False por defecto.
- CURLOPT_COOKIE - Define las cookies que se van a enviar al servidor HTTP, por ejemplo: "cookie1=azul&cookie2=rojo;"
- CURLOPT_COOKIEFILE - Nombre del fichero que contiene datos de las cookies. El fichero también puede estar en un servidor HTTP remoto.
- CURLOPT_COOKIEJAR - Nombre del fichero donde guardar cookies internas cuando se cierre la conexión.
- CURLOPT_REFERER - Contenido del Header "Referer: " para ser usado en la petición HTTP.
- CURLOPT_USERAGENT - Nombre del navegador
- CURLOPT_POST - True: Para hacer una petición HTTP-POST.
- CURLOPT_POSTFIELDS - Es valido si CURLOPT_POST esta en true. Define los datos del POST, ejemplo: "usuario=luis&password=12345;"
- CURLOPT_HEADER - True: para incluir el header en el output.
Podéis encontrar la lista completa de opciones en
php.netTodas las opciones de la función
curl_getinfo (esta funcion no se usa mucho):
- CURLINFO_EFFECTIVE_URL - Última URL utilizada
- CURLINFO_HTTP_CODE - Último código HTTP recibido
- CURLINFO_FILETIME - Hora del documento remoto, si devuelve -1 la hora del documento es desconocida
- CURLINFO_TOTAL_TIME - Tiempo total de la duración de última transación en segundos
- CURLINFO_NAMELOOKUP_TIME - Tiempo en segundos que se tardó en resolver la ubicación del fichero
- CURLINFO_CONNECT_TIME - Tiempo en segundos que se tardó en establecer la conexión
- CURLINFO_PRETRANSFER_TIME - Tiempo en segundos desde el inicio justo antes de que empiece la transferencia
- CURLINFO_STARTTRANSFER_TIME - Tiempo en segundos hasta que el primer byte está a punto de transferirse
- CURLINFO_REDIRECT_TIME - Tiempo en segundos de todos los pasos de redireción antes que la última transación haya empezado
- CURLINFO_SIZE_UPLOAD - Número total de bytes subidos
- CURLINFO_SIZE_DOWNLOAD - Número total de bytes descargados
- CURLINFO_SPEED_DOWNLOAD - Velocidad media de descarga
- CURLINFO_SPEED_UPLOAD - Velocidad media de subida
- CURLINFO_HEADER_SIZE - Tamaño total de los encabezados recibidos
- CURLINFO_HEADER_OUT - La cadena de la petición enviada
- CURLINFO_REQUEST_SIZE - Tamaño total de las peticiones realizadas, solamente para peticiones HTTP
- CURLINFO_SSL_VERIFYRESULT - Resultado de la verificación del certificado SSL solicitado por la opción CURLOPT_SSL_VERIFYPEER
- CURLINFO_CONTENT_LENGTH_DOWNLOAD - content-length de descarga, leído desde el campo <i>Content-Length:</i>
- CURLINFO_CONTENT_LENGTH_UPLOAD - Tamaño especificado de subida
- CURLINFO_CONTENT_TYPE - <i>Content-Type:</i> del objecto descargado, NULL indica que el servidor no envío un encabezado Content-Type: válido.
Ejemplos:Buscar en google:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.es/search?q=PHPeros");
curl_exec($ch);
curl_close($ch);
?>
Iniciar sesion en una pagina web:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.web.com/login.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "usuario=marco&password=12345;");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
curl_exec($ch);
curl_close($ch);
?>
Cambiar nombre navegador:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com");
url_setopt($ch, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
curl_exec($ch);
curl_close($ch);
?>
Incluir las cabeceras en el
output:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_exec($ch);
curl_close($ch);
?>
De esta forma se nos mostrara las cabeceras del servidor HTTP junto al código HTML. Como se podrían separar las cabeceras del código html? De la siguiente forma:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xxx = curl_exec($ch);
curl_close($ch);
$xxx = explode("\n\r\n", $xxx);
$headers = $xxx[0];
$body = $xxx[1];
?>
En la variable headers se guardan los encabezados y en la variable body el código HTML.
Otro ejemplo es almacenar las cookies que se devuelve por el servidor HTML en un archivo con la opción COOKIEJAR:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://m.tuenti.com");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
curl_exec($ch);
curl_close($ch);
?>
Bueno, esto es todo, si tenéis alguna duda o petición porfavor preguntármelo.
Un saludo!