rutarelativa

Total de entradas publicadas: 417

Curl en PHP

votar

Hace poco realizamos una función Curl para Python, ya que teníamos la necesidad de realizar peticiones a una página Web en dicho lenguaje. En todos los servidores no tenemos la posibilidad de usar Python por ello hemos trasladado la función a otro lenguaje más Universal como es PHP. La función Curl para PHP es muy parecida, aunque le hemos añadido unas cuantas mejoras.

Función Curl para PHP

function followLocation($crCurl, &$crInfo)
{
    // Variables
    static $nCurlLoops = 0;
    $nCurlMaxLoops     = 20;

    $sPage             = null;
    $aMatches          = null;
    $aLastUrl          = null;
    $aUrl              = null;
    $sHeader           = null;


    // Si hemos realizado 20 redirecciones paramos

    if( $nCurlLoops >= $nCurlMaxLoops )
        return false;

    // Obligamos que la petición nos nuestre la cabecera para poder ver donde nos llevara la redireccion

    curl_setopt( $crCurl, CURLOPT_HEADER, 1 );

    // Ejecutamos curl
    $sPage = curl_exec( $crCurl );

    // Obtenemos información sobre la petición

    $crInfo = curl_getinfo( $crCurl );

    // Separamos la cabecera de lo que esl contenido de la página

    list( $sHeader, $sPage ) = explode( "\n\n", $sPage, 2 );

    if( in_array( $crInfo["http_code"], array( 301, 302 ) ) )

    {
        // Obtenemos la dirección donde se iba a realizar la redicción
        $aMatches = array();
        preg_match( "/Location:(.*?)\n/", $sHeader, $aMatches );

        $aUrl = @parse_url( trim( array_pop( $aMatches ) ) );

        // Comprobamos sea un array valido, de no serlo no podremos realizar la redirección

        if( ! is_array( $aUrl) )
            return $sPage;

        // Obtenemos desde donde se va hacer la redirección
        $aLastUrl = parse_url( curl_getinfo( $crCurl, CURLINFO_EFFECTIVE_URL ) );


        // Contruimos la url de la redirección
        if( ! $aUrl["scheme"] )
            $aUrl["scheme"] = $aLastUrl["scheme"];


        if( ! $aUrl["host"] )
            $aUrl["host"] = $aLastUrl["host"];

        if( ! $aUrl["path"] )

            $aUrl["path"] = $aLastUrl["path"];

        // Realizamos la petición con la nueva URL obtenida que sera la redicción

        curl_setopt( $crCurl, CURLOPT_URL, $aUrl["scheme"] . "://" . $aUrl["host"] . $aUrl["path"] . ($aUrl["query"]? "?" . $aUrl["query"] : "") );


        // Sumamos la redirección
        ++$nCurlLoops;

        return followLocation( $crCurl, $crInfo);
    }
    else
    {
        $crInfo["redirect_count"] = $nCurlLoops;

        return $sPage;
    }
}


function curl($aArgumentos, &$crInfo = false)
{
    // Variables
    $sUrl        = (! empty( $aArgumentos["url"] ) ? $aArgumentos["url"] : null);

    $sPostField  = (! empty( $aArgumentos["post"] ) ? http_build_query( $aArgumentos["post"] ) : null);
    $ckCookie    = (! empty( $aArgumentos["cookie"] ) ? $aArgumentos["cookie"] : null);

    $nHeader     = (! empty( $aArgumentos["header"] ) ? $aArgumentos["header"] : 0);
    $nReturn     = (! empty( $aArgumentos["return_transfer"] ) ? $aArgumentos["return_transfer"] : 1);

    $nTimeOut    = (! empty( $aArgumentos["time_out"] ) ? $aArgumentos["time_out"] : 30);
    $sAgent      = (! empty( $aArgumentos["agent"] ) ? $aArgumentos["agent"] : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8");

    $sReferer    = (! empty( $aArgumentos["referer"] ) ? urlencode( $aArgumentos["referer"] ) : "-");

    $aReferer    = (! empty( $aArgumentos["aReferer"] ) ? $aArgumentos["aReferer"] : array() );
    $aProxys     = (! empty( $aArgumentos["proxy"] ) ? $aArgumentos["proxy"] : array() );

    $sUserPasswd = (! empty( $aArgumentos["user_passwd"] ) ? $aArgumentos["user_passwd"] : null);
    $aProxy      = null;

    $nRandom     = null;
    $crCurl      = curl_init();
    $sPage       = null;
    $aHeader     = array( "Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg", "Connection: Keep-Alive", "Content-type: application/x-www-form-urlencoded;charset=UTF-8" );

    $nRandomRf   = null;


    // Comprobamos si nos han pasado un array con referers para modificar el referer

    if( count( $aReferer ) )
    {
        // Referer aleatorio
        $nRandomRf = rand( 0, count( $aReferer ) -1 );

        $sReferer  = str_replace( "[curl_text]" , $sReferer, $aReferer[$nRandomRf] );
    }

    // Opciones
    curl_setopt( $crCurl, CURLOPT_URL, $sUrl );
    curl_setopt( $crCurl, CURLOPT_HEADER, $nHeader );

    curl_setopt( $crCurl, CURLOPT_RETURNTRANSFER, $nReturn );
    curl_setopt( $crCurl, CURLOPT_HTTPHEADER, $aHeader );
    curl_setopt( $crCurl, CURLOPT_CONNECTTIMEOUT, $nTimeOut );
    curl_setopt( $crCurl, CURLOPT_REFERER, $sReferer );

    curl_setopt( $crCurl, CURLOPT_USERAGENT, $sAgent);

    if( $sUserPasswd )
        curl_setopt( $crCurl, CURLOPT_USERPWD, $sUserPasswd );

    if( count( $aProxys ) )

    {
        // Usamos un random para ir cambiando de proxys
        $nRandom = rand( 0, count( $aProxys ) - 1 );

        $aProxy  = explode( ":", $aProxys[$nRandom] );

        curl_setopt( $crCurl, CURLOPT_CONNECTTIMEOUT, 60 );

        curl_setopt( $crCurl, CURLOPT_PROXY, $aProxys[$nRandom] );

        curl_setopt( $crCurl, CURLOPT_HTTPPROXYTUNNEL, 0);
    }

    if( $sPostField )
    {
        curl_setopt( $crCurl, CURLOPT_POST, 1 );
        curl_setopt( $crCurl, CURLOPT_POSTFIELDS, $sPostField );

    }

    if( $ckCookie )
    {
        curl_setopt( $crCurl, CURLOPT_COOKIEJAR, $ckCookie );
        curl_setopt( $crCurl, CURLOPT_COOKIEFILE, $ckCookie );
    }

    // open basedir Or Safe Mode

    if( ini_get( "open_basedir" ) == "" && ini_get( "safe_mode" == "Off" ) )
    {
        curl_setopt( $crCurl, CURLOPT_FOLLOWLOCATION, 1 );

        $sPage = curl_exec( $crCurl );

        $crInfo = curl_getinfo( $crCurl );
    }
    else
        return followLocation( $crCurl, $crInfo );



    // Comprobamos si ha sido exitosa la conexion de no serlo volvemos hacerla
    if( ! in_array( $crInfo["http_code"], array( 200, 302, 301 ) ) )

        curl( $aArgumentos );

    // Si la conexión ha sido posible cerramos
    if( in_array( $crInfo["http_code"], array( 200, 302, 301 ) ) )

        curl_close( $crCurl );

    return( $sPage );
}

Argumentos para la función Curl

url:Dirección donde se realizará la petición por CURL.
post:Datos que se enviarán en una operación de tipo "HTTP POST". Debe ser pasado como una cadena 'para1 = val1 & para2 = val2 &...'.
cookie:Dirección donde se guardará la cookie, si se añade sólo el nombre se guardara en el directorio donde se ejecute el Script.
header:Mostrar la cabecera HTTP, por defecto 0.
return_transfer:Posibilidad de obtener el HTML de la petición. Por defecto 1.
time_out:Tiempo de espera para la petición. Por defecto 30.
agent:Contenido de "User-Agent:" para la cabecera en una petición HTTP. Por defecto 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8'.
referer:Contenido de "Referer:" para la cabecera en una petición HTTP. Por defecto '-'.
aReferer:Array con varios casos de 'Referer:'. Podríamos añadir todos las referencias de Google, Yahoo, etc. Así mostraría el referido como si viniera de unos de estos buscadores. Por defecto NULL.
proxy:Array con varias IP de servidores Proxy. Por defecto NULL.
user_passwd:Usuario y contraseña que se usarán para la conexión, con el formato USUARIO:PASSWORD. Por defecto NULL.

Ejemplo: Cambiar estado de Twitter mediante Curl

curl(array( "url"         => "http://twitter.com/statuses/update.json",
            "post"        => array( "status" => "Hola desde PHP!" ),

            "user_passwd" => "keldrox:password"
));

Una simple función Curl para PHP que nos ayudará a la hora de desarrollar scripts que necesiten realizar muchas peticiones. Ya que su simpleza enviando solo argumentos nos ayuda estar escribiendo muchas líneas de opciones para las peticiones Curl, aparte de tener un código más simple.

Enlace: Descargar Curl para PHP

Sobre el autor
Desarrollador en entornos web y Diseñador de profesión, muy activo, que busca siempre enfrentarse a retos cada vez más dificiles. Si un día no hago algo nuevo o no he superado alguna dificultad para mi es un día vacío. Cuento con dos titulaciones: Técnico en Explotación de Sistemas Informáticos y Técnico Superior en Desarrollo de Aplicaciones Informáticas. Fundé rutarelativa porque siempre quise tener un sitio en donde compartir mis experiencias profesionales y a los problemas que me enfrento día a día en el ámbito profesional. 178 articulos realizados por Sampedro
Articulos relacionados

Comentarios en Curl en PHP

Hasta el momento este artículo no tiene comentarios, sé el primero en comentar en él.

Trackback en Curl en PHP

Hasta el momento este artículo no tiene trackback.
Escribir comentarios

Últimos comentarios
  • Avatar del usuario Sampedro
    Sampedro Viendo la casa donde vive ya te puedes echar una idea de cuanto...
  • Avatar del usuario Sergio
    Sergio ¡Que bestialidad de video!. Aquí en Ruta Relativa hemos hablado ya...
  • Avatar del usuario Sergio
    Sergio Acabo de escuchar el disco Blood & Metal y he de decir que los...
  • Avatar del usuario Alber_h
    Alber_h Hombre, viendo entre sus ventajas fiestas glamurosas, cosas...
  • Avatar del usuario Alber_h
    Alber_h Dios es buenísimo xDDD Chof!
Al azar
Lo más visto
Lo más comentado
Subir
Mod Millenium Falcon sobre la Dreamcast http://bit.ly/9rToDI
Síguenos
Sobre

Sampedro Desarrollador en entornos web y Diseñador de profesión, muy activo, que busca siempre enfrentarse a retos cada vez más dificiles. Si un día no hago algo nuevo o no he superado alguna dificultad para mi es un día vacío. Cuento con dos titulaciones: Técnico en Explotación de Sistemas Informáticos y Técnico Superior en Desarrollo de Aplicaciones Informáticas. Fundé rutarelativa porque siempre quise tener un sitio en donde compartir mis experiencias profesionales y a los problemas que me enfrento día a día en el ámbito profesional.

Sergio Soy un desarrollador en entornos web y escritorio, entusiasta y amante de mi trabajo del que cada día espero aprender algo nuevo. Tengo una titulación de Técnico Superior en Desarrollo de Aplicaciones Informáticas y actualmente curso el primer año de Carrera Universitaria con el poco tiempo que me deja el trabajo. Fundé rutarelativa porque quiero que mi esfuerzo y tiempo invertidos en aprender y poner en práctica algo le resulte útil y fácil a otro usuario, del mismo modo que yo aprendo y ahorro tiempo con la ayuda de los demás.