Bots de conversa de Telegram amb Google Apps Script

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

Llegir el text contingut en una foto

En aquest exemple el bot de conversa esperarà que li enviem una fotografia i, quan la rebi, farà servir el reconeixement òptic de caràcters (OCR) per obtenir el text que la imatge pugui contenir. Cal preveure la possibilitat que la funció retorni una cadena buida en cas que la imatge no tingui cap text reconeixible.

També hem previst el cas que el bot de conversa pugui rebre una comanda de tipus text (en aquest cas, la comanda /help) però en podria rebre altres si modifiquem el programa convenientment.

En aquest exemple s'empra el servei Drive. Si és la primera vegada que el fem servir al nostre entorn de Google Apps Script ens caldrà habilitar-lo.

var token = "^^80216110:AAENhGXmFe3ezDo0TDfSJYA8z_KfxYRrMqs"; // API Token de Telegram 
var telegramUrl = "https://api.telegram.org/bot" + token;  // Url que comunica nuestro bot con Telegram 
function doPost(e){
  var data = JSON.parse(e.postData.contents);  // Llegeix les dades rebudes per JSON i les guarda
  var realitzat = false;
  var id = data.message.chat.id;  // Identificador de la finestra on s'ha escrit el missatge 
  if(data.message.text){  // Si s'ha enviat una imatge
    var text = data.message.text;  // El text enviat
    var comanda = text.split(" ");  // Separem els paràmetres 
    var cmd = comanda[0];
    if(cmd == "/help"){
      realitzat = true;
      var resposta = "Si envies una imatge que contingui text, el bot et tornarà aquest text.";
      sendText(id,resposta);
    }
  }
  if(data.message.photo){  // Si s'ha enviat una imatge
    realitzat = true;
    var textImg = TextOcr(data.message.photo);
    // Enviem el text a Telegram
    if(textImg.length == 0){
      textImg = "La imatge no conté cap text reconeixible";
    }
    sendText(id,textImg);
  }
  if (!realitzat){
    var resposta = "Comanda desconeguda";
    sendText(id,resposta);
  }
}
function TextOcr(foto){
  try{
    // La foto es recull en forma de vector
    // Normalment el darrer element del vector és el que té millor resolució
    var llarg = foto.length;
    var fitxer = foto[llarg - 1].file_id;
    // Demanem la imatge a Telegram
    var url_document = telegramUrl + "/getFile?file_id=" + fitxer;
    // Recollim la imatge rebuda
    var document = UrlFetchApp.fetch(url_document);
    // Recull el text rebut
    var json_document= document.getContentText();
    // Tracta el JSON rebut
    var dades = JSON.parse(json_document);
    // Ruta del document
    var ruta_document = dades.result.file_path;
    // Adreça completa del fitxer
    var documentUrl = "https://api.telegram.org/file/bot" + token + "/" + ruta_document;
    // Agafem el BLOB de la imatge
    var imatge = UrlFetchApp.fetch(documentUrl).getBlob();
    var file = {
          title: 'OCR File',
          mimeType: 'image/png'
        };  // configurem el nom i el tipus del document 
    // Guardem la image en un document de Google Drive amb l'opció d'OCR activada
    file = Drive.Files.insert(file, imatge, {ocr: true});
    // Obrim el fitxer
    var doc = DocumentApp.openById(file.id);
    // Llegim el text del Document
    var text_igm = doc.getBody().getText();
    // Un cop llegit el text, marquem el fitxer com a esborrat
    DriveApp.getFileById(file.id).setTrashed(true);
    return text_igm;
  } catch(err){
    return err; 
  }  
}
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);
}

Si emprem Telegram en un dispositiu mòbil, enviarem la fotografia picant la icona del clip

Clip

i triant quina és la imatge que volem enviar. Si fem servir Telegram a l'ordinador, a més de l'opció ja comentada, podem arrossegar la imatge sobre el xat corresponent i se'ns presentaran diverses opcions

Telegram

i triarem la que fa referència a fotografies.

Si li enviem la imatge següent:

Cartell

Obtindrem el següent resultat:

RECOLLIR TIQUET
RECOGER TIQUE PRENDRE LE TICKET
TAKE A TICKET

 

 

 

 

 

 

 

 

 

 

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