Twitter con Kumbiaphp

De KumbiaPHP Framework Wiki
Revisión del 07:00 14 feb 2012 de Jamp (discusión | contribuciones)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)

Twitter con KumbiaPHP

Este tutorial es de como publicar un tweet desde una aplicación hecha por nosotros desde KumbiaPHP con algunas librerías externa.

Requisitos Previos

  • Tener una cuenta en Twitter.
  • Tener una aplicación creada en la página para desarrollados de Twitter con la que recibiran una llaves para utilizar en su aplicación.
  • Su aplicación debe poseer permisos minimos de lectura y escritura.
  • Por último y no menos importante unas excelentes librerías en PHP desarrolladas por el Señor Matt Harris, trabajador de Twitter. librerías que se encuentran en su cuenta de Github Aquí

Archivo de Configuración

Primero que todo creamos un archivo de configuración para nuestra aplicación para almacenar allí nuestras llaves para el manejo de servicio externos a KumbiaPHP, estoy también podemos verlo funcionando en el ejemplo de ACL Configurado a Traves de un Archivo ini, siguendo la estructura de archivos del Beta2 creamos apis.ini que estará ubicada en config

default/config/apis.ini

;; Configuracion de los APIs

; Archivo que contienen la llave de los APIs externo al KuCMS
; cada seccion contiene el servicio y los datos para su uso

[twitter]
consumerkey = xXxXxXxXxXxXxXxXxXxX ; Esto deben ser reemplazados por las propias de su aplicación
consumersecret = xXxXxXxXxXxXxXxXxXxXxXxXxXxX; Esto deben ser reemplazados por las propias de su aplicación

Controlador

Ahora vamos a crear un simple controlador para 3 acciones particulares como lo son:

  • Almacenar una cuenta de Twitter para nuestra aplicación (Dar permiso, obtener el user_token y user_secret)
  • Publicar Tweet
  • Y eliminar la cuenta almacenada
<?php

/**
 * Controlador para integrar Twitter a KumbiaPHP 
 * Recomiendo leer la documentación disponible en http://dev.twitter.com
 * y la de la libreria que usamos aquí en http://github.com/themattharris/tmhOAuth
 * Fecha 05/02/2012
 *
 * @author Jaro Marval (jamp) <jampgold@gmail.com>
 * @version 0.1
 */

class RedesController extends AppController {

    /**
     * Aqui verificamos la existencia de una identidad en base de datos, sino
     * procedemos a capturar una, todo esto basado en los ejemplos de la libreria
     * de Sr. Matt Harris en sus librerias
     * 
     */
    public function index() {

        // Leemos del Archivo de configuración el consumerkey y el consumersecret
        // de nuestra aplicación twitter
        $config = Config::read('apis', TRUE);
        $consumer_key = $config['twitter']['consumerkey'];
        $consumer_secret = $config['twitter']['consumersecret'];

        // Verificamos que tengamos una sesión guardada de usuario Twitter
        $this->twitterdata = Load::model('redes')->gettwitter();

        // Verificamos que no existe ninguna sesión guardada
        if (!$this->twitterdata) {

            // Cargamos las librerias necesarias para nuestra aplicación
            Load::lib('apis/twitter/tmhOAuth');
            Load::lib('apis/twitter/tmhUtilities');

            // Inicializamos la libreria de Twitter
            $tmhOAuth = new tmhOAuth(array(
                        'consumer_key' => $consumer_key,
                        'consumer_secret' => $consumer_secret,
                    ));

            // Definimos el sitio donde estamos usando nuestro código para luego
            // volver después de que iniciemos sesión de nuestro usuario
            $here = tmhUtilities::php_self();

            // Función para manejar los errores devueltos durante la autenticación
            // en Twitter
            function outputError($tmhOAuth) {
                echo 'Error: ' . $tmhOAuth->response['response'] . PHP_EOL;
                tmhUtilities::pr($tmhOAuth);
            }

            // Verificamos que las variables de acceso existan
            if (isset($_SESSION['access_token'])) {

                // Recogemos las sessión de Twitter y almacenamos en BBDD el
                // token y el token_secret del usuario autenticado
                $red->setTwitter($_SESSION['access_token']['oauth_token'], $_SESSION['access_token']['oauth_token_secret']);

                // Destruimos la variable de sesión
                unset($_SESSION['access_token']);

                // Redireccionamos al página de donde originalmente veniamos
                header("Location: {$here}");

            // Verficamos que la autenticación se halla llevado a cabo
            } elseif (isset($_REQUEST['oauth_verifier'])) {
                
                // Parametrizamos el user_token y el user_secret desde la sesión
                $tmhOAuth->config['user_token'] = $_SESSION['oauth']['oauth_token'];
                $tmhOAuth->config['user_secret'] = $_SESSION['oauth']['oauth_token_secret'];

                // Verificamos que el user_token y el user_secret sean correctos mediante oauth_verifier
                $code = $tmhOAuth->request('POST', $tmhOAuth->url('oauth/access_token', ''), array(
                    'oauth_verifier' => $_REQUEST['oauth_verifier']
                        ));

                // Si el user_token y user_secret son correctos y refrescamos la página
                if ($code == 200) {
                    $_SESSION['access_token'] = $tmhOAuth->extract_params($tmhOAuth->response['response']);
                    unset($_SESSION['oauth']);
                    header("Location: {$here}");
                    
                // Sino mostramos el error que no retorna
                } else {
                    outputError($tmhOAuth);
                }
            
            // Si no existe ninguna identidad guardada
            } else {
                
                // Parametrizamos el tipo de acceso de nuestra aplicacion
                $params = array(
                    'oauth_callback' => $here,
                    'x_auth_access_type' => 'write'
                );
                
                // Solicitamos a los servidores de Twitter un link valido para 
                // que nuestra aplicación tenga permiso sobre la identidad del 
                // usuario
                $code = $tmhOAuth->request('POST', $tmhOAuth->url('oauth/request_token', ''), $params);
                
                // Si la solicitud es exitosa nos devuelve los parametros 
                // para generar nuestro link
                if ($code == 200) {
                    $_SESSION['oauth'] = $tmhOAuth->extract_params($tmhOAuth->response['response']);
                    $this->Twitter = $tmhOAuth->url("oauth/authorize", '') . "?oauth_token={$_SESSION['oauth']['oauth_token']}";
                    
                // Sino mostramos el error
                } else {
                    outputError($tmhOAuth);
                }
            }
            
        // Si poseemos poseemos una identidad Twitter asociada
        } else {
            
            // Cargamos las librerias necesarias para trabajar con Twitter
            Load::lib('apis/twitter/tmhOAuth');
            Load::lib('apis/twitter/tmhUtilities');
            
            // Parametrizamos con la identidad que tenemos guardada
            $user = $this->twitterdata;
            $tmhOAuth = new tmhOAuth(array(
                        'consumer_key' => $consumer_key,
                        'consumer_secret' => $consumer_secret,
                        'user_token' => $user['token'],
                        'user_secret' => $user['secret'],
                    ));
            
            // Auteticamos la identidad
            $code = $tmhOAuth->request('GET', $tmhOAuth->url('1/account/verify_credentials'));
            
            // Si la autenticacion es correcta extraemos el avatar y el link de 
            // identidad guardada
            if ($code == 200) {
                $response = json_decode($tmhOAuth->response['response']);
                $this->twitterdata['image'] = $response->profile_image_url;
                $this->twitterdata['profile'] = 'http://www.twitter.com/' . $response->screen_name;
                
            // Sino es correcta mostramos el error de autenticacion
            } else {
                tmhUtilities::pr(htmlentities($tmhOAuth->response['response']));
            }
        }
    }

    /**
     * Controlador para publicar nuestros Tweet con la identidad que ya tenemos 
     * almacenada
     * 
     */
    public function tweet() {

        if (Input::hasPost('Publicar')) {

            // Extraemos todos los parametros necesarios para poder publicar 
            // nuestro Tweet
            $config = Config::read('apis', TRUE);
            $consumer_key = $config['twitter']['consumerkey'];
            $consumer_secret = $config['twitter']['consumersecret'];
            $user = Load::model('redes')->gettwitter();
            $tweet = Input::post('tweet');

            // Cargamos las librerias necesarias
            Load::lib('apis/twitter/tmhOAuth');
            Load::lib('apis/twitter/tmhUtilities');

            // Parametrizamos la identidad que tenemos almacenada
            $tmhOAuth = new tmhOAuth(array(
                        'consumer_key' => $consumer_key,
                        'consumer_secret' => $consumer_secret,
                        'user_token' => $user['token'],
                        'user_secret' => $user['secret'],
                    ));

            // Posteamos nuestro tweet
            $code = $tmhOAuth->request('POST', $tmhOAuth->url('1/statuses/update'), array(
                'status' => $tweet
                    ));

            // Creo que esto no ni necesario de explicar
            if ($code == 200) {
                Flash::success("Tweet Publicado");
            } else {
                Flash::error(htmlentities($tmhOAuth->response['response']));
            }
        }
    }

    /**
     * Esto no es nada de otro mundo solo es para borrar la identidad que 
     * tenemos guardada en nuestra BBDD, tampoco hay mucho que explicar aqui
     * 
     */
    public function desasociar() {
        Load::model('redes')->setTwitter();
        Router::redirect('redes/');
    }

}

?>


Modelo

Este modelo es algo muy sencillo solo posee 2 métodos uno para obtener los datos de la cuenta que tenemos almacenada en nuestra base de datos y otra para escribir los datos de la cuenta.

<?php
/**
 * Modelo para manejar almacenar y obtener el user_token y el user_secret 
 * del usuario de Twitter
 * Fecha 05/02/2012
 *
 * @author Jaro Marval (jamp) <jampgold@gmail.com>
 * @version 0.1
 */

/**
 * Modelo con 2 metodos uno para obtener una identidad guardada en BBDD y otra 
 * para guardar una identidad, "simple"
 */
class redes extends ActiveRecord {

    function getTwitter() {
        $r = $this->find('1');
        
        $o = array(
            'token' => $r->user_token,
            'secret' => $r->user_secret,
        );
        
        if ($r->user_token == '') {
            return FALSE;
        } else {
            return $o;
        }
        
    }
    
    public function setTwitter($id = '', $secret = '') {
        $r = $this->find('1');
        $r->user_token = $id;
        $r->user_secret = $secret;
        
        if ( $r->save() ) {
            return True;
        }
    }
    
}

?>

y la estructura de la base de datos es la siguiente:

--
-- Estructura de tabla para la tabla `redes`
--

CREATE TABLE IF NOT EXISTS `redes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_token` varchar(100) DEFAULT NULL,
  `user_secret` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Vistas

Aquí tenemos las de 2 vistas necesarias para terminar nuestra aplicación "Tuitear" la primera de ellas es:

index.phtml donde asociamos nuestra cuenta a nuestra aplicación

<?php
// Si poseemos una identidad guardada el mostramos los datos sino vamos al 
// link para dar permisos para que nuestra aplicacion puede publicar los Tweet
if ($twitterdata):
?>
<h3>Tu cuenta en Twitter</h3>
    <img src="<?php echo $twitterdata['image']; ?>" style="float:left; margin-right: 5px;"><br/>
    <a href="<?php echo $twitterdata['profile']; ?>" target="_blank">Ver Perfil</a><br/>
    <a href="<?php echo PUBLIC_PATH; ?>redes/desasociar/">Desasociar Cuenta</a><br/>
    <a href="<?php echo PUBLIC_PATH; ?>redes/tweet/">Envia un Tweet</a>
<?php else: ?>
    Asociar cuenta de Twitter: <a href="<?php echo $Twitter ?>">Login</a>
<?php endif; ?>

Y la siguiente es:

tweet.phtml donde claro esta vamos a publicar el Tweet

<h3>Envia tu Tweet:</h3>
<?php 
View::content();

echo Form::open();
echo Form::text('tweet', 'maxlenght="140"') .' <br />';
echo Form::submit("Publicar");

echo Form::close();

?>

Allí está asi de sencillo ya podemos "Tuiter" desde nuestra aplicación con KumbiaPHP, el código también puedes descargarlo desde el repositorio en Github, cualquier comentario o duda visiten el canal de irc de KumbiaPHP en Freenode


Realizado por: Jaro Marval (Jamp)