ChatBot/Bot telegram e i Gemelli Skywalker
di Matteo Enna · Pubblicato · Aggiornato
Da molto non parlavo di Chatbot e Bot Telegram, questa volta colgo l’occasione della Settimana del Rosadigitale per creare un piccolo tutorial, guardando il codice di uno dei miei Bot. Questa volta partendo Luke e Leila, i gemelli Skywalker e con l’aiuto dei loro “BOT”: R2-D2, C-3PO e BB8.
Luke e Leila, i gemelli Skywalker
Luke Skywalker e Leila Organa sono i gemelli alla base della trilogia originale di Guerre stellari. Figli di Anakin Skywalker e di Padmé Amidala, separati alla nascita ed entrambi protagonisti della sconfitta dell’impero, Luke come Cavaliere Jedi e Leila come leader dell’Alleanza Ribelle.
Luke è interpretato da Mark Hamill, sino ai 19 anni aiuto lo zio nella riparazione di macchinari e droidi, sino all’incontro con Obi-Wan Kenobi, che su maestro anche di Anakin, che lo portò a diventare un cavaliere Jedi.
Leila o principessa Leila invece è stato interpretata da Carrie Fisher, fu adottata da regina e da un senatore. Divenne presto anche lei senatrice dove in segreto aiutò l’alleanza ribelle. Fu una grande combattente e l’unica donna a partecipare alla battaglia di Endor.
E i bot?
In ogni storia i protagonisti hanno sempre un aiutante, in tutta la durata di Guerre Stellari, compresi gli spin off, ricoprono ruoli spesso fondamentali i robot, in guerre stellari i più frequenti sono: R2-D2, C-3PO e BB8.
Ecco, i ChatBot e stanno diventando sempre più importanti in tutti i principali mezzi di comunicazione che noi usiamo, che si parli di marketing, accessibilità, riusco dei dati aperti, servizi di assistenza od altro, ci stiamo abituando a vederli. In questo articolo mostrerò alcune piccole funzioni che ho utilizzato in uno dei chatbot che reputo tecnicamente più completo. Con la speranza che sia di aiuto a chi volesse costruirne uno.
Il chatbot in questione è @sardegnapoi_bot, un bot telegram per trovare i punti di interesse tramite un file CSV, rilasciato come Open Data.
Bot Telegram e Sardegnapoi_bot
Vediamo un po’ il codice e cosa fa:
Come prima cosa inseriamo i dati del nostro token, quello che otteniamo dal bot: The Bot Father:
define('BOT_TOKEN', 'Token_input');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/');
Ogni volta che mandiamo un messaggio al nostro bot, controlla e formatta in un modo più comprensibile il testo:
$content = file_get_contents("php://input");
$update = json_decode($content, true);
$chatID = $update["message"]["chat"]["id"];
$benvenuto="Messaggio di benvenuto";
Controlliamo prima di tutto se il messaggio è in un formato che noi possiamo utilizzare, in questo caso controlla se il messaggio è testuale oppure fatto in coordinate, in caso contrario invia un messaggio di errore.
if (!array_key_exists('text', $update["message"]) && !array_key_exists('location', $update["message"])) {
$type_ns="Formato non supportato, digita il nome di un comune Sardo o invia la tua posizione";
$sendto =API_URL."sendmessage?chat_id=".$chatID."&text=".urlencode($type_ns);
file_get_contents($sendto);
die();
}
Se siamo a questo punto il nostro bot ha ricevuto un messaggio che riesce a decifrare, ora quindi, prepara una serie di valori che serviranno per ricercare i Punti di interesse nel CSV.
if(array_key_exists('location', $update["message"])){
$bidda=array(
“latitude” => $update[“message”][“location”][“latitude”],
“longitude” => $update[“message”][“location”][“longitude”],
);
}else{
$bidda=$update[“message”][“text”];
}
$reply = sendMessage($bidda,$chatID);
Con la funzione sendMessage ottengo un array pronto per essere elaborato da Telegram con le risposte per gli utilizzatori, Quello che vediamo ora sono le funzioni per inviare l’array a Telegram in modo che possa capirlo.
header(“Content-Type: application/json”);
$parameters = array(‘chat_id’ => $chatID, “text” => $reply[‘testo’]);
$parameters[“method”] = “sendMessage”;
$parameters[“reply_markup”] = ‘{ “keyboard”: ‘.$reply[‘key’].’}’;
echo json_encode($parameters);
Abbiamo visto poche righe fa, la funzione sendMessage, ecco ilfunzionamento:
function sendMessage($bidda, $chatID){
$benvenuto=”Messaggio di benvenuto“;
$help =”Messaggio di aiuto“;
Esamina che il contenuto sia formato in un modo corretto
if(strlen($bidda)<4 && !is_array($bidda)){
$sendto =API_URL."sendmessage?chat_id=".$chatID."&text=".urlencode("Zona non trovata");
file_get_contents($sendto);
die();
}
Inizializza la variabile dove verranno inseriti i risultati e apre il nostro file CSV con tutti i punti di interesse della Sardegna.
$risultati =array();
$simple = file_get_contents(“data/poi.csv”);
$righe=explode(chr(10),$simple);
$search_mode = FALSE;
if (is_array($bidda))
{
$sendto =API_URL.”sendmessage?chat_id=”.$chatID.”&text=Cerco per coordinate”;
file_get_contents($sendto);
$search_mode =TRUE;
Scorre riga per riga il contenuto del nostro file
foreach($righe as $s){
$response =array();
$col = explode(';',$s);
$col[3]=str_replace(‘”‘,”,$col[3]);
$col[1]=str_replace(‘”‘,”,$col[1]);
$lat = str_replace(‘”‘, ”, $col[3]);
$long = str_replace(‘”‘, ”, $col[1]);
controlla se la riga corrente soddisfa le coordinate richieste
if(($col[1]< $bidda["latitude"]+0.02 && $col[1]>$bidda["latitude"] - 0.02) && ($col[3]< $bidda["longitude"]+0.02 && $col[3]>$bidda["longitude"] - 0.02)){ /*|| stripos($col[2],$bidda) || stripos($col[5],$bidda)*/
$response = array (
'id'=> str_replace('"', '', $col[4]),
'tipo'=> str_replace('"', '', $col[0]),
'comune'=> str_replace('"', '', $col[9]),
'lat'=> $lat,
'long'=> $long,
'nome'=> str_replace('"', '', $col[5]),
'provincia'=> str_replace('"', '', $col[8]),
'zona'=> str_replace('"', '', $col[2])
);
$risultati[]=$response;
}
Esamina le altre opzioni di navigazione:
- Inizio
- Aiuto
- Ricerca testuale di un paese
}
}elseif($bidda=="/start" || $bidda=="Inizio"){
$testo = $benvenuto;
}elseif($bidda=="/help" || $bidda=="Aiuto"){
$testo = $help;
}elseif(stripos($bidda, "Mappa")!==FALSE){
foreach($righe as $s){
$response =array();
$col = explode(';',$s);
$id =str_ireplace("Mappa: ","",$bidda);
if($col[4]=='"'.$id.'"') {
$lat = str_replace('"', '', $col[3]);
$long = str_replace('"', '', $col[1]);
$testo = 'https://www.google.com/maps/place/'.$long.'+'.$lat.'/@'.$long.','.$lat.',15z';
}
}
}elseif(stripos($bidda, “Scheda”)!==FALSE){
foreach($righe as $s){
$response =array();
$col = explode(‘;’,$s);
$id =str_ireplace(“Scheda: “,””,$bidda);
if($col[4]==$id) {
$testo = $col[7];
}
}
Questo è per mostrare i pulsanti per accedere ai miei altri bot
}elseif($bidda=="Altri bot"){
$lista =array(
'Storia e archeologia in Sardegna: @nuragheBot',
'Biblioteche in Sardegna: @sardegnabiblioteche_bot',
'Trasporti pubblici della Sardegna: @sardegnatrasportibot',
'Musica libera con jamendo: @jamendo_SearchBot',
'Prontuario da bar: @Cumbido_bot',
'A Christmas Carol: @achristmascarol_bot'
);
$testo = implode(chr(10),$lista);
}else{
$sendto =API_URL."sendmessage?chat_id=".$chatID."&text=Cerco ".$bidda;
file_get_contents($sendto);
$search_mode =TRUE;
$i=0;
foreach($righe as $s){
$response =array();
$col = explode(‘;’,$s);
if(stripos($col[5],$bidda) || stripos($col[10],$bidda)){
$lat = str_replace(‘”‘, ”, $col[3]);
$long = str_replace(‘”‘, ”, $col[1]);
Qui prepara la risposta da inviare a Telegram con un semplice array
$response = array (
'id'=> str_replace('"', '', $col[4]),
'tipo'=> str_replace('"', '', $col[0]),
'comune'=> str_replace('"', '', $col[9]),
'lat'=> $lat,
'long'=> $long,
'nome'=> str_replace('"', '', $col[5]),
'provincia'=> str_replace('"', '', $col[8]),
'zona'=> str_replace('"', '', $col[2])
);
$risultati[]=$response;
$i++;
}
}
}
$acapo=”\n”;
$sug = array();
$sug[] = ‘[“Inizio”,”Aiuto”]’;
if($search_mode) {
$tot = count($risultati);
$testo = ”;
foreach ($risultati as $k => $res){
$testo .= $res[‘id’].’ – ‘.$res[‘nome’];
$testo .= $acapo;
$testo .= $res[‘tipo’];
$testo .= $acapo;
$testo .= $res[‘comune’].’ (‘.$res[‘provincia’].’)’;
$testo .= $acapo;
$testo .= ($k+1).’/’.$tot;
$testo .= $acapo;
$testo .= $acapo;
$link = array(
‘”Mappa: ‘.$res[‘id’].'”‘,
‘”Scheda: ‘.$res[‘id’].'”‘
);
$sug[] = ‘[‘.implode(“,”,$link).’]’;
}
}
$sug[] = ‘[“Altri bot”]’;
$testo = $testo ? $testo : “Nessun risultato”;
return array(
‘testo’=> $testo,
‘key’ => ‘[‘.implode(‘,’,$sug).’]’
);
}
Spero sia stato utile, buona settimana del Rosadigitale 🙂
L’articolo ChatBot/ Bot telegram e i Gemelli Skywalker proviene da Matteo Enna.
Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!
Hai dubbi o problemi? Ti aiutiamo noi!
Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.