Node.js è una piattaforma di lavoro estremamente versatile. Sintassi sintetica, formalismi molto noti tutti
appartenenti alla famiglia JavaScript, particolarmente adatto alla realizzazione di servizi piccoli ed efficienti
da tenere in esecuzione in background: insomma, l'ideale per realizzare TelegramBot. In questa lezione, lo utilizziamo proprio in questa
veste mediante una libreria molto produttiva di nome Telegraf.
Come abbiamo già spiegato, il procedimento sarà piuttosto agevole, accompagnato dal BotFather. Dovremo:
- richiedere al BotFather l'inizializzazione di un nuovo Bot, fornendo il nome da
assegnargli ed un identificativo, terminante con il suffisso bot; - salvare il token che ci verrà assegnato dal BotFather che consisterà in una stringa piuttosto lunga.
Questa sarà da custodire gelosamente in quanto nostra chiave di accesso alle API Telegram; - installare la libreria di cui abbiamo bisogno ed iniziare a sviluppare il codice.
L'esempio che realizziamo consisterà in un convertitore di valuta euro/dollaro e sarà
contenuto nel file exchange.js. Fisseremo al suo interno due costanti in particolare: TOKEN cui dovremo assegnare
il valore del token che il BotFather ci ha assegnato; EXCHANGE che rappresenta un tasso di cambio euro/dollaro che abbiamo scelto.
Iniziare a lavorare con Telegraf
Per iniziare a lavorare al progetto dobbiamo avviarci come faremmo normalmente con Node.js. Per
prima cosa, creiamo una cartella e svolgiamo al suo interno le operazioni di inizializzazione con
npm:
$ npm init
e poi avviamo l'installazione della libreria in questo nuovo ambiente di lavoro con:
$ npm install telegraf --save
L'aspetto più interessante sarà che il Bot sarà individuabile da Telegram ovunque purchè inizializzi il
dialogo via Telegraf mediante il token. Ciò consentirà di effettuare i nostri esperimenti utilizzando anche un
semplice computer domestico: come si può immaginare, soluzioni di più ampia utenza richiederanno poi risorse adeguate
come server o piattaforme in Cloud.
Come primo esperimento, tanto per rompere il ghiaccio, creeremo un TelegramBot di tipo echo ovvero
uno di quei servizi che attendono input dall'utente per poi restituirlo: utilità pratica pari a zero ma esercizio ideale
per mettere alla prova il nostro ambiente di lavoro. Eccolo qui di seguito:
const Telegraf = require('telegraf')
const bot = new Telegraf('TOKEN FORNITO DA BOTFATHER')
bot.start((context) => {
console.log('Servizio avviato...')
context.reply('Servizio ECHO avviato')
})
bot.on('text', context=>{
text=context.update.message.text
context.reply('Hai scritto: '+text)
})
bot.launch()
Metteremo il tutto nel file echo.js e lo lanceremo con:
$ node echo.js
Ecco il suo funzionamento:
Come si vede occorrono pochissime righe. Inizializziamo Telegraf passando come argomento del costruttore
il token che il BotFather ci ha fornito. In questo modo avremo il nostro bot che dovremo semplicemente
programmare per reagire agli eventi. Qui abbiamo utilizzato due metodi: con start impostiamo
il messaggio di benvenuto per l'utente che si collega al bot; con on impostiamo la reazione all'immissione di
testo.
Notiamo che nel codice relativo a on trattiamo un oggetto di nome context che contiene tutte le
informazioni ricevute dal bot. Con l'espressione context.update.message accediamo al messaggio trovandone il
testo (proprietà text), il timestamp (informazione data/ora) ed una serie di ulteriori aspetti.
Oltre a questi metodi ne esistono altri come hears che resta in attesa di una parola specifica e command che
riconosce un comando Telegram introdotto dal simbolo slash (/). Visto che di quest'ultimo faremo uso
nell'esempio del convertitore di valuta, vediamo velocemente un utilizzo possibile di hears. Nel codice che
segue viene usato per indicare al bot come reagire alla stringa "ciao":
bot.hears('ciao', message=> {
message.reply('Ci ha salutato')
})
Così quando verrà inviato un messaggio contenente solo "ciao", otterremo come messaggio di risposta: "Ci ha salutato".
Esempio: convertitore di valuta
Il convertitore di valuta che realizziamo si basa sull'uso di due comandi: /euro accompagnato da un valore in
euro che sarà convertito in dollari e /usd per l'operazione inversa. Il tasso di cambio sarà fissato nella
costante EXCHANGE come anticipato sebbene per un bot realistico dovremmo ottenere l'informazione aggiornata via Rete.
Realizziamolo:
const Telegraf = require('telegraf')
const bot = new Telegraf('TOKEN FORNITO DA BOTFATHER')
const EXCHANGE=1.125
bot.start((message) => {
return message.reply('Il bot è avviato')
})
bot.command('eur', context=> {
msg=context.update.message
importo=msg.text.split(' ')[1]
dollari=EXCHANGE*importo
context.reply(`${dollari} USD`)
})
bot.command('usd', context=> {
msg=context.update.message
importo=msg.text.split(' ')[1]
euro=importo/EXCHANGE
context.reply(`${euro} EUR`)
})
bot.launch()
Quello che si vede in figura è una prova del bot:
La struttura dell'esempio è del tutto simile a quanto visto per il servizio echo con la differenza che
qui faremo maggiore uso del metodo command. Per ogni comando, svolgeremo le operazioni necessarie
per poi restituire il messaggio all'utente con il metodo reply.