Obtener noticias desde Google Reader con NodeJs

Iniciado por WHK, 26 Noviembre 2012, 16:53 PM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Estaba terminando un pequeño Script en mis ratos libres para obtener noticias desde google reader con un simple Script hecho en javascript con node, envía las cabeceras de autentificación de forma automática, espero que a mas de alguno les sirva:

Código (javascript) [Seleccionar]
/* Google Reader in NodeJS by WHK */

var http = require("http");
var https = require("https");

/* Configuración */
var sesion = {
SID : '',
LSID : '',
Auth : '',
token : ''
};
var bufferIO = '';
var obNoticias = {};

var loginData = {
mail : 'correo@gmail.com',
pass : '**********'
};

console.log(' - Conectando al servidor de Google Reader ...');

https.get('https://www.google.com/accounts/ClientLogin?service=reader&source=reader&Email=' + escape(loginData.mail) + '&Passwd=' + escape(loginData.pass),
function(res){

/* esperando un HTTP 200 */
if(res.statusCode == 200){
console.log(' - Obteniendo llaves de acceso ...');

/* Procesa el contenido */
res.on('data', function(chunk){
bufferIO += chunk.toString() + '';
}).on('end', function(){

bufferIO = bufferIO.trim(); /* Limpia el buffer de cualquier basura extra */

/* Autentificado? */
if(bufferIO == 'Error=BadAuthentication'){
console.log(' - Clave de acceso erronea.');
return false;
}

var partes = bufferIO.split('\n');
if(!partes.length){
console.log(' - Imposible ingresar, google no ha respondido correctamente.');
return false;
}
bufferIO = ''; /* Limpia la memoria */

var linea;
for(_id in partes){
linea = partes[_id].trim().split('=');
if((linea[0] == 'SID') || (linea[0] == 'LSID') || (linea[0] == 'Auth')){
sesion[linea[0]] = linea[1];
}
}

console.log(' - Obteniendo token de seguridad ...');
http.get({
host : 'www.google.com',
port : 80,
path : '/reader/api/0/token',
headers: {
               'Authorization': 'GoogleLogin auth=' + sesion['Auth']
           }

}, function(res2){

/* esperando un HTTP 200 */
if(res2.statusCode == 200){

/* Procesa el contenido */
res2.on('data', function(chunk2){
bufferIO += chunk2.toString() + '';
}).on('end', function(){
sesion['token'] = bufferIO;
console.log(' - Acceso concedido!');

bufferIO = ''; /* Limpia la memoria */

console.log(' - Obteniendo temas ...');
/* ############################ Obtiene las noticias ############################ */
http.get({
host : 'www.google.com',
port : 80,
path : '/reader/api/0/stream/contents/user/-/state/com.google/reading-list?ck=' + Math.floor(new Date().getTime() / 1000),
headers: {
           'Authorization': 'GoogleLogin auth=' + sesion['Auth']
       }

}, function(res3){
/* esperando un HTTP 200 */
if(res3.statusCode == 200){

bufferIO = '';
/* Procesa el contenido */
res3.on('data', function(chunk3){
bufferIO += chunk3.toString() + '';
}).on('end', function(){
try{
eval('obNoticias = ' + bufferIO + ';'); /* Procesa el Json entregado por Google */

for(_id in obNoticias.items){
console.log('  [' + parseInt((parseInt(_id) + 1)) + '] ' + obNoticias.items[_id].title.trim().substr(0, 67) + ' ...');
}
console.log(' - ' + parseInt((parseInt(_id) + 1)) + ' Items obtenidos.');

return true;

}catch(e){
console.log(' - Error en el servidor de Google Reader : Json corrupto.');
return false;
}
});

}else{
console.log(' - Error en el servidor de Google Reader : ' + res3.statusCode);
return false;
}

}).on('error', function(e){
console.log(' - Imposible conectar al servidor de Google Reader.');
return false;
});

});

}else{
console.log(' - Error en el servidor de Google Reader : ' + res2.statusCode);
return false;
}

}).on('error', function(e){
console.log(' - Imposible conectar al servidor de Google Reader.');
return false;
});
});

}else{
console.log(' - Error en el servidor de cuentas de Google : ' + res.statusCode);
return false;
}

}
).on('error', function(e){
console.log(' - Imposible conectar al servidor de cuentas de Google.');
return false;
});


return true;


Código (bash) [Seleccionar]
whk@packardbell $ node bot.js
- Conectando al servidor de Google Reader ...
- Obteniendo llaves de acceso ...
- Obteniendo token de seguridad ...
- Acceso concedido!
- Obteniendo temas ...
 [1] Cómo prueba Samsung la resistencia de sus dispositivos: los Stress  ...
 [2] El sitio web de la Policía de Lituania ha sido hackeado y modificad ...
 [3] Mozilla estudia lanzar Firefox 17.0.1 para corregir un problema con ...
 [4] Logran regenerar cartílagos gracias a una impresora 3D ...
 [5] La web avanza a un ritmo trepidante... pero el vídeo sigue como sie ...
 [6] El 34% de los españoles ha encontrado empleo a través de las redes  ...
 [7] ICO Reino Unido publica el código de buenas prácticas para la anoni ...
 [8] Detenido un adolescente por abusar de otros menores a los que su ma ...
 [9] Big News te ofrece tus feeds con estilo y con widget de lockscreen ...
 [10] Sony patenta un stylus con retroalimentación háptica ...
 [11] Skobbler lanza una aplicación de Mapas online/offline para demostra ...
 [12] "e-Bottle", conectando el mundo de forma diferente ...
 [13] Vulnerabilidades en Novell File Reporter ...
 [14] Un iPhone libre de 200 euros amenazará a Android en el año 2014 ...
 [15] El servicio de atención al cliente de los operadores sigue siendo m ...
 [16] Confirmados cuatro años de soporte para la Surface con Windows RT ...
 [17] El extraño comportamiento del fuego en el espacio ...
 [18] Cracking con OllyDbg ...
 [19] Descubre qué está drenando y gastando tu batería con Battery Stats  ...
 [20] El mercado negro de teléfonos móviles ...
- 20 Items procesados.
whk@packardbell $


Lo entretenido es que funciona en cualquier sistema operativo compatible con node, mac, linux, windows, etc.

:)