-
-
Save dcatanzaro/5fc1bbd4753403305be7543d28b2eddf to your computer and use it in GitHub Desktop.
const axios = require("axios"); | |
let lastIndexMovement = 0; | |
const TELEGRAM_BOTID = ""; | |
const TELEGRAM_CHATID = ""; | |
class Telegram { | |
sendTelegramMessage(message) { | |
const botId = TELEGRAM_BOTID; | |
const chatId = TELEGRAM_CHATID; | |
if (!botId || !chatId) { | |
return; | |
} | |
try { | |
const telegramMsg = encodeURIComponent(message); | |
const url = `https://api.telegram.org/${botId}/sendMessage?chat_id=${chatId}&text=${telegramMsg}&parse_mode=HTML`; | |
axios.get(url); | |
} catch (e) { | |
console.log(e); | |
} | |
} | |
} | |
const telegram = new Telegram(); | |
const getMovimientosGalicia = async () => { | |
const url = | |
"https://cuentas.bancogalicia.com.ar/Cuentas/GetMovimientosCuenta"; | |
const cookies = | |
""; | |
const headers = { | |
accept: "application/json, text/javascript, */*; q=0.01", | |
"accept-language": "en-US,en;q=0.9,es;q=0.8", | |
"content-type": "application/x-www-form-urlencoded; charset=UTF-8", | |
"sec-fetch-dest": "empty", | |
"sec-fetch-mode": "cors", | |
"sec-fetch-site": "same-origin", | |
"x-requested-with": "XMLHttpRequest", | |
cookie: cookies, | |
Referer: "https://cuentas.bancogalicia.com.ar/cuentas/mis-cuentas", | |
"Referrer-Policy": "strict-origin-when-cross-origin", | |
}; | |
const body = ""; | |
const result = await axios.post(url, body, { headers }); | |
return result.data.Model.Movimientos; | |
}; | |
const init = async () => { | |
let movementsGalicia = await getMovimientosGalicia(); | |
movementsGalicia = movementsGalicia.reverse(); | |
movementsGalicia.forEach((movement) => { | |
if (movement.IndiceMovimiento > lastIndexMovement) { | |
lastIndexMovement = movement.IndiceMovimiento; | |
if (movement.ImporteCredito !== "0,00") { | |
telegram.sendTelegramMessage( | |
`<strong>🏦 Banco</strong>: Galicia\n<strong>❗️ Nuevo movimiento:</strong> ${movement.DescripcionAMostrar}\n<strong>💰 Ingreso:</strong> ${movement.ImporteCreditoLabel}` | |
); | |
} else { | |
telegram.sendTelegramMessage( | |
`<strong>🏦 Banco</strong>: Galicia\n<strong>❗️ Nuevo movimiento:</strong> ${movement.DescripcionAMostrar}\n<strong>💰 Gasto:</strong> ${movement.ImporteDebitoLabel}` | |
); | |
} | |
} | |
}); | |
}; | |
setInterval(init, 10000); |
Sale repo donde adicionemos los demás bancos?
Estaría genial
el cookies="" es la cookie que obtiene una vez que inicia sesión no? supongo está vacío para no pasar la info no? Otra cosa, el endpoint de galicia como lo obtiene ? hay alguna API para esto?
Muy bueno! una consulta!
Que tipo de Cookie se utiliza para poder leer el contenido de la pagina?
como puedo descargarlo y empezar a usarlo?
como puedo descargarlo y empezar a usarlo?
tenés que instalar nodeJS y correr este script en un terminal, o bien instalarlo como servicio para no tener que tener la ventanita del terminal abierta todo el tiempo
Muy bueno Damian!
Alguien tiene idea si se puede hacer para Santander?
Muy bueno Damian! Alguien tiene idea si se puede hacer para Santander?
@tstambulsky
Recién de curioso estuve chequeando, hay que adaptar algunas cositas pero se puede seguir la misma lógica tranquilamente
¿Alguien que averigüe si es factible hacerlo para ICBC? Necesito obtener datos de transferencias recibidas en una cuenta (titular origen, número de operació o algo) para validar pagos.
- La cookie podría estar en una variable de entorno
- No tiene rate limiter la API del banco?
- Habría que averiguar si tiene paginado para traerte pocos elementos. Si el tiempo entre requests es bajo, no necesitas traerte muchos elementos. Por lo contrario subir el tiempo entre requests hace que te tengas que traer mas elementos para estar actualizado y no perder ninguno.
movementsGalicia.reverse()
se puede reemplazar por leer el array al revés y te evitas una operación costosa- El
forEach
lo podés romper (break
) cuando elmovimientos.IndiceMovimiento < lastIndexMovement
- El
lastIndexMovement
se te va a resetear si reinicias la app. Tendría que quedar persistido en algún lado (un redis, por ejemplo). De lo contrario cada vez que levantes la app te va a tirar los mensajes por todos los movimientos que te devuelve la API (que ya envió). - Faltan tests (?) JAJAJAJAJA
- La cookie podría estar en una variable de entorno
- No tiene rate limiter la API del banco?
- Habría que averiguar si tiene paginado para traerte pocos elementos. Si el tiempo entre requests es bajo, no necesitas traerte muchos elementos. Por lo contrario subir el tiempo entre requests hace que te tengas que traer mas elementos para estar actualizado y no perder ninguno.
movementsGalicia.reverse()
se puede reemplazar por leer el array al revés y te evitas una operación costosa- El
forEach
lo podés romper (break
) cuando elmovimientos.IndiceMovimiento < lastIndexMovement
- El
lastIndexMovement
se te va a resetear si reinicias la app. Tendría que quedar persistido en algún lado (un redis, por ejemplo). De lo contrario cada vez que levantes la app te va a tirar los mensajes por todos los movimientos que te devuelve la API (que ya envió).- Faltan tests (?) JAJAJAJAJA
Excelente analisis.
- La cookie podría estar en una variable de entorno
- No tiene rate limiter la API del banco?
- Habría que averiguar si tiene paginado para traerte pocos elementos. Si el tiempo entre requests es bajo, no necesitas traerte muchos elementos. Por lo contrario subir el tiempo entre requests hace que te tengas que traer mas elementos para estar actualizado y no perder ninguno.
movementsGalicia.reverse()
se puede reemplazar por leer el array al revés y te evitas una operación costosa- El
forEach
lo podés romper (break
) cuando elmovimientos.IndiceMovimiento < lastIndexMovement
- El
lastIndexMovement
se te va a resetear si reinicias la app. Tendría que quedar persistido en algún lado (un redis, por ejemplo). De lo contrario cada vez que levantes la app te va a tirar los mensajes por todos los movimientos que te devuelve la API (que ya envió).- Faltan tests (?) JAJAJAJAJA
Hice el bot en 2 minutos, para mi caso me servia :P, al pedo darle complejidad a un botcito asi.
Hace unos meses empecé a hacer esto mismo y me distraje. Protip (?): si le pegás a cierto endpoint keepalive, el homebanking no cierra la sesión nunca, y podés seguir pidiendo este dato sin volver a loguearte.
Bue, me siento tan seguro en este momento 👀
si pongo lo que trae document.cookie la repsonse es = >
data: {
IsError: true,
Model: {
Codigo: 'NULLJSONEXCP',
Descripcion: "Error en 'ErrorAjaxJSon', exception es null",
CerrarSesion: false
}
}
a alguien le paso? como se soluciona?
alguien lo hizo para el BBVA?
alguien lo hizo para el BBVA?
https://github.com/yagopajarino/bot-bbva
🚀
Muchas gracias!! Te puedo hacer una consulta?
En cookies mandas toda la cookie quw se genera cuando haces login o solo algunos valores??
alguien lo hizo para el BBVA?
Muchas gracias!! Te puedo hacer una consulta? En cookies mandas toda la cookie quw se genera cuando haces login o solo algunos valores??
Hola! Se la paso entera ;)
alguien lo hizo para el BBVA?
Muchas gracias!! Te puedo hacer una consulta? En cookies mandas toda la cookie quw se genera cuando haces login o solo algunos valores??
Hola! Se la paso entera ;)
tenes idea por que me puede tirar este error? le estoy pasando el 'x-xsrf-token' de la sesion..
data: 'Error 403: Expected CSRF token not found. Has your session expired?\n'
Mandame un dm o un mail y lo vemos
alguien lo hizo para el BBVA?
Muchas gracias!! Te puedo hacer una consulta? En cookies mandas toda la cookie quw se genera cuando haces login o solo algunos valores??
Hola! Se la paso entera ;)
tenes idea por que me puede tirar este error? le estoy pasando el 'x-xsrf-token' de la sesion..
data: 'Error 403: Expected CSRF token not found. Has your session expired?\n'
Mandame un dm por twitter o un mail y lo vemos
Muy bueno Damian! Alguien tiene idea si se puede hacer para Santander?
@tstambulskyRecién de curioso estuve chequeando, hay que adaptar algunas cositas pero se puede seguir la misma lógica tranquilamente
intente hacerlo para el santander y no me funcionó.. si alguno lo hizo y lo quiere compartir, bienvenido será..
Para mandar el request a través de la API de Telegram, está bien que sea un GET en vez de un POST? O es indiferente?