Bots de conversa de Telegram amb Google Apps Script

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

Programació del bot de conversa (basat en un script a Google Sheets)

El bot que hem fet és capaç de rebre comandes però no fa res amb elles perquè Telegram no té cap programa assignat per a aquest bot. Ara anem a fer un programa que sigui capaç de rebre les comandes del bot i retornar una resposta. Quan entrem una comanda al bot, Telegram l'enviarà al programa. Aquest programa pot enviar informació al xat del bot. Farem servir els scripts de Google (Google Apps Script) per fer el programa del nostre bot. Atès que en molts casos acabarem necessitant un full de càlcul, farem l'script des d'un full. Si sabem segur que no ens cal el full de càlcul també podem crear l'script directament des del drive.

Obrim la nostra pàgina de Google Drive i creem un full de càlcul nou. A la primera filera posem els títols de les columnes. A la primera, per exemple, hi podem posar Dades. Serà convenient escriure un valor a la segona filera del full per poder fer proves. Un cop introduït, es veuria d'aquesta manera:

Columnes de la taula

També podríem fer servir un full de càlcul que contingui les respostes d'un formulari. Això ens permetria escriure en el full de càlcul tant des del formulari com des de l'script. En aquest cas, la primera columna del full de càlcul contindrà la marca de temps on es guarda la data i l'hora en la que s'ha respost el formulari.

Les pàgines i els serveis de Google canvien d'aspecte amb certa freqüència. Les imatges que trobarem en aquest apartat, per tant, poden no correspondre exactament amb les reals. Aquí l'important són els passos, no l'aspecte.

De moment, el nostre full de càlcul és només accessible per a ús personal. Si hi volem accedir des de fora ho haurem de canviar. Piquem sobre el botó Comparteix.... Se'ns obrirà una finestra en la que picarem el botó Opcions avançades. On s'indica Qui hi té accés hi deu dir Privat i ho hem de canviar per Activat: tothom que tingui l'enllaç i en el desplegable on diu Pot visualitzar haurem de triar Pot editar (en aquest cas ho podríem deixar a Pot visualitzar però llavors no podríem modificar el formulari des d'altres aplicacions). En aquesta finestra hi surt un enllaç que copiarem i ens guardarem en algun lloc, per exemple un document del bloc de notes. L'enllaç obtingut serà similar a aquest:

https://docs.google.com/spreadsheets/d/^^ThsoSjkeMSfwEKy4mn_4QEYH96sxv3VURqE3WHCTswDA/edit?usp=sharing

D'aquesta adreça ens interessa el codi de la taula, que és una seqüència llarga de caràcters situada entre barres. Aquí l'hem marcada en verd perquè sigui fàcil d'identificar. Piquem al botó Fet. Ara anem a la pestanya Fitxer i piquem sobre l'opció Publica al web.... Se'ns obrirà una finestra en la que picarem el botó Publica, acceptarem la confirmació i tancarem la finestra.

En el nostre full de càlcul, anirem a la pestanya Extensions i triarem l'opció Apps Script. Se'ns obrirà una finestra similar a la següent:

Vista del programa

Hem d'esborrar la funció buida myFunction i ens quedarà un espai en blanc, que serà on posarem el nostre programa. Aquest és l'script que farem servir:

// Funció per interaccionar amb el full de càlcul des de Telegram
// Oriol Boix, 2020   Basat en un exemple de Ferran Mas
// Sota llicència Creative Commons BY-NC-ND
// https://creativecommons.org/licenses/by-nc-nd/3.0/deed.es_ES
//
// Les variables següents ens permeten personalitzar l'script al nostre projecte
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 
// Adreça de l'script (ens la donen en el moment de publicar-lo)
var webAppUrl = "https://script.google.com/macros/s/^^fycbzXSTtXkzqyM_sABbEZanVX2EuRAIUB5xct53AXp6-MbLscpLHO/exec";
// Id del full de càlcul (l'obtenim quan el compartim)
var IdFull = "^^ThsoSjkeMSfwEKy4mn_4QEYH96sxv3VURqE3WHCTswDA";
// Funció que envia un text a Telegram
function sendText(chatId,text_env){  
  var cont = {
    method: "post",
    payload: {
      method: "sendMessage",
      chat_id: String(chatId),
      text: text_env,
      parse_mode: "HTML"
    }
  }
  UrlFetchApp.fetch(telegramUrl + '/', cont);
}
// Funció que s'executa quan l'script rep una ordre post
function doPost(e){ // Funció que rep les dades enviades, mitjançant post, per Telegram
  var fet = 0;
  var resposta = '';
  var dades = JSON.parse(e.postData.contents);  // Tracta les dades rebudes com a JSON i les guarda a dades
  // Extraiem les dades
  var text = dades.message.text;  // Recupera el text del missatge
  var id = dades.message.chat.id;  // Recupera l'identificador de la finestra des de la que s'ha enviat
  var id_usuari = dades.message.from.id; // Recupera l'identificador de l'usuari que ha escrit el missatge
  var id_missatge = dades.message.message_id; // Recupera l'identificador del missatge
  var lang = dades.message.from.language_code ;  // Llengua que l'usuari té configurada a Telegram 
  var nom_usuari = dades.message.from.first_name ;  // Recupera el nom de l'usuari que ha enviat el missatge
  var posicio = dades.message.location;  // Recupera la localizació de l'usuari, si és possible
  // La comanda pot tenir paràmetres, separats amb @
  // Descomposem el text rebut a partir de les @
  var comanda = text.split("@");  // Separa per les @
  var cmd = comanda[0];  // Comanda
  var par1 = comanda[1];  // Primer paràmetre
                          // Si esperem més paràmetres podem avegir més línies
  var sh = SpreadsheetApp.openById(IdFull);  // Obrim el full de càlcul
  var sheet = sh.getSheets();  // Agafem els fulls
  if (cmd == '/llistat'){
    var llista = "/llistat - Llista de les comandes disponibles\n";  // Text que es retornarà a Telegram
    llista = llista + "/guardar - Guarda un valor al full de càlcul\n";
    llista = llista + "/llegir - Llegeix el darrer valor guardat";
    sendText(id,llista);
    fet = 1;
  }
  if (cmd == '/guardar'){
    if (par1 == undefined){  // Si no hi ha el paràmetre
      resposta = "No s'ha rebut cap dada per guardar\n";
      resposta = resposta + "La sintaxi és /guardar@dada\n";
      resposta = resposta + "Per exemple: /guardar@22,4";
    } else {
      var camps = new Array(1);  // Valors per guardar a la taula
      camps[0] = par1;  // Valor que cal guardar
      sheet[0].appendRow(camps);   // Afegeix una fila amb la llista de dades en format matriu al primer full
      resposta = 'Valor guardat';
    }
    sendText(id,resposta);
    fet = 1;
  }
  if (cmd == '/llegir'){
    var full = sheet[0].getDataRange().getValues();  // Agafem els valors
    var rang = sheet[0].getLastRow();  // Índex de la darrera filera
    if (rang > 1){    // Si és 1 només hi ha els títols
      var filera = full[rang -1];    // Agafem la darrera filera
      resposta = filera[0];  // Dada que hi ha a la filera
    } else {
      resposta = "No hi ha cap dada guardada";
    }
    sendText(id,resposta);
    fet = 1;
  }
  // Si no hem entrat a cap if vol dir que la comanda no s'ha reconegut
  if (fet == 0){
    resposta = "Comanda incorrecta";
    sendText(id,resposta);
  }
}

Al començament de l'script hi ha algunes variables que hem de personalitzar amb les dades corresponents.

Un cop personalitzat el programa l'hem de guardar, picant el botó que es mostra a continuació.

Botó guardar

Picarem el botó Implementar.

Implementar

En el desplegable triarem Nueva implementación i s'obrirà una finestra similar a la següent:

Nueva implementación

El primer cop que ho fem, haurem de picar en el botó que es mostra a continuació.

Tipus

I triar l'opció Aplicación web. La finestra ens preguntarà en nom de qui volem que s'executi l'aplicació (li direm Yo) i qui hi té accés (li direm que qualsevol usuari). Finalment, picarem el botó Implementar.

Nueva implementación

Se'ns mostrarà una pantalla en la que se'ns indicarà l'adreça URL de l'aplicació, que haurem de copiar.

URL script https://script.google.com/macros/s/^^fycbxqrJpVA-KT1sUd8HIta643R3bH4ixpDahttayGSGjkpHUBjPQ/exec

Un cop estiguem, podem picar el botó Listo.

Atenció: Hem de recordar que cal guardar el programa (botó del disquet) abans d'implementar, si no ho fem ens implementarà la darrera versió guardada que no serà l'actual.

Important: ës probable que quan implementem l'script ens proporcioni una nova adreça diferent de l'anterior. Si és així, l'adreça antiga seguirà funcionant però executarà la versió anterior de l'script. És necessari, doncs, actualitzar l'adreça del programa cada cop que el modifiquem.

Ara que ja tenim l'script, li hem de dir a Telegram l'adreça per tal que el pugui executar quan s'enviïn comandes al bot de conversa. Per indicar a Telegram quina és l'aplicació a executar farem servir aquesta comanda:

https://api.telegram.org/bot^^34628844:AAFIpk-e7j3UZtYQYQaTduf4mPhnDqIcNXI/setWebhook?url=
    https://script.google.com/macros/s/^^fycbzXSTtXkzqyM_sABbEZanVX2EuRAIUB5xct53AXp6-MbLscpLHO/exec

El tros que està en groc és el token del bot de conversa i el que està en verd és l'adreça URL de l'script. Hem partit la instrucció perquè és molt llarga però caldria posar-la seguida al navegador, sense salts de línia.

Nota: Hi ha una manera més fàcil de crear el webhook

Hi ha altres comandes de Telegram accessibles des del navegador. Podem trobar la llista en aquesta pàgina.

 

 

 

 

 

 

 

 

 

 

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