Bots de conversa de Telegram amb Google Apps Script

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

Ús de biblioteques pròpies per a les funcions més habituals

Si tenim uns quants bots de conversa, és probable que algunes de les funcions les fem servir en tots ells. En aquest cas, pot ser recomanable guardar les funcions en una biblioteca; de manera que no estiguin copiades a tots els nostres scripts. Això ens fa els fitxers més manejables i ens permet que les millores a les funcions habituals només les haguem de fer una vegada i ja estiguin disponibles en tots els scripts.

Anem a veure primer com crear una biblioteca amb unes funcions i després com fer servir aquestes funcions en els nostres scripts. Agafem com a exemple un script relativament senzill:

var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI";
var telegramUrl = "https://api.telegram.org/bot" + token;  // Url que comunica el nostre bot amb Telegram 
function hora(Id){  // Funció que retorna l'hora actual
  var ara = new Date();
  var Hora = ara.getHours();
  var Minut = ara.getMinutes();
  var resultat = "Ara són les " + Hora + "." + Minut + " h";
  sendText(Id,resultat);
}
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);
}
function dades(id,nom){  // Funció que retorna el nom de l'usuari
  var resultat = "El teu nom a Telegram és <i>" + nom + "</i>";  // El nom en cursiva
  sendText(id,resultat);
}
function doPost(e){  // Funció que rep les dades que envia Telegram 
  var acabat = false;
  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];
  var par = comanda[1];
  if(cmd == '/hora'){
    hora(id_usuari);
    acabat = true;
  }
  if(cmd == '/nom'){
    dades(id_usuari,nom_usr);
    acabat = true;
  }
  if(!acabat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);  
  }
}

Les funcions que pensem que podem fer servir en altres scripts (hora i sendText) i la instrucció que crea l'adreça URL de Telegram els posarem a la biblioteca (és el tros que hem marcat en color) mentre que la resta es quedarà a l'script.

Creació d'una biblioteca

El primer que haurem de fer serà crear un script, ja sigui aïllat o vinculat a un full de càlcul. Aquest script serà el que contindrà la biblioteca i, per tant, només tindrà les funcions que cridarem des d'altres scripts. Aquest codi el posarem dins una classe i li farem alguns canvis. Ens quedarà com es mostra a continuació, on hem marcat en color les coses que han estat modificades.

var bib_bots = function(token){
  var telegramUrl = "https://api.telegram.org/bot" + token;  // Url que comunica el nostre bot amb Telegram 
  this.hora = function(Id){  // Funció que retorna l'hora actual
    var ara = new Date();
    var Hora = ara.getHours();
    var Minut = ara.getMinutes();
    var resultat = "Ara són les " + Hora + "." + Minut + " h";
    this.sendText(Id,resultat);
  }
  // Funció que prepara per enviar un text o un teclat a Telegram 
  this.sendText = function(chatId,text_env,keyBoard){
    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);
  }
}

Observem que hem fet tres tipus de canvis. Hem posat tot el conjunt dins una classe (que hem anomenat bib_bots) i que és una funció que conté les altres funcions i les instruccions que han d'estar a la biblioteca però són generals (no estan a cap de les funcions). En aquest cas, la classe tindrà un paràmetre (token) que és el que necessitem per a la instrucció que no pertany a cap funció.

Hem canviat la sintaxi de la definició de les dues funcions, posant this davant del nom per indicar que pertanyen a la pròpia classe. Finalment, en aquelles funcions que cridem també els hem posat this al davant, ja que també pertanyen a la pròpia classe.

Un cop acabada de crear la biblioteca, la publicarem de la mateixa manera que publiquem un script. En el cas de les biblioteques, no ens interessa l'adreça URL on s'ha publicat sinó la clau del projecte. Per obtenir-la, anirem a la pestanya Fitxer i seleccionarem Propietats del projecte. A la finestra que se'ns obrirà, buscarem la clau del projecte a la pestanya Informació. Aquesta clau serà una cosa similar a ^^gCpo49tU9Iyf_2kw9rB9kenVAfpvlNP que copiarem i guardarem.

Utilització de la biblioteca

A l'script en el que volem fer servir la biblioteca, hem d'anar a la pestanya Recursos i picar a Biblioteques.... Se'ns obrirà una finestra en la que hi posarem la clau que hem obtingut. També indicarem quina versió de la biblioteca s'ha d'agafar; en principi, la darrera.

Afegir biblioteca

Atenció: Si més endavant modifiquem l'script que conté la biblioteca, es seguirà executant la versió que tinguem assenyalada en aquesta finestra. Ens surt com a identificador el nom que hem posat a l'script però, si ho preferim, podem canviar-lo. Aquest identificador és el que farem servir per referir-nos a la biblioteca.

Ara prepararem la nova versió de l'script que fa servir les funcions de la biblioteca. D'entrada, hem de suprimir aquelles línies que hem posat ja a la biblioteca. Un cop fet això, caldrà fer-hi algunes modificacions; que hem marcat en color. La més important és crear un objecte de la classe que tenim a la biblioteca, d'aquesta manera també passem el paràmetre (token, en el nostre cas) que necessitem a la biblioteca. A les funcions també els haurem d'indicar que pertanyen a la classe que correspon a la biblioteca (de fet, passen a ser mètodes de la classe), posant-hi davant l'identificador d'aquesta que hem posat al requadre. Fixem-nos que a la funció dades no ho hem de posar, perquè no està a la biblioteca.

var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI";
var bbot = new bibbots.bib_bots(token);  // Creem l'objecte
function dades(id,nom){  // Funció que retorna el nom de l'usuari
  var resultat = "El teu nom a Telegram és <i>" + nom + "</i>";  // El nom en cursiva
  bbot.sendText(id,resultat);
}
function doPost(e){  // Funció que rep les dades que envia Telegram 
  var acabat = false;
  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];
  var par = comanda[1];
  if(cmd == '/hora'){
    bbot.hora(id_usuari);
    acabat = true;
  }
  if(cmd == '/nom'){
    dades(id_usuari,nom_usr);
    acabat = true;
  }
  if(!acabat){
    var resposta = "Comanda desconeguda";
    bbot.sendText(id,resposta);  
  }
}

Depuració de la biblioteca

Per provar les funcions de la biblioteca podem fer servir el mode de depuraració amb una funció de prova. Posarem aquesta funció en el mateix fitxer que la biblioteca però fora de la classe.

 

 

 

 

 

 

 

 

 

 

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