lunes, 22 de marzo de 2010

PHP + Shell + Zenity = Monitor Acciones Tuenti


Perdón a todos por la falta de actualización. Los temas se me han acabado literalmente y no recibo nuevas preguntas. Podría hablar de varios juegos y temas muy dispares como las actualizaciones pero hasta Abril no hay versión nueva por lo que nos toca esperar.

En cualquier caso, he estado trasteando con varios lenguajes y aprendiendo varias cosas. Me hubiera gustado traeros un monitor de actualizaciones de tuenti a la altura pero vamos, estamos en versión alpha y hemos usado varias herramientas, todo muy rudimentario.

En cualquier caso, aquí os traigo la explicación de lo que necesitamos:
  • sudo apt-get install php5-cli
  • sudo apt-get install php5-curl
  • sudo apt-get install gnome-schedule
  • sudo apt-get install zenity
Bien, usaremos PHP para trabajar con la API privada de tuenti que han revelado con una clase muy sencilla.
Para todo esto, crearemos en nuestro directorio personal una carpeta llamada Tuenti que contendrá lo siguiente:
clase_tuenti.php
<?php
/*
* tuentiAPI Class
* Sergio Cruz aka scromega (scr.omega at gmail dot com) http://scromega.net
*
* More info:
* http://scromega.net/7-accediendo-a-la-api-cerrada-de-tuenti.html
*/

class tuentiAPI {
    private $email, $password, $userData;
    function __construct($email, $password) {
        $this->email = $email;
        $this->password = $password;
        $tmp = $this->json('getChallenge', array('type'=>'login'));
        $tmp = self::http($tmp);
        $tmp = json_decode($tmp, true);
        $passcode = md5($tmp[0]['challenge'].md5($password));
        $appkey = 'MDI3MDFmZjU4MGExNWM0YmEyYjA5MzRkODlmMjg0MTU6MC4xMzk0ODYwMCAxMjYxMDYwNjk2';
        $tmp = $this->json('getSession', array('passcode'=>$passcode,'application_key'=>$appkey,'timestamp'=>$tmp[0]['timestamp'],'seed'=>$tmp[0]['seed'],'email'=>$email));
        $tmp = self::http($tmp);
        $tmp = json_decode($tmp, true);
        $this->userData = $tmp[0];
    }
    private static function http($post) {
        $headers[] = "Content-length: ".strlen($post)."\r\n";
        $headers[] = $post;
        $ch = curl_init('http://api.tuenti.com/api/');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        $result = curl_exec($ch);
        if($result === false) die('Cannot execute request: '.curl_error($ch));
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $result;
    }
    private function json($method, $parameters) {
        $array['requests'][0][0] = $method;
        $array['requests'][0][1] = $parameters;
        if(!empty($this->userData['session_id'])) {
            $array['session_id'] = $this->userData['session_id'];
        }
            $array['version'] = '0.4';
        return json_encode($array);
    }
    public function request($method, $parameters=array()) {
        $tmp = $this->json($method, $parameters);
        $tmp = self::http($tmp);
        $tmp = json_decode($tmp, true);
        return $tmp[0];
    }
}
?>
tuenti.php
<?php

    require_once("clase_tuenti.php");
    $con = new tuentiAPI('tudirecciondemail@example.com', 'tupassword');
    $r = $con->request('getUserNotifications', array());

    $imprime = "Notificaciones tuenti:\n";
    $salto=FALSE;
    foreach ($r as $dato){
            if ($dato['count'] > 0){
                $salto=TRUE;
            }
    }
    if ($r['unread_friend_messages']['count'] > 0){
            $imprime .= "Mensajes de amigos: ".$r['unread_friend_messages']['count']."\n";
    }
    if ($r['unread_spam_messages']['count'] > 0){
        $imprime .= "Mensajes de desconocidos: ".$r['unread_spam_messages']['count']."\n";
    }
    if ($r['new_profile_wall_posts']['count'] > 0){
        $imprime .= "Comentarios: ".$r['new_profile_wall_posts']['count']."\n";
    }   
    if ($r['new_friend_requests']['count'] > 0){
        $imprime .= "Peticiones de amigo: ".$r['new_friend_requests']['count']."\n";
    }
    if ($r['new_photo_wall_posts']['count'] > 0){
        $imprime .= "Fotos etiquetadas: ".$r['new_photo_wall_posts']['count']."\n";
    }
    if ($r['new_photo_wall_posts']['count'] > 0){
        $imprime .= "Comentarios en fotos: ".$r['new_photo_wall_posts']['count']."\n";
    }
    if ($r['new_tagged_photos']['count'] > 0){
        $imprime .= "Fotos etiquetadas: ".$r['new_tagged_photos']['count']."\n";
    }
    if ($r['new_event_invitations']['count'] > 0){
        $imprime .= "Eventos: ".$r['new_event_invitations']['count'];
    }
    if ($salto){       
exec('zenity --info --window-icon="/home/TuUsuario/Tuenti/favicon.20425.png" --text "'. $imprime .'" --timeout 20');
    }
?>
Logotipo de favicon de tuenti. Podéis descargalo con el siguiente comando:
  • wget http://estaticos2.tuenti.com/layout/web2/images/favicon.20425.png
 Bien, ahora iremos a Aplicaciones > Herramientas del Sistema > Tareas programadas y añadiremos la siguiente:
Descripción: Tuenti Monitor
Comando: php "/home/TuUsuario/Tuenti/tuenti.php"
Básico: Cada minuto

Aceptaremos y a partir de ahora si lo hemos hecho bien nos aparecerá una ventana notificándonos las actualizaciones.

Si te resultara muy molesto el tipo de advertencia lo puedes cambiar por un icono en el área de notificaciones. Para ello en tuenti.php habría que modificar la línea del exec y dejarla así:
exec('zenity --notification --window-icon="/home/TuUsuario/Tuenti/favicon.20425.png" --text "'. $imprime .'" --timeout 20');
Por último recapitulemos. Necesitamos 2 archivos en php y un archivo png. Para poder ejecutar todo bien necesitaremos lo que arriba describí. Todos los archivos deberán ir dentro de la carpeta Tuenti que irá dentro de la carpeta de usuario.

Todo lo que está en color rojo tendrá que ser modificado por ti para poder usarlo. TuUsuario en mi caso por -> zeyt y en tuenti.php tu usuario y contraseña para tuenti.

Si tienes alguna pregunta no dudes en comentar y si quieres dar el salto y crear la aplicación en PyGtk, bienvenido seas!


7 comentarios:

  1. Cómo puedo saber mi session_id??
    es porque quiero usar jabber para conectarme al chat del tuenti sin tener que abrirlo

    ResponderEliminar
  2. Hola, yo también ando trabajando en algo parecido. Para saber cual es tu sssid primero conectate con curl. Abre la cookie y coge con explode el id.

    Así mismo parsea el html para coger el servidor de jabber de tuenti. Avsame como vas en tu proyecto que me interesa ;)

    ResponderEliminar
  3. ein?
    como puedo conectarme con curl?
    esk puse "getSession" y dice "getSession no es válida para la version del API" y me dice "Error 303"

    ResponderEliminar
  4. si tengo todo, tengo mi user_id ( lo consigues entrando en tu perfil desde otro usuario)el xmpp2.tuenti.com, PERO LA CONTRASEÑA DEL JABBER ES EL SESSION_ID!

    ResponderEliminar
  5. Yo al final dejé de usar la API, no me gustó. http://donzeyt.blogspot.com/2010/03/presentacion-chivato-tuenti-by-zeyt.html -> Aquí me conecto con curl y cojo lo que quiero (es cutre pero funciona, basate en esta)

    ResponderEliminar
  6. y si no te molesta, como puedo andar con el curl??
    por favor!!
    :3

    ResponderEliminar
  7. ¿Por algún casual sabrías la llamada para devolver todos los contactos de Tuenti?

    ResponderEliminar