Tutorial > Come creare un Bot per Telegram con Node.js su Ubuntu 18.04

Come creare un Bot per Telegram con Node.js su Ubuntu 18.04

Pubblicato il: 19 marzo 2020

Sviluppo Ubuntu

Telegram è una piattaforma di messaggistica instantanea di ultima generazione, completamente open source. Tra le diverse funzionalità che la piattaforma mette a disposizione, vi è la possibilità di realizzare Bot personalizzati, in grado di interfacciarsi con gli utenti in maniera del tutto automatica.

I bot sono in grado di ricevere sotto forma di richieste HTTP i comandi impartiti dall’utente attraverso la chat di Telegram e di rispondere con determinate azioni. Le API di comunicazione con Telegram sono infatti fruibili attraverso il protocollo HTTP, come descritto nella documentazione ufficiale presente all’indirizzo https://core.telegram.org/bots.

Nel seguente tutorial vedremo come utilizzare i mezzi messi a disposizione per creare su un server Linux Ubuntu 18.04 un bot molto semplice in grado di rispondere con il testo ricevuto, alterandolo leggermente. Utilizzeremo “superagent” come client HTTP per effettuare le richieste necessarie.

Creare il bot attraverso BotFather

Per poter creare un nuovo bot, dobbiamo utilizzare il bot di Telegram chiamato “BotFather”, raggiungibile attraverso un client Telegram cercando il nome “@BotFather” oppure visitando il link https://t.me/botfather.

Dopo aver aperto la chat con BotFather, clicca sul tasto “Avvia” e digita:
/newbot
Il bot ti chiederà un nome per il tuo nuovo bot, nel nostro caso inseriremo “node-tg-bot”:
“Alright, a new bot. How are we going to call it? Please choose a name for your bot.”

node-tg-bot
A questo punto ti verrà chiesto un username per il tuo bot (che deve terminare con “_bot”):
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

aruba_tutorial_bot

Dopo aver inserito il nome ufficiale del bot, BotFather ti risponderà con il token di accesso necessario per effettuare le richieste HTTP: conservalo senza divulgarlo.

Done! Congratulations on your new bot. You will find it at t.me/aruba_tutorial_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
855911470:AAHQ8QmbktoSV5zFSXYEXUw8sJLBbbLT97I
Keep your token secure and store it safely, it can be used by anyone to control your bot.

Installare Node.js

Per prima cosa dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.

Installa Node.js tramite apt facendo attenzione a scaricare l'ultima versione disponibile. Per farlo aggiorna i tuoi repository in questo modo:

$ sudo apt update && apt install nodejs

Ora puoi passare all'installazione di NPM ovvero il Node Package Manager che ti servirà per installare moduli aggiuntivi per Node.js

$ sudo apt install npm

Prima di procedere è meglio aggiornare anche node con l’ultima versione stabile, lanciando i seguenti comandi:

$ sudo npm cache clean -f 
$ sudo npm install -g n 
$ sudo n stable
$ PATH="$PATH"

In seguito verifica la corretta installazione di Node.js mediante il comando:

$ node -v

Se l'installazione è riuscita correttamente allora verrà visualizzata a schermo la versione installata.

Creare l'applicazione server

Per creare un’applicazione compatibile con gli standard previsti da Node.js, devi prima di tutto inizializzare una configurazione base di NPM. Crea quindi una cartella per il progetto (in questo esempio la chiameremo node-tg-bot) e avvia i comandi da console dentro la cartella appena creata:

cd /var/
sudo mkdir node-tg-bot
cd node-tg-bot
npm init

Si avvierà una procedura guidata per la creazione di un file package.json, che conterrà tutte le informazione di base sul progetto e le sue dipendenze.

Utilizza i valori suggeriti per andare avanti, come sotto indicato:

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (node-tg-bot)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to package.json:

{
  "name": "node-tg-bot",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes) yes

Rispondi affermativamente per completare la procedura.

Prosegui quindi installando il modulo “superagent” che sarà utilizzato per effettuare le richieste HTTP:

npm install --save superagent

Aggiungendo il parametro --save , indichi a NPM di aggiornare package.json e aggiungere questa dipendenza al progetto.

Puoi quindi procedere a creare il punto di ingresso per l'applicazione, creando il file index.js nella stessa directory di package.json.

Utilizza il tuo editor di testo preferito per incollare il seguente contenuto nel file appena creato. Si tratta di un semplice script di test che elaborerà il messaggio ricevuto dall'utente su Telegram e risponderà modificando in maiuscolo tutto il testo ricevuto.

/**
 * Importiamo superagent, libreria che ci permette di effettuare
 * richieste HTTP
 */
const   superagent      = require( 'superagent' );

/**
 * Memorizziamo in token restuito dal BotFather
 */
const   botToken        = '855911470:AAHQ8QmbktoSV5zFSXYEXUw8sJLBbbLT97I';

/**
 * Salviamo l'indice dell'ultimo messaggio ricevuto
 */
let     lastOffset      = 0;


/**
 * Elabora gli aggiornamenti ricevuti da Telegram e risponde al messaggio
 * ricevuto, modificando in maiuscolo il testo ricevuto
 * @param {Update} msg Struttura "Update" ( Vedi https://core.telegram.org/bots/api#update )
 */
function parseMessage( msg ){
    try {
        
        const upperCaseReponse = encodeURIComponent( msg.message.text.toUpperCase() );

        // Vedi metodo https://core.telegram.org/bots/api#sendmessage

        superagent.get(`https://api.telegram.org/bot${botToken}/sendMessage?chat_id=${msg.message.chat.id}&text=${upperCaseReponse}`)
            .then( response => {
            });
        
    } catch( e ){
        console.error( e );
    }
}

function requestUpdate(){

    // Vedi metodo https://core.telegram.org/bots/api#getupdates

    superagent.get(`https://api.telegram.org/bot${botToken}/getUpdates?limit=1&offset=${lastOffset}`)
        .then( msg => {

            try {

                msg.body.result.map( inputMessage => {

                    // Aggiorniamo l'offset con l'ultimo messaggio ricevuto
                    lastOffset = inputMessage.update_id +1;

                    // Elaboriamo il testo ricevuto
                    parseMessage( inputMessage );
                });

            } catch( e ){
                console.error( e );
            }

            // Programmiamo la lettura dei prossimi message fra 2 secondi
            setTimeout( () => {
                requestUpdate();
            } , 2000 );

        });

}

// Avviamo la prima lettura dei messaggi
requestUpdate();

Completa la procedura installando le dipendenze del progetto, digitando il comando:

sudo npm install

Avviare il Bot

Per avviare il tuo bot e tenerlo in vita in maniera persistente, devi utilizzare l’applicazione Forever: un software in grado di eseguire e mantenere in vita script, anche in caso di arresto.

Installa Forever utilizzando NPM:

sudo npm install -g forever

Avvia quindi la tua app:

forever start index.js

Verificare la funzionalità del Bot

A questo punto puoi testare la funzionalità del bot utilizzando un client Telegram, cercando il tuo bot utilizzando il nome “@node-tg-bot”.

Dopo aver aperto la chat, clicca sul tasto “Avvia” e prova digitare un messaggio di prova. Se il bot ti risponde con lo stesso messaggio ma in maiuscolo, vuol dire che sta funzionando correttamente.