Visualizzazione post con etichetta api. Mostra tutti i post
Visualizzazione post con etichetta api. Mostra tutti i post

giovedì 14 maggio 2015

JarvisPHP - Il tuo maggiordomo personale in Php!


JarvisPhp è la mia ultima creazione. In breve si tratta di un sistema REST API scritto in Php che permette una interazione diretta con l'utente attraverso dei comandi. Questi comandi possono essere vocali, pronunciati e riconosciuti da un STT (Speech to text) come ad esempio una applicazione Android mediante le funzioni Android STT,  e successivamente inviati (in stringa) alle API di JarvisPHP.
Lo scenario è il seguente: l'utente (il padrone di casa) parla attraverso un auricolare bluetooth collegato con uno smartphone, premendo il bottone dell'auricolare. Il comando viene interpretato dal riconoscitore vocale della app ed inviato a JarvisPHP, che tenta di comprenderlo ed eseguire qualche azione.
JarvisPHP è stato pensato per un Raspberry PI vista la sua comodità e dimensione, ma può essere usato su qualsiasi sistema *nix.


Download

E' possibile scaricare l'ultima versione di JarvisPHP su Github a questo indirizzo:
https://github.com/bianchins/JarvisPHP


Documentazione

Potete fare riferimento al wiki per tutta la documentazione:
https://github.com/bianchins/JarvisPHP/wiki/


Architettura del sistema

Come può JarvisPHP eseguire una azione? Come riesce ad interagire con l'ambiente? Semplicemente, utilizza dei plugins per eseguire il comando che ha interpretato. Per esempio, chiedendo "Chi sei?" il sistema attiverà il plugin "Info plugin" che risponderà "Il mio nome è...".
Un plugin (è semplicissimo scrivere un proprio plugin, basta seguire queste istruzioni) può fare qualsiasi cosa: per esempio, interagire con l'interfaccia GPIO di un Raspberry Pi (http://www.raspberrypi.org), suonare musica, interrogare API pubbliche meteo, leggere email, connettersi a facebook e leggere le notifiche, e così via.

venerdì 9 gennaio 2015

Il meteo con Php e le API di Yahoo Weather

A tempo perso sto preparando una sveglia con Raspberry PI, che al momento di suonare si colleghi ad un sistema meteo, scarichi le informazioni e le pronunci tramite un sintetizzatore vocale.


Il primo passo è quindi quello di sviluppare un sistema che possa comprendere le condizioni meteo esterne. Ho trovato il servizio di API Yahoo Weather e me ne sono innamorato!
Di seguito è mostrato il codice dello script php che ho sviluppato: utilizza le funzioni curl per interfacciarsi con le API che rispondono in JSON, ho mappato i codici delle condizioni meteo in italiano (come da documentazione ufficiale) e ho scovato su stackoverflow una funzione per tradurre la direzione del vento da gradi alle classiche direzioni da rosa dei venti.
<?php

//Tradotto in php dall'originale 
//http://stackoverflow.com/questions/7490660/converting-wind-direction-in-angles-to-text-words
function degToCompass($num) {
    $val=floor(($num/22.5)+.5);
    $arr=["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];
    return $arr[($val % 16)];
}


$condizioni = array(
"0"=>  "tornado",
"1"=>  "tempesta tropicale",
"2"=>  "uragano",
"3"=>  "forti temporali",
"4"=>  "temporali",
"5"=>  "pioggia mista a neve",
"6"=>  "pioggia mista a nevischio",
"7"=>  "neve mista a nevischio",
"8"=>  "pioviggine gelata",
"9"=>  "pioggerella",
"10"=>  "pioggia gelata",
"11"=>  "rovesci",
"12"=>  "rovesci",
"13"=>  "raffiche di neve",
"14"=>  "rovesci di neve leggeri",
"15"=>  "soffia neve",
"16"=>  "neve",
"17"=>  "grandinare",
"18"=>  "nevischio",
"19"=>  "polvere",
"20"=>  "nebbioso",
"21"=>  "foschia",
"22"=>  "foschia",
"23"=>  "ventoso",
"24"=>  "ventoso",
"25"=>  "freddo",
"26"=>    "nuvoloso",
"27"=>  "Sereno",
"28"=>  "Sereno",
"29"=>  "parzialmente nuvoloso",
"30"=>  "parzialmente nuvoloso",
"31"=>  "Sereno",
"32"=>  "soleggiato",
"33"=>  "Sereno",
"34"=>  "Sereno",
"35"=>  "pioggia mista e grandine",
"36"=>  "caldo",
"37"=>  "isolati temporali",
"38"=>  "temporali sparsi",
"39"=>  "temporali sparsi",
"40"=>  "Rovesci sparsi",
"41"=>  "tormenta di neve",
"42"=>  "rovesci di neve sparsi",
"43"=>  "tormenta di neve",
"44"=>  "parzialmente nuvoloso",
"45"=>  "rovesci temporaleschi",
"46"=>  "rovesci di neve",
"47"=>  "Temporali isolati",
"3200"=>  "non disponibile"
);

$BASE_URL = "http://query.yahooapis.com/v1/public/yql";

$yql_query = 'select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="Rimini, Italy") and u="c"';
$yql_query_url = $BASE_URL . "?q=" . urlencode($yql_query) . "&format=json";

$session = curl_init($yql_query_url);
curl_setopt($session, CURLOPT_RETURNTRANSFER,true);
$json = curl_exec($session);
$phpObj =  json_decode($json);
echo "\nMeteo per Rimini\n";
echo "----------------\n";
echo "Temperatura:      ";
echo $phpObj->query->results->channel->item->condition->temp."° C\n";
echo "Condizioni meteo: ";
echo $condizioni[$phpObj->query->results->channel->item->condition->code]."\n";
echo "Alba:             ";
echo $phpObj->query->results->channel->astronomy->sunrise."\n";
echo "Tramonto:         ";
echo $phpObj->query->results->channel->astronomy->sunset."\n";
echo "Umidità:          ";
echo $phpObj->query->results->channel->atmosphere->humidity."%\n";
echo "Pressione:        ";
echo $phpObj->query->results->channel->atmosphere->pressure." millibar\n";
echo "Previsioni:       ";
echo $condizioni[$phpObj->query->results->channel->item->forecast[0]->code];
echo ", t. max ".$phpObj->query->results->channel->item->forecast[0]->high;
echo "° C, t. min ".$phpObj->query->results->channel->item->forecast[0]->low." °C \n";

echo "Vento:            ";
echo $phpObj->query->results->channel->wind->speed." km/h ";
echo degToCompass($phpObj->query->results->channel->wind->direction)."\n";

giovedì 28 novembre 2013

API RESTful con Codeigniter usando codeigniter-restserver


Nel post precedente ho mostrato come creare un semplice sistema API con il solo metodo GET. Ma se volessimo un server API che risponda secondo lo standard RESTful, dovremmo gestire anche i metodi POST, PUT e DELETE.
In particolare, lo standard consiglia di utilizzare:
  • GET per richieste di lettura di una risorsa
  • POST per richieste di creazione di una risorsa
  • PUT per richieste di modi ca di una risorsa
  • DELETE per richieste di eliminazione di una risorsa 
 Per fare questo velocemente e possibile appoggiarsi ad una libreria di terze parti, codeigniter-restserver.

Installazione

Il primo passo è ovviamente scaricare il pacchetto dalla pagina github della libreria. Il pacchetto includerebbe anche CodeIgniter, ma è molto probabile che si voglia integrare restserver in un progetto codeigniter gi à esistente. In questo caso è su fficiente copiare i files
application/libraries/Format.php
application/libraries/REST_Controller.php
application/config/rest.php
nella propria directory application, e ricordarsi di caricare automaticamente la classe REST_Controller come libreria nel fi le di con gurazione
application/config/autoload.php
Per personalizzare le opzioni di restserver, basta modi care l'apposito fi le precedentemente copiato:
application/config/rest.php

Funzionamento di base

Per il buon funzionamento del sistema è necessario creare controller che estendono la classe base REST_Controller. La libreria elabora le richieste sulla base del metodo HTTP utilizzato e della risorsa (controller), eseguendo la funzione corrispondente all'insieme dei due elementi, sempre seguendo la logica CodeIgniter. Per spiegarmi meglio, ipotizziamo di avere il seguente controller:
class News extends REST_Controller
{
    public function index_get()
    {
        // Lettura delle news
    }

    public function index_post()
    {
        // Crea una news
    }
 
 public function index_put()
    {
        // Modifica una news
    }
 public function index_delete()
    {
        // Elimina una news
    }
}
Una richiesta del tipo
GET http://www.example.com/news
comporterà l'esecuzione della funzione index_get, index perché l'url è senza una funzione specificata (news è direttamente il controller) e get perché il metodo HTTP utilizzato è, appunto, GET.

L'accesso ai parametri è garantito dalle funzioni get, post e put.
$this->get('id'); //mappatura di $this->input->get()
$this->post('id'); //mappatura di $this->input->post() 
$this->put('id'); 
Per i parametri del metodo DELETE, poiché lo standard non li prevede, è sufficiente gestirli direttamente dalla funzione richiamata dal controllore:
public function index_delete($id)
    {
        $this->response(array(
            'returned from delete:' => $id,
        ));         
    }

E' possibile inviare in output una struttura dati con la funzione response, gestendo anche la risposta HTTP direttamente (opzionale). In questo modo la libreria si preoccuperà di formattare la risposta a seconda dello standard impostato nella configurazione (io consiglio JSON). Inoltre, gestendo le risposte HTTP, è possibile utilizzare codici appropriati come il 201 per HTTP 201 Created e 404 per HTTP 404 Not Found (in quest'ultimo caso il primo parametro sarà una risorsa vuota, come ad esempio un array senza elementi).
public function index_post()
{
    // ...crea una news

    $this->response($news, 201); // Manda la risposta HTTP 201
}
Queste sono i tips principali per lo sviluppo di un sistema API con codeigniter-restserver. Non ho parlato per motivi di tempo delle altre caratteristiche della libreria, quali la gestione di API Keys, la gestione dell'autenticazione ecc. per le quali rimando direttamente al sito ufficiale.

mercoledì 27 novembre 2013

Un semplice sistema API GET CodeIgniter con risposta JSON

In questo post volevo descrivere una implementazione relativa ad un sistema API che usa esclusivamente il metodo HTTP GET, sempre in ottica di progetti web strutturati con una netta separazione tra vista (lato client) e controllo (lato server).
Il mio framework php preferito (CodeIgniter) gestisce in modo nativo le richieste con metodo HTTP GET, quindi creare un semplice sistema di API a sola lettura è molto semplice. Ipotizziamo di creare una sottocartella chiamata api nella cartella controller, e di posizionarvi dentro i vari controller che rispecchieranno le risorse delle API.

application
   |- controllers
      |- api
         |- news.php

A questo punto sappiamo che CodeIgniter gestirà che richieste del tipo
http://www.example.com/api/news/getAll
http://www.example.com/api/news/getSingle/12
richiedendo l'esecuzione del controller news.php che compare nell'albero di esempio, con i metodi getAll senza parametri e getSingle con un parametro GET valorizzato a "12".
Vediamo quindi il codice del controller:
class News extends CI_Controller {

 public function getAll()
 {
  $query = $this->db->get('news');
  $elenco_news = array();
  foreach ($query->result() as $row)
  {
       $news = new stdClass();
       $news->id = $row->id;
       $news->titolo = $row->titolo;
       $news->contenuto = $row->contenuto;
       array_push($elenco_news, $news);
  }
  echo json_encode($elenco_news);
 }
 
 public function getSingle(id)
 {
  $this->db->from('news')->where('id',$id);
  $query = $this->db->get();
  $row = $query->row(); 
  $news = new stdClass();
  $news->id = $row->id;
  $news->titolo = $row->titolo;
  $news->contenuto = $row->contenuto;
  echo json_encode($news);
 }

}
Sarà sufficiente quindi creare un controller per ogni tipo di risorsa (ad esempio news, eventi, banner) ed i relativi metodi, ricordandosi di strutturare le risposte in formato JSON come da esempio.