Zumbe.net

CURLOPT de CURL

Aúnque el título parezca más bien un trabalenguas proviniente del mismísimo Chiquito de la Calzada, hoy voy a comentar algunas potentes opciones que nos brinda la biblioteca CURL.

Para mí CURL era un auténtico desconocido, cuando en el anterior host no tenia ni fopen para urls externas. Pero una vez lo conoces se convierte en una herramienta muy potente y útil.

Lo primero a realizar en nuestro código, es siempre la inicialización de curl, con la función curl_init()

Código (php)
  1. $ch = curl_init();

Hecho esto tendremos en la variable $ch el identificador de nuestra sesión CURL. Ahora sólo nos tenemos que dedicar a marcarle nuestras preferencias para la conexión. Voy a mostraros a continuación las que me parecen más importantes, pero recordad que hay muchas más.

Código (php)
  1. // Indicamos la URL a la que queremos acceder
  2. curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
  3. // Si la conexión tarda más de 30 segundos, que no siga
  4. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30);
  5. // Si la conexión falla, que lo haga de forma "silenciosa"
  6. curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  7. // Permitir que la conexión se redirija si le es indicado
  8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  9. // El resultado lo quiero almacenar en una variable, en lugar de que lo imprima por pantalla
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  11. // Voy a enviar contenido en forma de variables POST
  12. curl_setopt($ch, CURLOPT_POST, 1);
  13. // Estos son los campos POST, en forma de array asociativo
  14. curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘nombre’=>"Alex",‘apellido’=>"Barros"));
  15. // Voy a finjir que tengo una serie de Cookies, incluida la de sesión
  16. curl_setopt($ch, CURLOPT_COOKIE, ‘nombre=Alex; galleta=chocolate; PHPSESSID=0123456789qwertyasdfg9876543210′);
  17. // Foy a finjir que provengo de otra web, la que yo quiera
  18. curl_setopt($ch, CURLOPT_REFERER, ‘http://zumbe.net/’);
  19. // Voy a indicar qué User Agent estoy usando. Por ejemplo el de un iPhone
  20. curl_setopt($ch, CURLOPT_USERAGENT, ‘mozilla/5.0 (iphone; u; cpu like mac os x; en) applewebkit/420+ (khtml, like gecko) version/3.0 mobile/1c25 safari/419.3′);

Por último, ejecutamos la sesión, y cerramos la misma.

Código (php)
  1. // Almaceno en la variable $resultado el codigo de la pagina
  2. $resultado = curl_exec($ch);
  3. // Se cierra el recurso CURL y se liberan los recursos del sistema
  4. curl_close($ch);

Sólo con esas herramientas ya podemos hacer un proxy muy completo, que nos haga lo que nosotros queramos.
Ahora sólo es echarle imaginación, ingenio y paciencia.

15 comentarios | tags: Código, General

15 Comentarios para “CURLOPT de CURL”

  1. gafeman Ha dicho:
    21 de Agosto del 2007 a las 11:11

    jeje muy bueno con enlace de chiquito a la wikipedia y todo :D

    no sabia que tenia tanto potencial el CURL, hace poco que me entere de que se podian pasar parametros por post :D

    gracias por el articulo lo voy a agregar al del.icio.us

  2. Alex Barros Ha dicho:
    21 de Agosto del 2007 a las 11:25

    jaja, muchas gracias gafeman. A mí me sorprendió también que algo como CURL fuera tan potente, y tan accesible.

  3. Tolito Ha dicho:
    21 de Agosto del 2007 a las 13:35

    Yo ya me imprimí el manual de Curl para echar un vistazo a todas las opciones…que tiene un montón. Ya se me irán ocurriendo cosas en las que aplicar el Curl…paciencia.

    Un saludo.

  4. gafeman Ha dicho:
    23 de Agosto del 2007 a las 1:11

    @Alex: bueno lo de accesible a veces no tanto, algunos servidores no lo tienen instalado :(

  5. Alex Barros Ha dicho:
    23 de Agosto del 2007 a las 2:10

    Ya, esa es la putada. Pero bueno, siempre puedes instalarte PHP en tu ordenador y añadir CURL.

    Que viva el software libre!

  6. ivan Ha dicho:
    5 de Septiembre del 2007 a las 20:34

    muy buena explicacion, yo tendria una duda al respecto,
    digamos que la página ‘externa’ a la cual estoy invocando con CURL maneja sesiones,
    y especificamente el logueo de una persona (algo asi como un WEB service), si soy usuario valido serializo por ejemplo, un arreglo con los sistemas a los cuales tendre acceso, como puedo desserializar esto en la pagina principal donde inicie el proceso? ya que si recupero el nuevo ID de la sesion, pero no puedo recuperar nada de lo que haya registrado en SESSION[]=” o SERIALIZe(MI_LOGIN), espero haberme explicado y agradecere cualquier comentario

  7. Alex Barros Ha dicho:
    5 de Septiembre del 2007 a las 20:49

    No acabo de entender tu duda.

    A partir de lo que has dicho, puedo decirte que cuando un programa en PHP usa $_SESSION, se envía una cookie al cliente, que identifica al cliente con la sesion almacenada. Es evidente que el cliente no puede acceder a la información almacenada con sesiones en el servidor. Lo único que puedes hacer es finjir ser el cliente al que pertenece esa sesión, usando en la conexión las cookies que se enviaron en la página que generaba la sesión.

    De todas formas, explica mejor tu duda.

  8. ivan Ha dicho:
    5 de Septiembre del 2007 a las 20:55

    mira mas sencillo:

    pagina 1: ingreso de nombre de usuario y contraseña. http://misitio/formularios/inicio.php

    pagina 2: recupera los datos (http://misitio/formularios/comprueba.php) y genera el objeto CURL (apunta hacia http://misitio2/valida_usuario.php)

    pagina 3: es la pagina que autentifica al usuario. http://misitio2/valida_usuario.php

    a su vez la pagina 3 instancia una clase que tiene la conexion a BDD y se encarga de autentificar al usuario: http://misitio2/clases/clslogin.php

    es en esta clase donde serializo los datos del usuario en caso de tener acceso.
    La cuestion es que a la hora de regresar a la pagina deinicio , cualquier variable de sesion que haya incializado en valida_usuario.php o en clslogin.php se pierde, (si la imprimo en estas paginas si esta, pero en inicio.php ya no…)

    haber si ahora si

  9. Alex Barros Ha dicho:
    6 de Septiembre del 2007 a las 11:24

    Lo siento, ivan. No comprendo la situación que me estás planteando.

    Si quieres que trate de ayudarte, puedes enviarme por email a zumbenet[at]gmail[punto]com una explicación más extensa. Las frases que utilizas son muy ambiguas. Imagino que para tí tendrá sentido, pero explicado tan brevemente, algo que tiene pinta de ser complejo, es muy difícil de entender.

    Espero que lo comprendas.

  10. JuanL Ha dicho:
    26 de Octubre del 2007 a las 20:49

    Creo que tengo el mismo problema de Ivan, me autentifico correctamente, pero luego al tratar de accesar a cualquier contenido, se pierde la sesion o la cookie, y me devuelve el formulario de autentificación.

    Como se le puede hacer para que conserve la sesion y así pueda yo con el mismo curl traerme una página aparte?

  11. Alex Barros Ha dicho:
    27 de Octubre del 2007 a las 1:00

    Para mantener una sesión, debes cojer la cookie que te envía al establecer el contacto. Esta cookie te la devuelbe en las cabeceras de la respuesta (no en el código HTML), de modo que tendrás que usar el modo de retorno con cabeceras, inspeccionar la cookie, y en la siguiente llamada, enviar la petición incluyendo la Cookie.

    Las Sesiones funcionan de tal forma, que desde el servidor se te envía una cookie con una referencia (un número criptográfico), hace referencia a la información de sesión almacenada en el servidor. De otra forma no se te podría reconocer comoe “el que hace un momento ha iniciado sesión”.

    En un robot que publiqué hace un tiempo, se utiliza esta técnica. Mira el código para inspirarte:

    http://soft.zumbe.net/down/set_from.phps

  12. Reinaldo Ha dicho:
    29 de Marzo del 2008 a las 18:35

    Hola Alex, no estoy seguro de como se hace para mantener la sesion activa. Logre una vez hacerlo pero cuando la sesion expiro no pude entrar mas, y solo cambie los valores de las cookies cuando inicié la sesion nuevamente pero no funciono.

    La unica vez que lo logre si pude entrar a todas las paginas como quise dentro del login, pero fue la unica vez que lo logre y luego que no pude entrar mas he probado de todo y no lo logro nuevamente. Fue un golpe de suerte.

    Puedo detectar que si se abre la sesion, pero cuando intento llamar a una pagina despues de la sesion, me sale el formulario de login nuevamente.

    Se que utilicé las funciones CURLOPT_COOKIE, CURLOPT_COOKIEJAR Y CURLOPT_COOKIEFILE, pero no estoy seguro de como trabajan y si importa el orden en que coloques estos SETOPTS.

    En la Cookie que se me graba por ejecucion de CURLOPT_COOKIEJAR esta solo el session ID y por eso tuve que agregar mas datos, mediante la opcion CURLOPT_COOKIE porque cuando accese a la cookie real que me se me graba hay unos valores que si _utma, _utmz, etc…

    Estos valores los agregue mediante una variable array en la opcion CURLOPT_COOKIE, algo asi fue como funciono la unica vez que funciono, pero ya no funciona, me puedes ayudar un poco mas con esto?

    Saludos y gracias de antemano.

    Reinaldo.

  13. Reinaldo Ha dicho:
    30 de Marzo del 2008 a las 0:51

    Por cierto, he tratado de loguearme es en http://www.cj.com. Se que ellos tienen una API para obtener la informacion pero yo requiero de mas informacion que la puedo obtener por el codigo fuente de las paginas que estan al iniciar la sesion.

    Como explique anteriormente, pude hacerlo una sola vez, y pude ver y descargar los codigo de las paginas que quise, dentro de la sesion, pero esto duro solamente unas horas porque luego tuve que dejar la PC un rato.

    Al regresar no podia accesar mediante mi codigo PHP-CURL, meti datos nuevos de sesion pero ahora no entra. Parece que solo fue un golpe de suerte la primera vez.

    Me pueden ayudar con el codigo que necesito para entrar a las paginas de cj.com??? e intentado entrar por http://www.cj.com y por https://members.cj.com/member/publisher/home.do y no he podido. He intentado con codigos como este:

    $logincookie = array(
    ‘cjlocale=en_US’,'__utma=XXXXXXXX.XXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXXX.XXX’,'__utmz=XXXXXXXXXX.XXXXXXXXXX.XX.X.utmccn=(referral)|utmcsr=uk.cj.com|utmcct=/|utmcmd=referral’,'__utmb=xxxxxxxxx’,'__utmc=xxxxxxxxxx’,'CONTID=XXXXXX’,'cjuMember=0′,’JSESSIONID=XXXXXXXXXX’);

    $id = “id”;
    $pw = “password”;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, “https://members.cj.com/member/publisher/home.do”);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_FAILONERROR, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, “uname=$id&pw=$pw&nextpage=&go=Go”);
    curl_setopt($curl, CURLOPT_COOKIE, implode(’; ‘,”$logincookie”));
    curl_setopt($curl, CURLOPT_COOKIEJAR, “cjcookiefile.txt”);
    curl_setopt($curl, CURLOPT_COOKIEFILE, “cjcookiefile.txt”);
    curl_setopt($curl, CURLOPT_USERAGENT, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”);
    curl_exec ($curl);
    curl_close ($curl);

    He probado modificando este codigo como he querido agregando y quitando opciones pero no me sale. Cambie los valores aqui, incluso de la cookie porque no se si son datos que se deban compartit.

    Me podrian ayudar a obtener paginas automaticamente que estan dentro de mi sesion.

    Gracias de antemano.

    Reinaldo.

  14. Juan Manuel Ha dicho:
    26 de Junio del 2008 a las 0:39

    Yo estoy probando esta funcion, lo que quiero es capturar la imagen de una url, y copiar esa imagen en mi servidor web pero no lo consigo he probado vuestro script y mogollon de ellos, modificandolos, ect

    Si alguien mi puede ayudar escribirme en mi correo info@posicionempresarial.es

    Tengo este script pero no consigo que copie nada, lo que me hace que me crea un archivo desconocido

    function recibe_imagen ($url,$archivo_destino){
    $mi_curl = curl_init ($url);
    $fs_archivo = fopen (”logo_plains.png”, “w”);
    curl_setopt ($mi_curl, CURLOPT_FILE, $fs_archivo);
    curl_setopt ($mi_curl, CURLOPT_HEADER, 0);
    curl_exec ($mi_curl);
    curl_close ($mi_curl);
    }

    muchas gracias por su tiempo y su colaboración

    http://www.posicionempresarial.es/
    http://www.d-w-m.es/

  15. George el Ermitaño Ha dicho:
    12 de Julio del 2008 a las 23:46

    Que tal, copie este codigo y lo utilizo como recurso potente en mi web http://www.yoggisms.com: Siempre hay que sobresaltar las cosas buena

Deja un comentario

Zumbe.net es administrado por WordPress
Puedes suscribirte a las Entradas (RSS) o los Comentarios (RSS).
Esta obra se encuentra bajo una licencia de Creative Commons.