Autor Tema: Tutorial de como se utiliza CURL en PHP  (Leído 56696 veces)

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Tutorial de como se utiliza CURL en PHP
« en: 19 de Abril de 2010, 11:23:25 am »
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($chCURLOPT_URL"http://www.example.com/");
curl_setopt($chCURLOPT_HEADER0);
curl_setopt($curlCURLOPT_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($chCURLOPT_URL"http://www.example.com/");
curl_setopt($chCURLOPT_HEADER0);
curl_setopt($curlCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($curlCURLOPT_RETURNTRANSFERtrue); 
$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_FOLLOWLOCATIONTrue: 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.net

Todas 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($chCURLOPT_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($chCURLOPT_URL"http://www.web.com/login.php");
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_POSTFIELDS"usuario=marco&password=12345;");
curl_setopt($chCURLOPT_COOKIEJAR"cookies.txt");
curl_exec($ch);
curl_close($ch);
?>


Cambiar nombre navegador:

<?php
$ch 
curl_init();
curl_setopt($chCURLOPT_URL"http://www.example.com");
url_setopt($chCURLOPT_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($chCURLOPT_URL"http://www.example.com");
curl_setopt($chCURLOPT_HEADERtrue);  
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($chCURLOPT_URL"http://www.example.com");
curl_setopt($chCURLOPT_HEADERtrue);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
$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($chCURLOPT_URL"http://m.tuenti.com");
curl_setopt($chCURLOPT_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!
« Última modificación: 19 de Abril de 2010, 11:28:40 am por marco811 »

Comunidad PHPeros

Tutorial de como se utiliza CURL en PHP
« en: 19 de Abril de 2010, 11:23:25 am »

Desconectado javipilo

  • PHPero Experto
  • *****
  • Mensajes: 975
  • Karma: 31
  • Sexo: Masculino
    • Ver Perfil
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #1 en: 19 de Abril de 2010, 12:28:20 pm »
Fantástico tutorial enhorabuena  :)

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #2 en: 19 de Abril de 2010, 21:24:29 pm »
Ya sabía sobre los curls, es mil veces mejor que file_get_contents(), además de que es más  veloz, es más eficaz.
Mixtiqueros.net

<?PHP
define
(_miNombre'Focux');
if(
_miNombre == 'Focux'): printf('%s es un programador avanzado'_miNombre); else: printf('Tu no eres %s'_miNombre); endif;
?>

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #3 en: 19 de Abril de 2010, 21:35:45 pm »
Ya sabía sobre los curls, es mil veces mejor que file_get_contents(), además de que es más  veloz, es más eficaz.
Depende de lo que quieras hacer :) Y es igual de veloz jeje

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #4 en: 19 de Abril de 2010, 21:55:00 pm »
Depende de lo que quieras hacer :) Y es igual de veloz jeje
Ni por asomo

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #5 en: 19 de Abril de 2010, 22:19:09 pm »
Ni por asomo
Por que? sigue siendo una peticion HTTP, puede que mas rapida ya que no tiene que procesar muchas lineas de codigo.
Un saludo!

Desconectado naveda

  • Administrador General
  • PHPero Master
  • *****
  • Mensajes: 2.282
  • Karma: 166
  • Sexo: Masculino
    • Ver Perfil
    • naveda.me
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #6 en: 22 de Abril de 2010, 00:14:13 am »
Vaya pasada de tutorial, muy claro y completo, mi enhorabuena marco811!
Por favor, leete las Normas


Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #7 en: 22 de Abril de 2010, 08:08:04 am »
Vaya pasada de tutorial, muy claro y completo, mi enhorabuena marco811!
Gracias naveda :D aunque le faltan un par de ejemplos jeje

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #8 en: 24 de Abril de 2010, 22:58:31 pm »
¿De qué forma puedo logearme en una página usando cURL?
Es decir que en link salga algo como http://tupagina.es/index.php?user=Nombre&pass=MiPass y logearlo con cURL.

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #9 en: 24 de Abril de 2010, 23:03:52 pm »
¿De qué forma puedo logearme en una página usando cURL?
Es decir que en link salga algo como http://tupagina.es/index.php?user=Nombre&pass=MiPass y logearlo con cURL.
Si es una peticion GET pones eso en la opcion CURLOPT_URL.
:)

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #10 en: 25 de Abril de 2010, 00:04:23 am »
Si es una peticion GET pones eso en la opcion CURLOPT_URL.
:)
Y luego de esto puedo manejar la web usando explode() y cosas por el estilo para extraerle contenido estando logeado?

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #11 en: 25 de Abril de 2010, 00:39:44 am »
Y luego de esto puedo manejar la web usando explode() y cosas por el estilo para extraerle contenido estando logeado?
Exacto, pero para hacer eso necesitas guardar el contenido en una variable, y para eso es obligatorio usar CURLOPT_RETURNTRANSFER

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$xxx = curl_exec($ch);
curl_close($ch);
?>

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #12 en: 25 de Abril de 2010, 03:42:56 am »
Exacto, pero para hacer eso necesitas guardar el contenido en una variable, y para eso es obligatorio usar CURLOPT_RETURNTRANSFER

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xxx = curl_exec($ch);
curl_close($ch);
?>
No me sirvió... Simplemente no me muestra nada ;s

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #13 en: 25 de Abril de 2010, 09:58:35 am »
No me sirvió... Simplemente no me muestra nada ;s
Has puesto la funcion echo para que te lo muestre por pantalla?  >:(

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Tutorial de como se utiliza CURL en PHP
« Respuesta #14 en: 25 de Abril de 2010, 22:32:47 pm »
Has puesto la funcion echo para que te lo muestre por pantalla?  >:(
Yes... Probé con el de habbo que fue el primero que se me vino a la mente. Esto hice:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.habbo.es/account/submit?credentials.username=HABBO&credentials.password=CONTRA");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xxx = curl_exec($ch);
echo $xxx;
curl_close($ch);


?>