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
-
Warning: PDO [2002] Argumento inválido Publicado por Sampedro el día 02/03/2010
Guardado en Desarrollo -
Como mostrar acentos en HTML Publicado por Sampedro el día 16/02/2010
Guardado en Desarrollo -
Dibujar figuras en PHP GD Publicado por Sampedro el día 01/02/2010
Guardado en Desarrollo, Php -
Benchmark de PHP Publicado por Sampedro el día 12/01/2010
Guardado en Desarrollo -
Crear imágenes en Html mediante Php GD Publicado por Sampedro el día 05/01/2010
Guardado en Desarrollo