Comunidad PHPeros
Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: marco811 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($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.net (http://es2.php.net/manual/es/function.curl-setopt.php)
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($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!
-
Fantástico tutorial enhorabuena :)
-
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.
-
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
-
Depende de lo que quieras hacer :) Y es igual de veloz jeje
Ni por asomo
-
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!
-
Vaya pasada de tutorial, muy claro y completo, mi enhorabuena marco811!
-
Vaya pasada de tutorial, muy claro y completo, mi enhorabuena marco811!
Gracias naveda :D aunque le faltan un par de ejemplos jeje
-
¿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.
-
¿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.
:)
-
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?
-
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);
?>
-
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
-
No me sirvió... Simplemente no me muestra nada ;s
Has puesto la funcion echo para que te lo muestre por pantalla? >:(
-
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);
?>
-
hmmm, estas usando el metodo GET y el login de habbo usa el metodo POST, claro que no te funcione
-
Yo tenia entendido que CURL se usaba para dar ordenes a un cierto tiempo, por ejemplo :
Si son las 00:00 se hace una mysql_query() ¿No es cierto?.
-
Yo tenia entendido que CURL se usaba para dar ordenes a un cierto tiempo, por ejemplo :
Si son las 00:00 se hace una mysql_query() ¿No es cierto?.
No :D Te equivocas xd
-
hmmm, estas usando el metodo GET y el login de habbo usa el metodo POST, claro que no te funcione
Explícame como hacerlo, que estoy en 0 xD
-
para utilizar el metodo POST, necesitas usar las siguientes opciones:
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "usuario=marco&password=12345;");
Un saludo
-
A todo esto, ¿para qué se utiliza CURL?
(Siento si es una pregunta estúpida, pero no entendí :-[)
-
A todo esto, ¿para qué se utiliza CURL?
(Siento si es una pregunta estúpida, pero no entendí :-[ )
si no entiendes lo de arriba no se como explicartelo.
-
A todo esto, ¿para qué se utiliza CURL?
(Siento si es una pregunta estúpida, pero no entendí :-[)
Yo pensaba que CURL se usaba para dar "ordenes" para realizar una determinada tarea en un cierto tiempo. Pero marco me dijo que no y por
mas que trato de leerlo y asimilarlo me deja ???. Lo unico que he llegado a entender es que sirve para personalizar el protocolo HTTP, es decir,
que puedes modificar tu estilo de navegación. Eso es lo que he llagado a entender pero no se si estará bien.
-
Exacto, sirve para hacer peticiones HTTP personalizadas. Y lo de realizar una determinada tarea en un cierto tiempo es casi imposible (por no decir imposible) en PHP ya que los archivos PHP solamente se ejecutan a la peticion del usuario, se necesitaria una tarea del S.O que haga la peticion a PHP.
Digo casi imposible porque si que hay posibilidades , una de ella es ejecutar un archivo PHP al infinito y con un bucle extraer de la base de datos las tareas y ejecutarlas cuando llegue la hora.
<?php
set_time_limit(0);
while(true) {
//bucle infinito
}
?>
Pero hay un inconveniente: el script se para al caerse el servidor apache y habria que volver a ejecutarlo.
Un saludo.
-
Aaah si si ya entendí bien.
Sólo una duda: ¿con este método es como algunos programas (TweetDeck, Gwibber...) inician sesión en Twitter?
-
Creo que si, pero mucho mas avanzado y utlizando muchas otras librerias
-
Ahh ok ok. No obstante, si quiero crear una API de Twitter a nivel web, creo que sí debería usar sólo el cURL, ¿no?
-
Si por ejemplo no se puede realizar una conexión mediante cURL, de qué manera puedo mostrar un mensaje de error así tipo "No se pudo conectar". ¿?
-
Ahh ok ok. No obstante, si quiero crear una API de Twitter a nivel web, creo que sí debería usar sólo el cURL, ¿no?
Twitter tiene su propia API...
Si por ejemplo no se puede realizar una conexión mediante cURL, de qué manera puedo mostrar un mensaje de error así tipo "No se pudo conectar". ¿?
Pues si la variable donde usaste el curl_exec es false, es que ha fallado, por lo tanto:
// definimo opciones...
$curl = curl_exec($init);
if(!$curl) { echo 'Falló...';
} else {
echo 'Se ha ejecutado perfectamente';
}
-
Estaba probando lo de enviar peticiones http y quize logearme en un sitio y no me funcione, este es el codigo que tengo.
<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://www.habbo.es");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "credentials.username=aquieluser&credentials.password=aquilapass;");
curl_exec($curl);
curl_close($curl);
?>
---- RESUELTO
-
Anda, focux creí que era yo el único xD
-
A ver, focux...
curl_setopt($curl, CURLOPT_URL, "http://www.habbo.es");
en esa URL no se procesa ningun formulario:
curl_setopt($curl, CURLOPT_URL, "https://www.habbo.es/account/submit");
así debería ser
-
Ya lo resolvi, hize este para paypal.
-
Buenísimo el tutorial. Una pregunta que tengo:
Quiero meterme en una pagina web y pulsar un boton que me permite descargarme un excel. Cómo podría hacerlo?
Muchas gracias de antemano. ^^