Come avviare un Bot di Telegram con PHP

Se stai leggendo questo, sai che i bot di chat sono una delle più grandi tendenze tecnologiche del 2016.

La rivoluzione dei bot non riguarda solo l'intelligenza artificiale. Un bot può essere uno strumento nel tuo messenger con una semplice interfaccia di chat che può essere utilizzata per estendere la funzionalità di siti o servizi o può anche essere un'applicazione autonoma. I robot sono più economici da sviluppare e più facili da installare, e un'altra grande caratteristica è che i messenger possono essere utilizzati su qualsiasi tipo di dispositivo: laptop, smartphone e tablet. Ecco perché ora tutti sono pazzi dei bot.

E il più grande messenger con un'API bot aperta è Telegram.

Cosa stiamo andando a fare

In questo articolo creeremo un semplice robot per il cronometro di Telegram. Ti mostrerò come creare il tuo bot, connetterti con l'analisi, scrivere del codice e infine aggiungere il tuo bot in un bothop.

A proposito, ho già preparato una demo, quindi puoi testarla semplicemente aggiungendo @stopwatchbot alla tua lista di contatti di Telegram.

Crea un Bot con BotFather

Il primo passo per creare un bot è registrare l'account del tuo bot in Telegram. E c'è un bot per questo, chiamato BotFather. Aggiungilo al tuo elenco di contatti e sarai in grado di creare e configurare i bot di Telegram, semplicemente digitando il / newbot comando e seguendo le istruzioni di BotFather.

Dopo aver registrato il tuo nuovo bot, riceverai un messaggio di congratulazioni con un token di autorizzazione. Presto utilizzeremo questo token per autorizzare un bot e inviare richieste all'API Bot.

Successivamente è possibile utilizzare BotFather per aggiungere descrizioni o foto ai profili dei bot, rigenerare token, impostare elenchi di comandi da utilizzare, eliminare account e così via. Per ottenere un elenco completo di comandi, digita semplicemente /Aiuto in una chat per ottenere una lista dei comandi di BotFather.

Connettiti a Botan Analytics

Non vi è alcuna analisi incorporata nell'API di Telegram Bots, ma è importante sapere quanti utenti hai, come agiscono e quali comandi attivano di più. Ovviamente, possiamo raccogliere queste informazioni utilizzando il nostro motore, ma se vogliamo concentrarci sulle funzionalità dei bot, non sulle metriche, abbiamo solo bisogno di utilizzare una soluzione pronta all'uso.

E c'è un semplice strumento per connettere il tuo bot all'analisi, chiamato Botan. È basato su Yandex AppMetric e completamente gratuito. Usando Botan, puoi segmentare il tuo pubblico, ottenere informazioni sui profili degli utenti, ottenere il comando più usato e ottenere bellissimi grafici direttamente nel tuo messenger, in questo modo:

Per iniziare, è necessario registrare il bot in Botan e ottenere un token. E ancora, puoi farlo con un bot, BotanioBot:

Basta fare clic sul tasto "Aggiungi bot" sulla tastiera di dialogo, digitare il nick del tuo bot e otterrai il tuo token di traccia bot. Ora Botanio è pronto per monitorare i tuoi eventi bot e puoi ottenere statistiche da utenti, sessioni, ritenzione ed eventi direttamente nel tuo messenger.

Crea e registra un Webhook SSL

In Telegram ci sono due modi per ottenere messaggi dai tuoi utenti: lunghi sondaggi e webhook.

In sostanza, con il polling lungo, è necessario richiedere nuovi messaggi dall'API e con i webhooks si imposta una richiamata che l'API Telegram chiamerà se arriva un nuovo messaggio da un utente. Preferisco usare webhooks perché sembra una comunicazione in tempo reale, quindi in questo articolo useremo anche questo metodo. Ora dobbiamo scegliere un URL di callback per il nostro webhook, che deve essere raggiunto con il protocollo HTTPS, e dobbiamo impostarlo in modo sicuro, quindi nascondere lo script in un percorso segreto, come dice il manuale:

Se desideri assicurarti che la richiesta di Webhook provenga da Telegram, ti consigliamo di utilizzare un percorso segreto nell'URL, ad es.. https://www.example.com/. Dato che nessun altro conosce il token del tuo robot, puoi essere sicuro che siamo noi.

Se il tuo certificato SSL è attendibile, tutto ciò che devi fare è aprire questo URL nel tuo browser:

https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]

Altrimenti devi generare un certificato autofirmato. Ecco un esempio del comando su Linux per questo:

openssl req -newkey rsa: 2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj "/ C = IT / ST = stato / L = posizione / O = descrizione / CN = yourdomain.com"

E non dimenticare di aprire la porta SSL:

sudo ufw consentire 443 / tcp

Per verificare il certificato e impostare il dominio webhook su trusted, è necessario caricare il certificato della chiave pubblica:

curl \ -F "url = https: //yourdomain.com/path/to/script.php" \ -F "certificato = / percorso / a / certificato.key" \ "https://api.telegram.org/ Bot [Token] / setwebhook"

Finalmente avrai una risposta JSON come questa:

"ok": true, "result": true, "description": "Webhook è stato impostato"

Dice che il webhook è stato impostato e siamo pronti per avviare il motore del bot.

Costruisci un database

Ora abbiamo bisogno di costruire un database per i nostri timer. Che cosa abbiamo bisogno di archiviare? Quando un utente comanda di avviare il cronometro, prenderemo l'ID della chat e salveremo una riga con l'ID della chat e l'ora corrente di Unix, che è il numero di secondi tra ora e l'inizio di Unix Epoch, che è il 1 gennaio 1970 a UTC. Di conseguenza, salveremo una riga con l'ID della chat e il timestamp intero dell'intervallo corrente di Unix.

Per mostrare il tempo attuale del cronometro, otterremo il timestamp salvato e lo confronteremo con il timestamp corrente. La differenza sarà l'ora corrente in secondi. Se l'utente interrompe il timer, elimineremo semplicemente la riga con l'ID della chat corrente.

Quindi creiamo un database e una tabella per memorizzare le informazioni del cronometro:

CREATE TABLE SE NON ESISTE 'cronometro' ('chat_id' int (10) non firmato NOT NULL, 'timestamp' int (10) non firmato NOT NULL, PRIMARY KEY ('chat_id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Crea una classe di cronometro

Finalmente siamo pronti per iniziare la programmazione. Creiamo una classe per lavorare con il database in un file chiamato stopwatch.php e inizia con un costruttore che imposterà due variabili private, dove memorizzeremo l'ID della chat e l'attuale connessione MySQL:

cronometro di classe / ** @var mysqli * / private $ mysqli; / ** @var int * / private $ stopwatch_id; / ** * Costruttore cronometro * @param mysqli $ mysqli * @param $ stopwatch_id * / funzione pubblica __costruct (\ mysqli $ mysqli, $ stopwatch_id) $ this-> mysqli = $ mysqli; $ this-> stopwatch_id = intval ($ stopwatch_id); 

Quando l'utente inizia il timer, otterremo l'ora corrente di Unix e la salveremo in fila con l'ID della chat, quindi ecco il inizio() metodo:

funzione pubblica start () $ timestamp = time (); $ query = "INSERT INTO 'stopwatch' ('chat_id', 'timestamp') VALUES ('$ this-> stopwatch_id', '$ timestamp') ON DUPLICATE KEY UPDATE timestamp = '$ timestamp'"; restituire $ this-> mysqli-> query ($ query); 

Se il timer si interrompe, è necessario eliminare una riga dal database:

/ ** * Elimina riga con ID cronometro * @return bool | mysqli_result * / public function stop () $ query = "DELETE FROM 'stopwatch' WHERE 'chat_id' = $ this-> stopwatch_id"; restituire $ this-> mysqli-> query ($ query); 

E ora per la parte principale della classe. Quando l'utente richiede lo stato del timer, dobbiamo trovare la riga con il cronometro dalla conversazione corrente e calcolare la differenza in secondi tra l'ora Unix salvata e l'ora corrente. Fortunatamente, il tempo di Unix è un numero intero, quindi possiamo semplicemente sottrarre un valore da un altro. Per formattare il valore risultante come un tempo, useremo il gmdate funzione.

/ ** * Trova riga con ID cronometro e differenza di ritorno in secondi da ora Unix salvata e ora corrente * @return stringa * / stato funzione pubblica () $ query = "SELECT 'timestamp' FROM 'cronometro' WHERE 'chat_id' = $ this-> stopwatch_id "; $ timestamp = $ this-> mysqli-> query ($ query) -> fetch_row (); if (! empty ($ timestamp)) return gmdate ("H: i: s", time () - reset ($ timestamp)); 

Come puoi vedere, se non c'è alcun valore nel database, il metodo stato() non restituirà nulla e elaboreremo un valore nullo come un timer fermato.

Scegliere una libreria PHP

Esistono molte librerie PHP che esistono per funzionare con l'API di Telegram, ma, almeno al momento della stesura di questo articolo, ce n'è solo una che supporta sia il wrapper API di Telegram Bot che il tracciamento di Botan. E si chiama PHP Telegram Bot API.

Usa Composer per installare questa libreria:

il compositore richiede telegram-bot / api

Se non ti interessa utilizzare l'analisi, prova l'SDK PHP API di Telegram Bot con l'integrazione di Lavarel o il Bot di Telegram PHP.

Avvia lo script Webhook

E ora inizia la parte principale: creeremo uno script per elaborare i callback dall'API Bot di Telegram. Avvia un file chiamato index.php e include il caricamento automatico di Composer e una nuova classe di cronometro. Apri una connessione MySQL, crea un nuovo client API di Telegram ed eseguilo:

require_once 'vendor / autoload.php'; require_once 'stopwatch.php'; // connettersi al database $ mysqli = new mysqli ('database_host', 'database_user', 'database_password', 'database_name'); if (! empty ($ mysqli-> connect_errno)) lancia new \ Exception ($ mysqli-> connect_error, $ mysqli-> connect_errno);  // crea un bot $ bot = new \ TelegramBot \ Api \ Client ('bot_token', 'botanio_token'); // run, bot, run! $ Bottiglie aperte> run ();

Creare comandi

Ora abbiamo bisogno di configurare un bot per rispondere al comando /inizio. Questo comando viene utilizzato per avviare tutti i robot di Telegram e agli utenti verrà mostrato il nostro messaggio di benvenuto quando inizia la prima chat.

$ bot-> command ('start', funzione ($ message) use ($ bot) $ answer = 'Salve! Benvenuto al cronometro Utilizza comandi bot o tastiera per controllare il tuo tempo.'; $ bot-> sendMessage ( $ message-> getChat () -> getId (), $ answer););

Qui, nel comando() metodo, abbiamo definito una chiusura per ricevere un comando. Questa chiusura ottiene l'ID della chat corrente e invia un messaggio di benvenuto. Inoltre, tutti i comandi registrati vengono tracciati automaticamente come nome del comando.

Per avviare il cronometro, definiremo il /partire comando:

$ bot-> command ('go', funzione ($ message) usa ($ bot, $ mysqli) $ cronometro = nuovo cronometro ($ mysqli, $ message-> getChat () -> getId ()); $ cronometro- > start (); $ bot-> sendMessage ($ message-> getChat () -> getId (), 'Stopwatch avviato. Go!'););

Questo creerà un'istanza della classe Cronometro e avvierà un timer chiamando il inizio() metodo che abbiamo già definito.

Per definire il /stato comando, dobbiamo fare la stessa cosa Basta chiamare il stato() metodo e restituire il risultato. Se il metodo restituisce null, informa l'utente che il timer non è stato avviato.

$ bot-> command ('status', function ($ message) usa ($ bot, $ mysqli) $ stopwatch = new Cronometro ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); if (vuoto ($ answer)) $ answer = 'Il timer non è avviato.'; $ bot-> sendMessage ($ message-> getChat () -> getId (), $ answer ););

E se l'utente arresta il timer, dobbiamo prima ottenere lo stato, mostrare il tempo risultante e fermare il timer usando il Stop() metodo.

$ bot-> command ('stop', funzione ($ message) usa ($ bot, $ mysqli) $ stopwatch = new Cronometro ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); if (! empty ($ answer)) $ answer = 'Il tuo tempo è'. $ answer. PHP_EOL; $ stopwatch-> stop (); $ bot-> sendMessage ($ message- > getChat () -> getId (), $ answer. 'Il cronometro si è fermato. Buon divertimento!'););

Questo è tutto! Ora puoi caricare tutti i file nella directory webhook e testare il tuo bot.

Aggiungere una tastiera

Per suggerire all'utente quali comandi può essere eseguito, possiamo aggiungere una tastiera a un messaggio. Il nostro cronometro può essere in esecuzione o fermato e ce ne saranno due per ogni stato. Per mostrare una tastiera all'utente, abbiamo solo bisogno di estendere il invia messaggio() metodo:

$ keyboard = new \ TelegramBot \ Api \ Types \ ReplyKeyboardMarkup ([['/ go', '/ status']], null, true); $ bot-> sendMessage ($ message-> getChat () -> getId (), $ answer, false, null, null, $ keyboards); );

Ora puoi aggiungere tastiere ad ogni comando del tuo bot. Non includerò un esempio completo qui, ma puoi vederlo nelle pagine del repository.

Aggiungere il tuo Bot a un negozio

Ok, ora abbiamo un robot funzionante e vogliamo mostrarlo al mondo. Il modo migliore è registrare il bot in un catalogo di bot. Per ora, Telegram non ha un catalogo ufficiale come questo, ma ce ne sono alcuni non ufficiali, e il più grande è Storebot.me, dove sono già registrati migliaia di bot.

E c'è un ... bot per registrare il tuo bot in un negozio di bot! Aggiungi @storebot all'elenco dei contatti, digita il /Inserisci comando e seguire le istruzioni. Ti verrà chiesto di inserire nome utente, nome e descrizione del bot, scegliere una delle categorie standard e confermare la proprietà del bot inviando il suo token.

Dopo un po ', il tuo bot passerà il processo di invio e comparirà nei grafici Storebot. Ora tu e i tuoi utenti potete votare, trovare e valutare il vostro bot nel bot store per aiutarlo a salire in cima alla classifica.

Conclusione

Abbiamo fatto molta strada, dalla creazione di un baby bot alla registrazione in un negozio per essere disponibili agli utenti reali. Come puoi vedere, ci sono molti strumenti che ti semplificano la vita con la creazione e la diffusione del tuo bot, e non hai bisogno di molto codice per avviare un facile bot. Ora sei pronto per crearne uno tuo!

Se avete domande, non esitate a fare domande nei commenti all'articolo. 

Ulteriori letture e collegamenti correlati

  • Telegram Bots
  • BotFather
  • Botan
  • API PHP Telegram Bot
  • Telegram Bot Store