ChatBot/ Bot telegram e i Gemelli Skywalker

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. 

Bot telegram

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 :)

Potrebbero interessarti