Algo que echo en falta de PHP es la posibilidad de saber en qué porcentaje se ha subido un fichero (por ejemplo para mostrar una barra de progreso), algo que si permiten otros lenguajes de programación.
Para poder realizarlo en PHP es necesario tener instalado APC, que mediante el parámetro APC_UPLOAD_PROGRESS permite monitorizar el progreso del upload.
El tutorial explica muy detalladamente cómo realizar un file uploader en PHP, explicando los siguientes aspectos: instalación de APC, cómo monitoriza APC, clases de PHP básicas, implementación del uploader y ampliación de las clases para mostrar el progreso. Monitoring File Uploads using Ajax and PHP
$app_id = 'xxxxxx';
$canvas_page = 'http://apps.facebook.com/xxxx/';
$client_secret = 'xxx';
$app_token = 'access_token_de_la_aplicacion';
$this->load->library('curl');
// Creo 100 usuarios
for ($i=0; $i<100; $i++) {
$usuario = $this->curl->simple_post('https://graph.facebook.com/'.$app_id.'/accounts/test-users?installed=true&permissions=read_stream', array('access_token' => $app_token));
}
// Los recupero
$usuarios = $this->curl->simple_get('https://graph.facebook.com/'.$app_id.'/accounts/test-users?installed=true&permissions=read_stream&access_token='.$app_token);
$usuarios = json_decode($usuarios);
foreach($usuarios->data as $i=>$u) {
// Hago que el primer usuario (que sera el que use) sea amigo de todos
if ($i==0) {
$ppal = $u;
} else {
// Hago un dump para saber si se ha creado bien la amistad
var_dump($this->curl->simple_post('https://graph.facebook.com/'.$ppal->id.'/friends/'.$u->id, array('access_token' => $ppal->access_token)));
var_dump($this->curl->simple_post('https://graph.facebook.com/'.$u->id.'/friends/'.$ppal->id, array('access_token' => $u->access_token)));
}
}
IMDBPHP es una librería PHP que nos permite acceder a la API de IMDB y así poder obtener datos sobre series y películas para nuestras aplicaciones web, como por ejemplo un plugin para WordPress.
Para aquellos que quieren hacer uso de Foursquare mediante su API, les puede interesar este artículo que hace uso de la librería OAuth, en el que se explica paso a paso como dar de alta la aplicación dentro de Foursquare y todo lo necesario para acceder a la API.
Para mí, uno de los mayores fracasos de Twitter es su API, una limitación de su uso increíble para algo que le podría dar mucho juego a la aplicación. Ahora mismo no sé en cuánto está el límite, pero la posibilidad de realizar una aplicación basada en Twitter es una pesadilla.
Para aquellos que no quieran sufrir lo que hemos sufrido con TwitterPoster (los espacios en blanco es porque la gente actualiza su imagen y no podemos recuperar la de todos los usuarios por el límite en el API de Twitter), les recomiendo usar Twitter mediante CURL.
Os paso un script sencillito que he realizado:
<?php
// Primer hacemos login
$url ="https://twitter.com/sessions";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
// Por si tienen limitación por navegador
curl_setopt($ch, curlOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)");
// Poned una ruta para las cookies
curl_setopt ($ch, CURLOPT_COOKIEJAR, '/temp/');
curl_setopt ($ch, CURLOPT_COOKIEFILE, '/temp/');
curl_setopt ($ch, CURLOPT_POSTFIELDS, "username_or_email=[usuario]&password=[contraseña]");
// Para que funcione el https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, curlOPT_SSL_VERIFYHOST, 2);
curl_exec ($ch);
// Cargamos el home, porque Twitter añade dos campos ocultos para poder publicar por web
$url ="http://twitter.com/home";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec ($ch);
// Recuperamos los campos ocultos
preg_match('//', $result, $match);
$authenticity_token = $match[1];
preg_match('//', $result, $match);
$siv = $match[1];
// Insertamos el texto
$res = $url ="http://twitter.com/status/update";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'siv='.$siv.'&authenticity_token='.$auth.'&status=[texto]');
curl_exec ($ch);
curl_close ($ch);
unset($ch);
?>
¿Qué fallo tiene este script? pues que si cambian el HTML (campos de formulario, …) o las URLs deja de funcionar, pero al menos no tenemos limitaciones. Eso sí, es más costoso para sus servidores y para los nuestros, porque en vez de hacer una llamada, hacemos 3, y en nuestro caso, a parte parseamos una página para obtener dos campos ocultos.
No es la primera vez que me toca buscar malware en algún WordPress, y la verdad, suele ser un dolor de cabeza. Básicamente usan dos funciones: eval y base64_decode. Con eval nos meterán el código malicioso, que estará codificado en base64 para evitar que lo encontremos fácilmente.
Si tenéis acceso al SSH del servidor, una llamada a find . -name '*.php' -exec grep -l 'base64' {} \; suele bastar para encontrar este tipo de llamadas, o buscar eval en vez de base64.
Desgraciadamente esto no siempre funciona, ya que la función eval puede estar codificada de la siguiente forma:
Otro punto a tener en cuenta es la posibilidad de que hayan modificado el código de nuestro WordPress, lo cual se puede solucionar reinstalando el WP desde el admin. Aunque también pueden haber modificado el wp-config.php e incluir un fichero php que aparenta ser de WP (normalmente metindo en la carpeta wp-includes) pero que no lo es. Por lo cual es recomendado comprobar el wp-config.php con cualquier versión en local.
A parte de todo esto, es importante el tema de los permisos de los ficheros, etc…
Actualización 29/05/2015: también es aconsejable buscar esta cadena \142\x61\163\145\66\x34\x5f\144\x65\143\x6f\144\145, ya que al hacer un echo nos devuelve la función base64_decode.
Actualización 02/07/2015: buscar también la cadena \x65\x76\x61\x6c, ya que devuelve la función eval.