jueves, 27 de enero de 2011

Obtener los tweets un usuario

En está ocasión de una manera sencilla vamos a obtener los ultimos mensajes de un usuario que llamaremos usuariox en Twitter:

Como recordaremos en el capitulo anterior de como usar CURL para acceder a los datos de una URL EXTERNA, usaremos nuestra funcion file_get_contents_curl para acceder a los ultimos tweets de usuariox de la siguiente manera:
//nuestra función del artículo anterior:
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }
//Aquí la usamos:
$jsont = file_get_contents_curl("http://twitter.com/statuses/user_timeline/usuariox.json");
$jsont = json_decode($jsont, true);
//echo $json[0]['text'];

// or display last 3
for($i=0; $i < 3 && isset($jsont[$i]); $i++) {
echo $jsont[$i]['text']."
";
}
Pero queremos mostrar como links los http, entonces haremos esto:
//con este metodo cambiaremos todos los link como http o mailto a enlaces.
function make_links_blank($text)
{
  return  preg_replace(
     array(
       '/(?(?=]*>.+<\/a>)
             (?:]*>.+<\/a>)
             |
             ([^="\']?)((?:https?|ftp|bf2|):\/\/[^<> \n\r]+)
         )/iex',
       '/]*)target="?[^"\']+"?/i',
       '/]+)>/i',
       '/(^|\s)(www.[^<> \n\r]+)/iex',
       '/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+)
       (\\.[A-Za-z0-9-]+)*)/iex'
       ),
     array(
       "stripslashes((strlen('\\2')>0?'\\1\\2\\3':'\\0'))",
       '',
       "stripslashes((strlen('\\2')>0?'\\1\\2\\3':'\\0'))",
       "stripslashes((strlen('\\2')>0?'\\0':'\\0'))"
       ),
       $text
   );
}
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }
//Aquí la usamos:
$jsont = file_get_contents_curl("http://twitter.com/statuses/user_timeline/usuariox.json");
$jsont = json_decode($jsont, true);
//echo $json[0]['text'];

// or display last 3
for($i=0; $i < 3 && isset($jsont[$i]); $i++) {
echo make_links_blank($jsont[$i]['text'])."
";
}

domingo, 23 de enero de 2011

file_get_contents vs curl

A más de uno os habrá pasado que su servidor emite un warning al usar file_get_contents("URL_EXTERNA"), y es que esta función interna de PHP, expone una vulnerabilidad a la seguridad de tu aplicación web, en PHP 5 no es posible cambiar el valor de esta a on en .htaccess, tendrías que tener acceso al php.ini del servidor.
La vulnerabilidad trabaja de la siguiente manera:
_ Al usar esta función para recuperar datos desde ubicaciones remotas como un servidor FTP o sitio web y no hacer el filtro apropiado al pasar los datos, dejas abierta tu aplicación a una muy posible inyección de código.

Recomendaciones

Usted debe desactivar allow_url_fopen en el archivo php.ini:

Deshabilitar allow_url_fopen por razones de seguridad
allow_url_fopen = 'off'

Esta configuración tambien debe ser deshabilitada en apache httpd.conf

# Deshabilitar allow_url_fopen por razones de seguridad
php_flag allow_url_fopen off php_flag allow_url_fopen off


Te quedan 2 cosas por hacer:
1) O habilitas file_get_contents en el servidor con su consiguiente vulnerabilidad.
2) O usas CURL o HTTP, para acceder a contenidos de URL externa.

Recomiendo usar CURL por estas razones:
1) Es un promedio de 39% más rapido como se ve aqui.

2) Es seguro por que viene integrado con metodos internos de seguridad.

Ahora que tal vez hayas decidido decidido usar CURL te preguntaras ¿como lo hago?, ¿qué es eso?:
Acerca de CURL puedes Googlear y encontrarás mucha info de él.
Ahora vamos a usarlo.

Primero tu servidor debe de tener el módulo CURL instalado, la mayoría de servidores Apache vienen con CURL activado, si usas IIS verifica que lo tengas instalado.

Luego usarlo en tu código de esta manera:
//Puedes usarlo en una clase Helper o en una función como en el ejemplo
 
function file_get_contents_curl($URL)
    {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        curl_close($c);

        if ($contents) return $contents;
            else return FALSE;
    }

//Modo de uso:

$result=file_get_contents_curl("http://www.example.com");
if ($result === false)
{
    // treat error
} else {
    // handle good case
} 

Saludos.