loading...

Mas allá de un SMS de tu banco

alejonext profile image AlejoNext Originally published at Medium on ・3 min read

La verdad, desde hace un tiempo quería hacer esto… Creo a muchas personas le llegan SMS al numero celular diciendo

TuBanco le informa Compra por $30.000,00 en ESTABLECIMIENTO 12:13. 09/11/2018 T.Deb *1234. Inquietudes al 018000123456789.

Pero aparte de eso, no llega mas información. Así que lo primero que hice fue crear un CSV, con IFTTT. Vi que no era suficiente, lo abría en Excel… Y ¿Que? Ahora como hago para sacar toda la información, quiero saber donde estoy desperdiciando mi dinero… Pues claramente, solo vea, una lista de SMS, pero sin ninguna extracción.

Me quede pensando, y dije lo que debo hacer es montar un servicio tipo REST API, que reciba el texto del SMS. Lo traduzca, o extraiga toda la información, como los valores y demás, y los ponga en un CSV, o en Hoja de Calculo.

Pensé, no debe ser difícil, todos modos los del “TuBanco”, deben usar algún tipo de plantilla para ello, y solo es sacar la inversa. Así que comencé a probar con reverse-mustache, así

reverseMustache({
  template: 'TuBanco le informa {{#tipo}}{{tipo}}{{/tipo}} por ${{#valor}}{{valor}}{{/valor}} en {{#donde}}{{donde}}{{/donde}} {{#hora}}{{hora}}{{/hora}}. {{#fecha}}{{fecha}}{{/fecha}} T.Deb \*1234. Inquietudes al 018000123456789.',
  content: 'TuBanco le informa Compra por $31.000,00 en ESTABLECIMIENTO 12:13. 09/11/2018 T.Deb \*1234. Inquietudes al 018000123456789.'
});

// Salida
{
 "donde" : "ESTABLECIMIENTO",
 "hora" : "12:13",
 "fecha" : "09/11/2018",
 "valor" : "31.000,00",
 "tipo" : "Compra"
}

El primer inconveniente con esto, es que los textos pueden cambiar, asi

OTROBANCO, informa compra aprobada 10.925 09/11/2018 18:22:26 a tu producto *234. Si la desconoces responde NO. Tel 0311234567 En TIENDA 2.

E incluso si el nombre del establecimiento es de dos palabras, puede fallar! Y Para ello, tocaría hacer muchas plantillas, y no es muy mas coherente. Así que leí acerca de NaturalLanguage, si es la forma de procesar lenguaje sera mejor utilizarlo. Así que lo probé con mi cantidad de SMS recolectados durante 3 años, en Google.

Bueno, hasta ahora va mejor, y mas fácil! Y puedo cambiar todo tipo de SMS. Y solo con condicionales y loops puedo detectar lo que necesito! Listo comenzamos a programar, saque un API Key en Google. Cree un proyecto en Script Google, lo primero sera crear una función que traiga el NaturalLanguage, así

function template(str = "") {
  let result = UrlFetchApp.fetch([
      "[https://language.googleapis.co/v1/documents:analyzeEntities](https://language.googleapis.com/v1/documents:analyzeEntities)",
      "key=AIz........" ].join("?"),{
      method: "post",
      contentType: "application/json",
      payload: JSON.stringify({
        document: {
          language: "es",
          type: "PLAIN\_TEXT",
          content: str.replace(/\.00/gim, '').replace(/\./gim, '')
        }
      })
  });

  if (result.getResponseCode() == 200) {
    let res = JSON.parse(result.getContentText());
    return res.entities || [];
  }
  return [];
}

De esta forma tenemos un Array de palabras, analizadas que pueden ser algo. Ya tenemos la información, principal como la fecha, hora, establecimiento, banco.

let entities = template(e.parameter.mesg);

Lo único que hace falta es si es Retiro, Compra, recepción de dinero (consignación), pago de nomina… Es decir los eventos! Pero realmente solo existe dos tipos de eventos, SUMAR o RESTAR, si queremos hacer un Hoja de calculo, solo debemos cambiar el signo de Positivo o Negativo.

let x = entities.find(e => e.type == "PRICE");
let price = x ? parseInt(x.metadata.value) : 0;
let finacialPrice = price \*(/recepc|nomina/gim.test(e.mesg || "") ? 1 : -1);

Podemos obtener el banco

entities.filter(e => e && e.type == "ORGANIZATION")

También la cuenta o producto

entities.filter(e => e && /\*/.test(e.name))

Listo! Como estamos en Google Script, podemos tomar un documento y añadir toda esa información a una Hoja de Calculo, y ahora si podemos saber específicamente donde estamos gastado el dinero.

Discussion

markdown guide