Bots de conversa de Telegram amb Google Apps Script

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

Fem, a partir d'un full de càlcul, una llista d'enllaços a uns documents de Google Drive

En un altre exemple hem enviat un enllaç per descarregar un document de Google Drive. Podríem fer el mateix amb diversos documents, però si n'hi ha més de dos o tres potser és més pràctic que els noms i els enllaços dels documents que es poden descarregar estiguin en un full de càlcul. Així el llistat es pot modificar sense haver de tocar el programa. Una altra alternativa seria fer una carpeta amb els documents a compartir i fer un programa com el d'aquest altre exemple.

En aquest exemple, comptem que tenim un full de càlcul que té una pestanya anomenada Docs amb les següents dues columnes:

Columna Contingut
1 Nom que volem que es mostri per identificar el document
2 Adreça URL del document

El programa de l'script seria 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 IdFull = "1j0IjAcf0BDppQuAOGZjLSjWY2_VYhgYeKg42bhQMk9Q"; // Identificador del full de càlcul 
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 realitzat = false;
  if(text == '/docs'){
    var resposta = "Enllaços als documents:\n\n";
    realitzat = true;
    var sh = SpreadsheetApp.openById(IdFull).getSheetByName("Docs");  // Agafem el full
    var dades = sh.getDataRange().getValues();
    for (var i in dades){  // Recorrem totes les dades rebudes
      if(i > 0){  // Descartem la filera dels títols
        var filera = dades[i];    // Agafem una filera
        var nomDoc = filera[0];
        var urlDoc = filera[1];
        resposta = resposta + nomDoc + ":\n" + urlDoc +"\n\n";
      }
    }
    sendText(id,resposta);
  }
  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);
}

Podem fer que se'ns mostrin botons per descarregar els documents. Això dona un format més compacte, ja que els enllaços als documents són molt llargs, i és més pràctic si hi ha uns quants documents com a opcions. El programa quedaria com es mostra a continuació:

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 IdFull = "1j0IjAcf0BDppQuAOGZjLSjWY2_VYhgYeKg42bhQMk9Q"; // Identificador del full de càlcul 
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 realitzat = false;
  if(text == '/docs'){
    var resposta = "Enllaços als documents:\n\n";
    realitzat = true;
    var sh = SpreadsheetApp.openById(IdFull).getSheetByName("Docs");  // Agafem el full
    var dades = sh.getDataRange().getValues();
    var llista = new Array();  // La llista contindrà totes les tecles
    for (var i in dades){  // Recorrem totes les dades rebudes
      if(i > 0){  // Descartem la filera dels títols
        var filera = dades[i];    // Agafem una filera
        var text_tecla = filera[0];  // La primera columna és la descripció del document
        var url_tecla = filera[1];  // La segona columna és l'enllaç al document
        var tecla = {"text":text_tecla,"url":url_tecla};  // Dades per a una tecla
        var row = new Array(1);  // Contindrà una filera d'un sol botó
        row[0] = tecla;  // Posem el botó a la filera
        llista.push(row);  // Afegim la filera a la llista
      }
    }
    var tecles = {"inline_keyboard":llista};  // Creem el teclat a partir de la llista
    var titol = "Tria una opció";  // Títol del teclat
    sendText(id,titol,tecles);  
  }
  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);
}

Si volem posar dos o més botons per filera el programa es complica una mica perquè els hem d'anar comptant. Per exemple, podríem substituir la funció doPost anterior per la següent, en la que podem triar quantes tecles es posaran a cada filera. Si el nombre de documents no és un múltiple del nombre de tecles per filera, la darrera filera tindrà menys tecles.

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 realitzat = false;
  if(text == '/docs'){
    var resposta = "Enllaços als documents:\n\n";
    realitzat = true;
    var sh = SpreadsheetApp.openById(IdFull).getSheetByName("Docs");  // Agafem el full
    var dades = sh.getDataRange().getValues();
    var llista = new Array();  // La llista contindrà totes les tecles
    var numTecFil = 3;  // Nombre de tecles per filera
    var tecAct = 0;  // Comptador de tecles per filera
    for (var i in dades){
      if(i > 0){  // Descartem la filera dels títols
        var filera = dades[i];    // Agafem una filera
        var text_tecla = filera[0];  // La primera columna és la descripció del document
        var url_tecla = filera[1];  // La segona columna és l'enllaç al document
        var tecla = {"text":text_tecla,"url":url_tecla};  // Dades per a una tecla
        if(tecAct == 0){  // Si és el primer botó de la filera
          var row = new Array(1);  // Creem un vector buit per guardar la filera
        }
        row[tecAct] = tecla;  // Posem el botó a la filera
        tecAct++;  // Botó següent
        if(tecAct == numTecFil){  // Si hem acabat una filera
          tecAct = 0;  // Reiniciem el comptador
          llista.push(row);  // Afegim la filera a la llista
        }
      }
    }
    if(tecAct > 0){  // Si ens ha quedat alguna tecla sense completar filera
      llista.push(row);  // Afegim la filera a la llista
    }
    var tecles = {"inline_keyboard":llista};  // Creem el teclat a partir de la llista
    var titol = "Tria una opció";
    sendText(id,titol,tecles);  
  }
  if (!realitzat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);
  }
}

En les adreces URL dels fitxers, una part de la informació és idèntica. Podríem fer que al full de càlcul només hi hagués els identificadors dels fitxers i generar l'adreça completa en el moment de crear el teclat, com es mostra a continuació:

        var url_tecla = "https://docs.google.com/document/d/" + filera[1] + "/edit?usp=sharing";

 

 

 

 

 

 

 

 

 

 

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