lunes, 20 de febrero de 2017

Chat con Websockets - Aurelia , Express (Parte 5 - Consumiendo la API de twitter desde el backend)

Hola nuevamente!!! a modo de hacer algo nuevo, aprenderemos a consumir la API de twitter desde nodejs, y para hacerlo mas interesante en el siguiente post pondremos un pequeño "widget" en el chat donde veremos los últimos mensajes de twitter.

Puedes seguir el proceso de construcción del proyecto en posts anteriores, o simplemente descargar la aplicación hasta este punto con:

$ git clone https://github.com/feardarkness/chat-backend.git
$ git checkout tags/send-receive-messages

Primero, generaremos nuestras credenciales en twitter, ingresar a https://apps.twitter.com/ (ingresar con tu usuario y contraseña), luego hacer click en Create New App:

Agregar Aplicación
Ahora es necesario ingresar algunos datos de nuestra aplicación, el nombre y la descripción, el url del sitio web y por último el url al cual nos dirige la autenticación de twitter cuando el usuario ingresa sus datos exitosamente (en este momento realizaremos consultas generales, no específicamente del usuario por lo cuál este campo puede ser cualquiera)

Datos de la aplicación

Ahora configuraremos los datos para que sean solamente de lectura (siempre dar el permiso mínimo requerido es una buena práctica) y presionamos Update Settings
Permiso de solo lectura


Además, necesitamos los datos consumer key y consumer secret (anotarlos en un lugar seguro).

Consumer key y secret

Por último, presionar el botón Create my access token para generar los tokens. Necesitamos el access token y el access token secret (anotarlos en un lugar seguro)

Access toke, y access token secret
Habiendo generado las credenciales necesarias, es hora de consumir la api de twitter, primero instalaremos el cliente en la aplicación:

$ npm install twitter-node-client --save

Ahora, en el proyecto backend, crearemos la siguiente estructura de carpetas y archivos:

Estructura de carpetas y archivos

Comenzaremos agregando el archivo de configuración para conectar a twitter, para ello modificar el archivo configurations/twitter-config.js con las credenciales que obtuvimos al crear nuestra aplicación. El archivo debe quedar con la siguiente estructura (pero con las credenciales que obtuvimos):

module.exports = {
  consumerKey: 'CHANGE',
  consumerSecret: 'CHANGE',
  accessToken: 'CHANGE',
  accessTokenSecret: 'CHANGE',
  callBackUrl: 'CHANGE',
};


Con las credenciales en su lugar, crearemos el servicio que permita obtener una cantidad de mensajes basados en un hashtag. Para esto modificaremos el archivo services/twitter.js con el siguiente código, que básicamente obtiene las credenciales de conexión y realiza un query básico (q) limitado por defecto a diez registros (count) en caso de éxito resolvemos la promesa con los datos en formato JSON, y en caso de error rechazamos la promesa con el error obtenido:

import debugModule from 'debug';
import TwitterNodeClient from 'twitter-node-client';
import twitterConfigs from '../configurations/twitter-config';

const Twitter = TwitterNodeClient.Twitter;
const twitter = new Twitter(twitterConfigs);
const debug = debugModule('twitter-service');

module.exports.searchByTag = (tag, quantity = 10) => {
  return new Promise((resolve, reject) => {
    twitter.getSearch({ q: `#${tag}`, count: quantity },
      (err, response, body) => {
        reject(err);
      }, (data) => {
        resolve(JSON.parse(data));
      });
  });
}

Luego crearemos la ruta para nuestra API Rest (verbo GET), modificaremos el archivo routes/twitter.js en donde llamamos el servicio recién creado, y en caso de éxito lo devolvemos al usuario (con código 200 que indica éxito en la operación); en caso de error devolvemos la causa del mismo (con código 500 que indica la existencia de un error y que no podemos ser más específicos en la causa del mismo).

import express from 'express';
import twitterService from '../services/twitter';

const router = express.Router();

router.get('/', (req, res) => {
  twitterService.searchByTag('node')
    .then((data) => {
      res.json(data);
    })
    .catch((err) => {
      res.status(500).json(err);
    });
});

module.exports = router;


Además, modificaremos el archivo routes/index.js que exportará las rutas que necesitamos agregar a la aplicación.

import twitterRoutes from './twitter';

module.exports.twitterRoutes = twitterRoutes;

Por último, modificaremos el archivo index.js que se encuentra en la raíz del proyecto para cargar la ruta recien creada en el path /twitter.

import express from 'express';
import http from 'http';
import debugModule from 'debug';
import { twitterRoutes } from './routes';

const app = express();
const server = http.Server(app);

const debug = debugModule('chat-backend');

app.use('/twitter', twitterRoutes);


server.listen(8081, () => {
  debug('Servidor escuchando en el puerto 8081');
});

Y eso es todo, ahora podemos probar el servicio directamente en el navegador o con postman.

Prueba del servicio de twitter

Para descargar el proyecto hasta este lugar:

$ git clone https://github.com/feardarkness/chat-backend.git
$ git checkout tags/twitter-api

Ahora ya se puede consumir cualquier otra api de twitter para prácticar modificando el archivo services/twitter.js, Hasta la próxima, keep coding >_<

No hay comentarios:

Publicar un comentario