viernes, 26 de marzo de 2010

Presentación: Chivato Tuenti 0.1.1 By ZeYt

Hoy lanzo la fase beta del programa que te avisa de las actualizaciones del Tuenti. Estamos  buscando fallos y tratándolos. Deja mucho que desear pero es mi primer programa que libero para el publico en general. He intentado craer el típico DEB pero es la de Dios, literalmente, más de una hora para hacerlo...

En cualquier caso he creado un script instalador para debian y ubuntu. Las instrucciones a continuación.

  • wget http://www.mma-clips.com/zeyt/chivato-tuenti/instalador.run
  • chmod u+x instalador.run
  • ./instalador.run
Una vez introducida la contraseña nos instalará las dependencias. Procederá a crear y mover los archivos. Nos pedirá nuestro usuario y contraseña y abrirá el programa encargado de añadir las tareas programadas. Añadiremos una tarea cada minuto que ejecutará el siguiente comando: chivato-tuenti


Se aceptan, comentarios y sugerencias. Esta en fase BETA, no me hago responsable de nada.

jueves, 25 de marzo de 2010

PHP, Curl, Tuenti, Login, Parser - Notificador de tuenti.



Bueno seguimos trabajando un poco en el proyecto y vamos sacando cosillas y corrigiendo fallos. Aquí os traigo la otra versión del tuenti.php.
El archivo clase_tuenti.php no será necesario para esta implementación.

Ya no será necesario la librería zenity ya que usaremos la notificación de señales de Ubuntu y GNOME, conocida como libnotify.
Para instalarla:
  • sudo apt-get install libnotify-bin
Repasamos pues todas las dependencias:
  • sudo apt-get install php5-cli
  • sudo apt-get install php5-curl
  • sudo apt-get install gnome-scheduler
  • sudo apt-get install libnotify-bin
Archivos necesarios:
Dentro de la carpeta que quieras # Recomendadio /home/usuario/Tuenti
ico.png # Icono con imagen del tuenti o lo que quieras.
tuenti.php
Como instalarlo:
Una vez tengas los 2 archivos, (recuerda modificar los capos en rojo en tuenti.php por tus datos del tuenti y la carpeta donde lo ejecutes), creamos una tarea programada que se ejecute cada minuto en Aplicaciones > Herramientas del sistema > Tareas programadas
El comando a ejecutar es php /home/tuusuario/Tuenti/tuenti.php
Si todo ha salido bien, cada vez que recibas una visita o tengas algún mensaje nuevo, te aparecerá un mensaje por pantalla informándote de todo.
<?php
/*
*      tuenti.php
*    
*      Copyright 2010 Eduardo Ramirez Martinez-Esparza <zeyt@ZeYt>
*    
*      This program is free software; you can redistribute it and/or modify
*      it under the terms of the GNU General Public License as published by
*      the Free Software Foundation; either version 2 of the License, or
*      (at your option) any later version.
*    
*      This program is distributed in the hope that it will be useful,
*      but WITHOUT ANY WARRANTY; without even the implied warranty of
*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*      GNU General Public License for more details.
*    
*      You should have received a copy of the GNU General Public License
*      along with this program; if not, write to the Free Software
*      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
*      MA 02110-1301, USA.
*/

//CONFIG
    $usermail = "example@example.com";
    $password = "example";
    $ruta = "/home/tuusuario/Tuenti/";
    $archivo_visitas = "visitas.txt";
    $cookie = "cookie.txt";
    $opcion_mostrar_visitas = TRUE;
//CONFIG

   
    function login($usermail, $password, $tcookie){
        $ch= curl_init();
        curl_setopt ($ch, CURLOPT_URL, "https://www.tuenti.com/?m=login&func=do_login");
        curl_setopt ($ch, CURLOPT_POSTFIELDS, "email=$usermail&input_password=$password&timezone=1");
        curl_setopt ($ch, CURLOPT_POST, 1);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt ($ch, CURLOPT_COOKIEFILE, $tcookie);
        curl_setopt ($ch, CURLOPT_COOKIEJAR, $tcookie);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.5) Gecko/20091105 Fedora/3.5.5-1.fc11 Firefox/3.5.5");
        $res=curl_exec ($ch);
        curl_close($ch);
        return $res;
    }

    function consult($url,$tcookie){
        $ch= curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt ($ch, CURLOPT_COOKIEFILE, $tcookie);
        curl_setopt ($ch, CURLOPT_COOKIEJAR, $tcookie);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.5) Gecko/20091105 Fedora/3.5.5-1.fc11 Firefox/3.5.5");
        $res = curl_exec ($ch);
        curl_close($ch);
        return $res;
    }
  
    $resultado = consult("http://www.tuenti.com/?m=home&func=view_home",$cookie);
  
  if ((eregi("<h1>La sesión ha caducado",$resultado)) || (eregi("Por favor, introduce tu e-mail y contrase&ntilde;a de Tuenti para entrar.",$resultado))){
        $login=login($usermail, $password,$cookie);
        $resultado = consult("http://www.tuenti.com/?m=home&func=view_home",$cookie);
    }
  
    $info = explode("<ul>",$resultado);
    $info = explode("</ul>",$info[1]);
    $info = $info[0];
    $info = str_replace("</li>","</li>\n",$info);
  
    if (eregi('<div class="eventImage"',$info)){
            $info ="";
    }
    $info = strip_tags($info);
  
    if ($opcion_mostrar_visitas){
        $trozos = explode('<div class="views"><strong>',$resultado);
        $trozos = explode('</strong>',$trozos[1]);
        $visitas = $trozos[0];
        $visitas = str_replace(".","",$visitas);
       
        if (file_exists($archivo_visitas)){
            $f = fopen($archivo_visitas,"r");
            $visitas_old = fread($f,filesize($archivo_visitas));
            fclose($f);
        }else{
            $f = fopen($archivo_visitas,"w");
            fclose($f);
            $visitas_old = 0;
        }
       
        $mostrar_visitas = FALSE;
       
        if ($visitas>$visitas_old){
            $f = fopen($archivo_visitas,"w");
            fwrite($f,$visitas);
            fclose($f);
            $total = $visitas-$visitas_old;
            $mostrar_visitas = TRUE;
            $imprime_visitas = "Has tenido ". $total ." visitas nuevas. Totales: ".$visitas;
        }
    }
        $titulo = "Notificaciones tuenti:";
    if ($info != ""){
        exec('notify-send -t 2500 "'.$titulo.'" "'. $info .'" -i "'.$ruta.'ico.png" &');
    }
    if ($opcion_mostrar_visitas && $mostrar_visitas){
        exec('notify-send -t 2500 "'.$titulo.'" "'. $imprime_visitas .'" -i "'.$ruta.'ico.png" &');
    }
?>

miércoles, 24 de marzo de 2010

PHP - Curl a Tuenti (Versión Modificada)

Necesitarás lo mismo que la versión anterior. Esta es la versión actualizada de tuenti.php que cuenta además el cambio en el número de visitas. Recuerda modificar los campos en rojo.
<?php
/*
 *      tuenti.php
 *     
 *      Copyright 2010 Eduardo Ramirez Martinez-Esparza <zeyt@ZeYt>
 *     
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *     
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *     
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

    //MODIFICALO
    $usermail = "example@example.com";
    $password = "tucontraseña";
    $ruta = "/home/TuUsuario/Tuenti/";
    function login($usermail, $password){
        $tcookie="cookie.txt";
        $ch= curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://www.tuenti.com/?m=login&func=do_login");
        curl_setopt ($ch, CURLOPT_POSTFIELDS, "email=$usermail&input_password=$password&timezone=1");
        curl_setopt ($ch, CURLOPT_POST, 1);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt ($ch, CURLOPT_COOKIEFILE, $tcookie);
        curl_setopt ($ch, CURLOPT_COOKIEJAR, $tcookie);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.5) Gecko/20091105 Fedora/3.5.5-1.fc11 Firefox/3.5.5");
        $res=curl_exec ($ch);
        curl_close($ch);
        return $res;
    }

    function consult($url){
        $tcookie="cookie.txt";
        $ch= curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt ($ch, CURLOPT_COOKIEFILE, $tcookie);
        curl_setopt ($ch, CURLOPT_COOKIEJAR, $tcookie);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.5) Gecko/20091105 Fedora/3.5.5-1.fc11 Firefox/3.5.5");
        $res = curl_exec ($ch);
        curl_close($ch);
        return $res;
    }
   
    $login=login($usermail, $password);
    $resultado = consult("http://www.tuenti.com/?m=home&func=view_home");
    $trozos = explode('<div class="views"><strong>',$resultado);
    $trozos = explode('</strong>',$trozos[1]);
    $visitas = $trozos[0];
    if (file_exists("visitas.txt")){
        $f = fopen("visitas.txt","r");
        $visitas_old = fread($f,filesize("visitas.txt"));
        fclose($f);
    }
    else{
        $f = fopen("visitas.txt","w");
        fclose($f);
        $visitas_old = 0;
    }
    $mostrar_visitas = FALSE;
    if ($visitas>$visitas_old){
        $f = fopen("visitas.txt","w");
        fwrite($f,$visitas);
        fclose($f);
        $total = $visitas-$visitas_old;
        $mostrar_visitas = TRUE;
        $imprime_visitas = "Has tenido ". $total ." visitas: ".$visitas;
    }
    require_once("clase_tuenti.php");
    $imprime = "Notificaciones tuenti:\n";
    $con = new tuentiAPI($usermail, $password);
    $r = $con->request('getUserNotifications', array());
    $salto=FALSE;
    if ($r['unread_friend_messages']['count'] > 0){
            $imprime .= "Privados de amigos: ".$r['unread_friend_messages']['count']."\n";
            $salto=TRUE;
    }
    if ($r['unread_spam_messages']['count'] > 0){
        $imprime .= "Mensajes de desconocidos: ".$r['unread_spam_messages']['count']."\n";
        $salto=TRUE;
    }
    if ($r['new_profile_wall_posts']['count'] > 0){
        $imprime .= "Comentarios: ".$r['new_profile_wall_posts']['count']."\n";
        $salto=TRUE;
    }   
    if ($r['new_friend_requests']['count'] > 0){
        $imprime .= "Peticiones de amigo: ".$r['new_friend_requests']['count']."\n";
        $salto=TRUE;
    }
    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";
        $salto=TRUE;
    }
    if ($r['new_event_invitations']['count'] > 0){
        $imprime .= "Eventos: ".$r['new_event_invitations']['count'];
        $salto=TRUE;
    }
    if ($salto){       
        exec('zenity --info --window-icon="'.$ruta.'ico.png" --text "'. $imprime .'" --timeout 20 &');
    }
    if ($mostrar_visitas){
        exec('zenity --notification --window-icon="'.$ruta.'ico.png" --text "'. $imprime_visitas .'" --timeout 40 &');
    }
?>

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!