viernes, 15 de enero de 2010

PHP y Curl - Curling the nation



Curl es una librería en PHP que emplearemos bastante en este blog para hacer peticiones a cualquier tipo de protocolo, entre ellos, FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP.

También soporta certificados HTTPS, HTTP POST, HTTP PUT, subidas FTP, Kerberos, subidas mediante formulario HTTP, proxies, cookies, autentificación mediante usuario+contraseña (Basic, DIgest, NTLM y Negotiate para HTTP y kerberos4 para FTP), continuación de transferencia de archivos, tunneling de proxy http y muchas otras prestaciones lo que lo convierte en la auténtica navaja suiza.

Nosotros usaremos Curl con PHP aunque se puede trabajar como programa en un terminal pero no cumple los requisitos que nosotros queremos ya que mediante PHP podremos limpiar el resultado y manejarlo a nuestro antojo.

INSTALACIÓN
Primero de todo tienes que tener php5 y php5-cli para programar, compilar y ejecutar. Esto quedó explicado en ediciones anteriores. En cualquier caso para instalar curl ejecutaremos en un terminal:
  • sudo apt-get install php5-curl
Una vez instalado abriremos nuestro IDE favorito, en nuestro caso Geany y procederemos a crear nuestro primer programa de prueba.
<?php
    $ch = curl_init('http://www.example.com');//Dirección
    //curl_setopt ($ch, CURLOPT_POST, 1);//Para Enviar POST
    //curl_setopt ($ch, CURLOPT_POSTFIELDS, "usuario=peter&contra=hola");//Define usuario y contraseña
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //Para guardar en variable la salida
    $salida= curl_exec ($ch);//Guardamos la salida en una variable
    curl_close ($ch);//Cerramos conexión
    echo $salida;
?>
Muy bien, he comentado el código para que aprendáis el funcionamiento básico. Las opciónes de POST están comentadas pues no se usarán de momento pero es útil tenerlas a mano para cuando queramos intentar INYECCIONES.

El script abre la página example.com e imprime su código fuente. Si lo ejecutamos a través de servidor se verá la página y si lo ejecutamos a través del IDE se verá el código fuente.


DESCARGARSE TODA LA WIKIPEDIA


Conseguir la WikiPedia por la cara es un ejemplo bastante sencillo pero realmente muestra la potencia de esta librería por eso os lo enseñamos. Para ello crearemos un sencillo script para bajarnos la WikiPedia entera a modo de buscador primitivo mediante la función especial del la wiki aleatoria.
Para ello creamos una carpeta llamada Enciclopedia y guardamos nuestro copypaste.php que contendrá:
<?php
 /*
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *     
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *     
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */
    while (true){//Bucle infinito!
        $ch = curl_init('http://es.wikipedia.org/wiki/Especial:Aleatoria');
        //curl_setopt ($ch, CURLOPT_POST, 1);
        //curl_setopt ($ch, CURLOPT_POSTFIELDS, "contraseña='OR 1=1");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);//Para que siga las redirecciones.
        $salida = curl_exec ($ch);
        curl_close ($ch);
        //Cogemos el título con expresión regular
        preg_match("/(\<title>)(.)*(\<\/title>)/i", $salida, $resultados);
        //Limpiamos el titulo para guardarlo
        $nombre = $resultados[0];
        $nombre = str_replace("<title>", "",$nombre);
        $nombre = str_replace("- Wikipedia, la enciclopedia libre</title>", "",$nombre);
        $nombre = str_replace(" ","_",$nombre);
        $nombre = $nombre.".html";
        if (!file_exists($nombre)){//No existe el archivo
            //Quitamos gran parte de información basura
            $salida = explode('<div id="content">',$salida);
            $salida = '<div id="content">'.$salida[1];
            $salida = explode('<div class="printfooter">',$salida);
            $salida = $salida[0];
            //Guardamos
            $fp = fopen($nombre, 'w');
            //Cabeceras para que no aparezcan códigos raros
            fwrite($fp,'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es" dir="ltr">
            <head>
            <title>'. str_replace("_"," ",$nombre).'</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />');
            fwrite($fp, $salida);
            fwrite($fp,"</html>");
            fclose($fp);
        }
    }
?>
 Ejecutamos, lo dejamos días y se nos baja la wikipedia entera :)

DESCARGARSE TODO XKCD


XKCD es un WebComic muy popular, su construcción de URLS es muy sencilla por lo que nos puede resultar bastante sencillo. Para ello crearemos el archivo xkcd.php que contendrá:
<?php
 /*
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *    
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *    
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */
    for ($i=1; $i<=688; $i++){//Numero de comics
        $ch = curl_init('http://xkcd.com/'.$i);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);//Para que siga las redirecciones.
        $salida = curl_exec ($ch);
        curl_close ($ch);
        preg_match("/(http:\/\/imgs.xkcd.com\/comics\/)(.)*(\")/i", $salida, $resultados);
        $imagen = $resultados[0];
        $imagen = explode('"',$imagen);
        $imagen = $imagen[0];
        $ch = curl_init($imagen);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);//Para que siga las redirecciones.
        $salida = curl_exec ($ch);
        curl_close ($ch);
        $imagen = str_replace("http://imgs.xkcd.com/comics/","",$imagen);
        $fp = fopen($imagen, 'w');
        fwrite($fp, $salida);
        fclose($fp);
        echo "guardado ".$i."\n";
       
    }
?>

OTRAS OPCIONES
Curl tiene muchas opciones, hemos visto algunas de ellas, pero aquí tenéis el ARRAY completo con todas las opciones.
$options = array(
CURLOPT_RETURNTRANSFER => true, //Devuelve la transferencia a la variable
CURLOPT_HEADER => true, //Envia las cabeceras
CURLOPT_FOLLOWLOCATION => false, //Acepta redirecciones
CURLOPT_ENCODING => "", //Codificacion
CURLOPT_USERAGENT => "Mi Navegador; Mi Sistema Operativo!!)",
CURLOPT_AUTOREFERER => true,
CURLOPT_CONNECTTIMEOUT => 120,
CURLOPT_TIMEOUT => 120,
CURLOPT_MAXREDIRS => 10,
CURLOPT_POST => 2,
CURLOPT_POSTFIELDS => "$postfields", // datos post
CURLOPT_COOKIEFILE => "cookies.txt", // de donde leer cookies anteriormente guardadas
CURLOPT_COOKIEJAR => "cookies.txt" // en donde guardar cookies
);

 Ya sabéis, esto tiene muchísimas aplicaciones. Podéis hacer desde un navegador en PHP ha un cliente FTP pasando por actividades más divertidas como búsqueda y explotación de fallos.

No hay comentarios:

Publicar un comentario