JavaScript, HTML, CSS e... !
14 commenti

Risponde in Modo Automatico agli Utenti

Bot di Telegram che Sceglie i Messaggi da un Foglio Google

Abbiamo visto in altri miei video come bastano 5 minuti per creare un semplice Bot di Telegram, come inviare immagini in automatico da parte del Bot e come salvare in un Foglio Google i messaggi che gli utenti scrivono nella chat.

In questo video voglio mostrarti come istruire il Bot in modo da rispondere in modo dinamico ai messaggi dell'utente, per farlo il Bot analizzerà il testo del messaggio ricevuto e cercherà in un Foglio Google la risposta appropriata da fornire.

Ho predisposto in uno Spreadsheet una lista di cocktail con i relativi ingredienti e le istruzioni per prepararli, ovviamente si tratta di un esempio e l’elenco non è esaustivo.

Lo scopo di questo bot è quello di ricevere in ingresso il nome di un drink e fornire all’utente le opportune informazioni per poterlo preparare.

Il nome del foglio dove ho inserito tali dati è 'Foglio2', il 'Foglio1' invece è attualmente vuoto e lo utilizzerò per salvare i messaggi che gli utenti scrivono nella chat, può essere molto utile ad esempio per verificare quale cocktail è più richiesto rispetto ad altri o per verificare se gli utenti richiedono qualcosa che non ho previsto e nel caso integrare la lista.

Spero che questo video ti sia piaciuto, nel prossimo tutorial sull'argomento ti mostrerò come ottenere queste informazioni in modo dinamico interrogando direttamente un servizio esterno, senza bisogno di scriverle in uno Spreadsheet. Ti invito pertanto a iscriverti al mio Canale YouTube se ancora non l'hai fatto e a lasciarmi un commento se hai un dubbio, un suggerimento o un argomento che ritieni interessante e che vorresti fosse trattato in tutorial.

Di seguito il codice mostrato nel video:

var token = getTokenId(); // ho nascosto il valore del token nel file token_id.gs per non mostrarlo a video
var telegramUrl = "https://api.telegram.org/bot" + token; 
var webAppUrl = "https://script.google.com/macros/s/TUO_ID_APPLICAZIONE/exec"; 

function setWebhook() {
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
  var response = UrlFetchApp.fetch(url);
}

function sendMessage(chat_id, text) {
  var url = telegramUrl + "/sendMessage?chat_id=" + chat_id + "&text="+ text;
  var response = UrlFetchApp.fetch(url);
}

function doPost(e) {
  var contents = JSON.parse(e.postData.contents);
  var chat_id = contents.message.from.id; 
  var user = contents.message.chat.first_name + " " + contents.message.chat.last_name;
  var answer = "Ciao " + user + ". Scrivi il nome di un cocktail e ti dirò come prepararlo!";
  var text = contents.message.text;

  var ssId = "SPREADSHEET_ID";
  var sh2 = SpreadsheetApp.openById(ssId).getSheetByName("Foglio2");
  var sh2range = sh2.getRange(1, 1, sh2.getLastRow(), sh2.getLastColumn());
  var sh2values = sh2range.getValues();
  var sh2values_len = sh2values.length;
  var cocktail_nome;
  for (i=0; i<sh2values_len; i++) {
    cocktail_nome = sh2values[i][0]+'';
    if (text.toLowerCase() == cocktail_nome.toLowerCase()) {
      answer = "Ingredienti: " + sh2values[i][1] + '.' + '%0A' + "Preparazione: " + sh2values[i][2];
      break;
    }
  }

  sendMessage(chat_id, answer);
  SpreadsheetApp.openById(ssId).getSheetByName("Foglio1").appendRow([new Date(), chat_id, user, text]);
}

Per il momento ti saluto e a presto, ciao ;)

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

14 Commenti

  1. giovedì 5 agosto 2021 alle ore 12.10 Franco

    Ho notato che se in una cella ho un testo su piu' linee (separato da ctrl+enter) la funzione che dovrebbe mostrare su telegram il contenuto della cella stessa, non funziona.. Come posso risolvere ?
    Grazie

    Rispondi a questo commento
    • sabato 7 agosto 2021 alle ore 09.50 Michele PisaniAutore

      Ciao Franco,
      in questo caso proverei a processare la stringa in ingresso con il metodo replace per sostituire il carattere a capo con uno spazio e vedere se il problema si risolve.

      Rispondi a questo commento
  2. venerdì 6 maggio 2022 alle ore 10.49 Isac

    Ciao Michele, i tuoi tutorial sono fantastici!!! grazie.
    Mi piacerebbe realizzare, un bot telegram che scova le offerte sul sito di Amazon, e poi le pubblichi in automatico ogni 10 minuti, all'egando al link l'ID di affiIiazione Amazon, il tutto in Canale telegram.
    Riusciresti a fare un tutorial il merito?
    Ringrazio per l'attenzione

    Rispondi a questo commento
    • venerdì 6 maggio 2022 alle ore 21.28 Michele PisaniAutore

      Ciao Isac,
      grazie dei complimenti! :)
      Quello che chiedi è un progetto vero e proprio di una certa complessità e che richiede particolari specifiche. Sicuramente tra i video tutorial e i post nel blog puoi riuscire a trovare qualche spunto interessante per adattare i relativi concetti e parti di codice da integrare al progetto che vuoi realizzare.

      Rispondi a questo commento
  3. martedì 12 luglio 2022 alle ore 09.37 Andrea

    Buongiorno Michele,

    grazie di cuore per questa guida. Ho utilizzato il tuo script apportando un paio di modifiche in modo che il bot possa rispondere a un messaggio da un gruppo.
    Per la variabile chat_id: var chat_id = contents.message.chat.id; ho modificato da "from" a "chat".
    Mi ritrovo però con un problema. Se interrogo il bot in privato, il sistema funziona perfettamente, mentre se provo a chiamarlo da un gruppo telegram (per esempio: /nomebot testo), viene preso la riga intera e quindi mi restituisce un errore non trovando nulla in google sheet. Come posso fare in quel caso a dire al bot di prendere solo il testo (senza la chiamata "/nomebot")?

    Grazie mille,
    Andrea

    Rispondi a questo commento
    • martedì 12 luglio 2022 alle ore 12.19 Michele Pisani

      Ciao Andrea,
      non conosco la riga nella sua interezza, ad ogni modo se c'è una parte fissa da eliminare, come ad esempio "/nomebot", puoi giocare con i metodi per le stringhe, ad esempio con replace per sostituire il testo di interesse con un valore vuoto.

      Rispondi a questo commento
  4. martedì 23 agosto 2022 alle ore 11.17 Gianluca Carriere

    Grazie mille per i tutorial. Ho seguito passo passo le preziose indicazioni ma non riesco ad avviare il tutto perchè visualizzo il seguente messaggio di Errore

    TypeError: Cannot read property 'postData' of undefined
    doPost @ Codice.gs:16

    come risolverlo?
    grazie mille

    Rispondi a questo commento
    • martedì 23 agosto 2022 alle ore 19.36 Michele PisaniAutore

      Ciao Gianluca, dall'errore sembra che tu stia eseguendo la funzione a mano dall'editor di script. La funzione doPost(e) deve essere invocata dal Bot, altrimenti la variabile 'e' non contiene dati che risulteranno, appunto, undefined.

      Rispondi a questo commento
      • domenica 20 novembre 2022 alle ore 18.13 pietro

        ciao proprio oggi sta capitando anche a me ...fino a ieri eseguivo la funzione da script senza errore..... non mi pare di aver fatto qualcosa di diverso ma ora non mi va e non mi salva le modifiche
        faccio altre prove

  5. venerdì 11 novembre 2022 alle ore 07.17 Pietro

    Ciao fantastico questo tutorial ..volevo domandare una cosa nella ricerca del testo
    if (text.toLowerCase() == cocktail_nome.toLowerCase())
    Invece di cercare un testo uguale tipo è possibile cercare un testo che contenga più cose anche in ordine diverso nella stessa cella?

    Rispondi a questo commento
    • venerdì 11 novembre 2022 alle ore 12.50 Michele PisaniAutore

      Ciao Pietro,
      grazie del feedback!
      Per rispondere alla tua domanda, certo, puoi provare con le espressioni regolari, dette anche Regex :)

      Rispondi a questo commento
  6. martedì 15 novembre 2022 alle ore 19.51 Pietro

    Ciao torno a domandare un altra cosa...
    Se volessi che fossero inviati più coktail?
    Nel caso ce ne fossero 2 con nomi simili ad esempio per visualizzarli entrambi su telegram intendo...ancora grazie per il tuo lavoro

    Rispondi a questo commento
    • martedì 15 novembre 2022 alle ore 22.47 Michele PisaniAutore

      Ciao Pietro,
      in quel caso anziché effettuare il controllo con l'uguaglianza potresti utilizzare un'espressione regolare :)

      Rispondi a questo commento
      • mercoledì 16 novembre 2022 alle ore 07.10 Pietro

        Ora sto usando match e trovo le parole che voglio ma mi fa vedere sempre una sola riga....faccio altri tentativi...grazie

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web