Bots de conversa de Telegram amb Google Apps Script

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

Creem un mapa de Google amb marques

En aquest exemple situarem un punt i marcarem una àrea en un mapa de Google i l'enviarem a l'usuari com a imatge en format de dades binàries (BLOB). La imatge que generarem és la següent:

Mapa

En aquest cas, per simplificar el programa, els punts estan definits en el propi programa. Podrien, però, estar en un full de càlcul; d'aquesta manera el programa podria agafar uns punts diferents segons els paràmetres introduïts per l'usuari.

El programa é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 bot de conversa amb Telegram 
function mapa(){
  var map = Maps.newStaticMap();  // Crea un mapa
  // Definim les propietats i els punts
  map.setSize(600, 600);
  map.setCenter("Avinguda Diagonal 647, Barcelona");
  map.setZoom(17);
  map.addMarker("ETSEIB");
  map.setMarkerStyle(Maps.StaticMap.MarkerSize.MID, Maps.StaticMap.Color.ORANGE,"A");
  map.addMarker("Avinguda Diagonal 649, Barcelona");
  var coord = [41.3851564,2.1160347,
               41.3838964,2.1166047,
               41.3834964,2.1149047,
               41.3847264,2.1143547,
               41.3851564,2.1160347];  // Coordenades per a l'àrea
  map.setPathStyle(4, Maps.StaticMap.Color.RED, Maps.StaticMap.Color.BLUE);
  map.addPath(coord);
  var mapa_blob =  map.getBlob();  // Converteix el mapa a dades binàries 
  return mapa_blob;
}
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 realitzat = false;
  if(text == '/mapa'){
    var blob = mapa();  // Crea el mapa
    var descrip = "Mapa";
    sendBlobFile(id,blob,descrip);  // L'envia a Telegram
    realitzat = true;
  }
  if (!realitzat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);
  }
}
function sendText(chatId,text_env,keyBoard){  // Funció que envia 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);
}
function sendBlobFile(chatId,blob_data,caption){
  var payload = {
    method: "sendPhoto",
    chat_id: String(chatId),
    photo: blob_data,
    caption: caption,
    parse_mode: "HTML"
  };
  var options = {
    method: "POST",
    payload: payload,
    muteHttpExceptions: true
  };
  UrlFetchApp.fetch( telegramUrl + '/', options);
}

Podem generar un fitxer PDF amb el mapa i fer que, a més de mostrar-se la imatge, es pugui descarregar el fitxer. Per fer-ho, canviaríem les línies marcades en color en l'script anterior per les següents:

    var b64 = blob.getContentType() + ';base64,'+ Utilities.base64Encode(blob.getBytes());
    var htmlEst = '<style type="text/css" media="print">@page {size: landscape;} </style>';
    var htmlInst = htmlEst + '<img src="data:' + b64 + '" width=600 alt="Mapa">';
    var html = HtmlService.createHtmlOutput(htmlInst);
    var pdf = DriveApp.createFile(html.getAs("application/pdf").setName("mapa.pdf"));
    var urlDescPDF = pdf.getDownloadUrl();  // Enllaç per descarregar el fitxer
    var pdfId = pdf.getId();
    var descrip = "Pots descarregar el PDF aquí: " + urlDescPDF;
    sendBlobFile(id,blob,descrip);

Una altra opció seria crear un arxiu amb la imatge (per exemple en format GIF) i enviar l'enllaç per descarregar-lo. Això és el que fa el següent programa:

var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI"; // API Token de Telegram 
var telegramUrl = "https://api.telegram.org/bot" + token;  // URL que comunica el bot de conversa amb Telegram 
var IdCarpeta = "^^Hlod5Y4qEsLF9HrIsE6oYQa32f6NHeo";  // Carpeta on guardarem el fitxer
function mapa(id_usr){
  var map = Maps.newStaticMap();  // Crea un mapa
  // Defineix les propietats i els punts del mapa
  map.setSize(600, 600);
  map.setCenter("Avinguda Diagonal 647, Barcelona");
  map.setZoom(17);
  map.addMarker("ETSEIB");
  map.setMarkerStyle(Maps.StaticMap.MarkerSize.MID, Maps.StaticMap.Color.ORANGE,"A");
  map.addMarker("Avinguda Diagonal 649, Barcelona");
  var coord = [41.3851564,2.1160347,
               41.3838964,2.1166047,
               41.3834964,2.1149047,
               41.3847264,2.1143547,
               41.3851564,2.1160347];  // Coordenades de l'àrea
  map.setPathStyle(4, Maps.StaticMap.Color.RED, Maps.StaticMap.Color.BLUE);
  map.addPath(coord);
  var mapimg = map.getAs("image/gif");  // El converteix a imatge GIF
  mapimg.setName("mapa.gif");  // Li posa nom
  // Crea el fitxer
  var file = DriveApp.getFolderById(IdCarpeta).createFile(mapimg);   // Crea el fitxer
  var url_fitxer = file.getDownloadUrl();  // Agafa l'adreça per descarregar-lo
  var resposta = "El fitxer està llest, el pots descarregar a " + url_fitxer;
  sendText(id_usr,resposta);  
}
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 realitzat = false;
  if(text == '/mapa'){
    mapa(id);  // Crea el mapa
    realitzat = true;
  }
  if (!realitzat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);
  }
}
function sendText(chatId,text_env,keyBoard){  // Funció que envia 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);
}
function sendBlobFile(chatId,blob_data,caption){
  var payload = {
    method: "sendPhoto",
    chat_id: String(chatId),
    photo: blob_data,
    caption: caption,
    parse_mode: "HTML"
  };
  var options = {
    method: "POST",
    payload: payload,
    muteHttpExceptions: true
  };
  UrlFetchApp.fetch( telegramUrl + '/', options);
}

 

 

 

 

 

 

 

 

 

 

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