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 ;)
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
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.
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
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.
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
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.
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
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.
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
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?
Ciao Pietro,
grazie del feedback!
Per rispondere alla tua domanda, certo, puoi provare con le espressioni regolari, dette anche Regex :)
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
Ciao Pietro,
in quel caso anziché effettuare il controllo con l'uguaglianza potresti utilizzare un'espressione regolare :)
Ora sto usando match e trovo le parole che voglio ma mi fa vedere sempre una sola riga....faccio altri tentativi...grazie
non ho capito come faccio a far eseguire il comando
A quale comando ti riferisci?
Lo spiego nel video. Nel mio canale puoi trovare anche altri video sul tema.
non capisco come faccio a far funzionare il tutto,
Lo spiego nel video. Nel mio canale puoi trovare anche altri video sul tema.
ho il mio bot come faccio far eseguire il comando apps scripts come nell'esempio
Non capisco ancora a quale comando ti riferisci. Se intendi in generale l'attivazione della funzione del bot, di attiva automaticamente appena viene inviato un messaggio su Telegram. Non si attiva a mano da Apps Script. Se con il messaggio non funziona significa che c'è un errore, nel bot o nel codice.
Ciao Michele, come posso ottenere più di una risposta se nel foglio di google ho due cocktail simili?
Mi spiego meglio:
Google Sheets:
Spritz Aperol
Spritz Campari
Vorrei inserire nel box di telegram "Spritz" e riceve come risposta entrambe le ricette, è possibile?
Ciao Francesco, in tal caso dovresti cercare il termine "Spritz" nel primo campo (non con la corrispondenza esatta ma esempio con "indexOf") all'interno del ciclo e ogni volta che viene trovata una corrispondenza concatenare il risultato nella variabile di output. Per questo motivo dovrà essere rimossa l'istruzione "break".
Ciao, prima di tutto i complimenti, ho seguito tutte le tue istruzioni e il bot ha funzionato bene per più di un mese, oggi all'improvviso ha smesso di funzionare, non so cosa sia successo, lo script è all'interno di un file excel, ma davvero non capisco e non so come risolverlo.
Grazie del tuo aiuto.
Ciao Raffaele, oggi per gli script c'è stato un problema dei servizi Google generale. Ho ricevuto diverse segnalazioni anche tramite altri canali. Il disservizio è stato mani a mano risolto, è probabile che qualche server sia ancora in fase di ripristino.
Come si fa a invocarla?
Scrivendo un messaggio su Telegram.