Bots de conversa de Telegram amb Google Apps Script

Bots de conversa Exemples Dades pràctiques   Recursos CITCEA
Google Apps Script Projectes Interacció   Inici

Obtenim el preu de l'energia elèctrica tractant dades JSON

En aquest exemple tractarem les dades JSON obtingudes del web de Red Eléctrica de España per obtenir el preu de la tarifa PVPC del dia actual. El bot de conversa retorna, segons la comanda, les següents informacions:

Comanda Resultat
/help Comandes disponibles
/resum Resum de la tarifa PVPC avui
(preus màxim i mínim i preu en el moment actual)
/ara Preu de la tarifa PVPC ara mateix
/h0
/h23
Preu de la tarifa PVPC a l'hora indicada

La comanda que farem servir serà aquesta:

https://apidatos.ree.es/es/datos/mercados/precios-mercados-tiempo-real?start_date=2020-10-23T00:00
  &end_date=2020-10-23T23:30&time_trunc=hour

La comanda hauria d'estar en una sola línia. Hem marcat en color els paràmetres que cal adaptar per poder consultar el dia actual. La consulta de l'exemple (corresponent al 23-10-2020) torna una informació molt llarga. Les dades estan en format JSON que podem processar, per exemple, amb JSON formatter si en volem veure l'estructura per saber què ens interessa. El valor de la variable hh pot ser considerat text i caldrà convertir-lo a numèric. Ens interessen els vint-i-quatre preus horaris de la tarifa PVPC. Si suposem que el resultat de tractar el format JSON el tenim a la variable dades, podem extreure el preu de l'hora h amb:

  var dades = JSON.parse(response);
  var pvpc = dades.included[0].attributes.values;
  var preu = pvpc[h].value;  // Preu a l'hora h

El codi de l'script és el següent:

var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI"; // API Token de Telegram 
var telegramUrl = "https://api.telegram.org/bot" + token;  // URL que comunica el nostre bot amb Telegram  
var url_ree = "https://apidatos.ree.es/es/datos/mercados/precios-mercados-tiempo-real?";  // Adreça de les dades
var realitzat = false;
function doPost(e){
  var data = JSON.parse(e.postData.contents);  // Llegeix les dades rebudes per JSON i les guarda
  var text = data.message.text;  // Comanda enviada
  var id = data.message.chat.id;  // Identificador de la finestra d'on prové el missatge 
  var id_usuari = data.message.from.id; // Identificador de l'usuari
  var id_missatge = data.message.message_id; // Identificador del missatge
  var lang = data.message.from.language_code ;  // Idioma de l'usuari 
  var nom_usr = data.message.from.first_name ;  // Nom de l'usuari
  var location = data.message.location;  // Localització de l'usuari (si es sap) 
  var comanda = text.split("@");  // El signe @ separa la comanda dels paràmetres 
  var cmd = comanda[0];  // Comanda
  var par = comanda[1];  // Paràmetres
  if(cmd == '/help'){
    var resposta = "<b>Comandes disponibles:</b>\n";
    resposta =  resposta + "/resum    Resum de la tarifa PVPC avui\n";
    resposta =  resposta + "/ara      Preu de la tarifa PVPC ara mateix\n";
    resposta =  resposta + "/h0 /h23  Preu de la tarifa PVPC a l'hora indicada\n";
    sendText(id,resposta);  
    realitzat = true;
  }
  if(cmd == '/resum'){
    preuEnergia(id,25);  // Resum de la tarifa PVPC avui
    realitzat = true;
  }
  if(cmd == '/ara'){
    preuEnergia(id,24);  // Preu de la tarifa PVPC ara mateix
    realitzat = true;
  }
  if(cmd.indexOf("/h") == 0){
    if(cmd.length > 2){
      var hh = cmd.substring(2,cmd.length);
      if (hh.length < 3){
        var hsol = +hh;
        preuEnergia(id,hsol);  // Preu de la tarifa PVPC a l'hora indicada
        realitzat = true;
      }
    }
  }
  if(!realitzat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);  
  }
}
function preuEnergia(chatId,hh){
  // Si hh = 24 volem l'hora actual
  // Si hh = 25 volem el resum del dia
  var ara = new Date();  // Dia i hora actuals
  var mes = +ara.getMonth() + 1;  // Sumem 1 perquè la funció dona els valors entre 0 i 11
  // Construïm la data en el format requerit
  var data = ara.getFullYear() + "-";
  if (mes < 10){
    data = data + "0";
  }
  data = data + mes + "-";
  if (ara.getDate() < 10){
    data = data + "0";
  }
  data = data + ara.getDate();
  // Construïm la URL per demanar les dades
  var peticio = url_ree + "start_date=" + data + "T00:00" + "&end_date=" + data;
  peticio = peticio + "T23:30" + "&time_trunc=hour";
  var response = UrlFetchApp.fetch(peticio); // Carrega la resposta a la petició
  var dades = JSON.parse(response);  // Tracta les dades rebudes com a JSON i les guarda a dades
  var pvpc = dades.included[0].attributes.values;  // Preus horaris
  var resposta = "Petició incorrecta";
  if (hh == 24){
    hh = ara.getHours();
  }
  if ((hh >= 0) && (hh <= 23)){  // Si és per a una hora
    var preu = pvpc[hh].value.toString().replace(".",",");  // Canviem munts per comes
    resposta = "El preu de la tarifa PVPC a les " + hh + " h d'avui és de " + preu + " €/MWh";
  }
  if (hh == 25){  // Si és el resum
    hh = ara.getHours();  // Hora actual
    var max = 0;
    var min = 10000;
    var hmax = 0;
    var hmin = 0;
    for(var i = 0; i < 24; i++){
      var preu = pvpc[i].value;
      if (preu > max){
        max = preu;  // Guarda el màxim
        hmax = i;
      }
      if (preu < min){
        min = preu;  // Guarda el mínim
        hmin = i;
      }
    }
    // Preparem la resposta
    resposta = "<b>Preu de la tarifa PVPC:</b>\n";
    resposta = resposta + "Ara:    " + pvpc[hh].value.toString().replace(".",",") + " €/MWh";
    resposta = resposta + "    (" + hh + " h)\n";
    resposta = resposta + "Màx. avui:    " + max.toString().replace(".",",") + " €/MWh";
    resposta = resposta + "    (" + hmax + " h)\n";
    resposta = resposta + "Mín. avui:    " + min.toString().replace(".",",") + " €/MWh";
    resposta = resposta + "    (" + hmin + " h)\n";
  }
  sendText(chatId,resposta);  
}
function sendText(chatId,text_env,keyBoard){  // Funció que prepara per enviar un text o un teclat a Telegram 
  keyBoard = keyBoard || 0;
  if(keyBoard.inline_keyboard || keyBoard.keyboard){
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text_env,
        parse_mode: "HTML",
        reply_markup: JSON.stringify(keyBoard)
      }
    }
  } else {
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text_env,
        parse_mode: "HTML"
      }
    }
  }
  UrlFetchApp.fetch( telegramUrl + '/', data);
}

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.