Share
Embed
Transcript
121 slides
-
Contenuti ➔ Telegram ➔ API Google Search ➔ Go ➔
Implementazione del bot -
Telegram: cos’è? Telegram è un servizio di messaggistica istantanea open
source. Rispetto alla concorrenza si differenzia per alcune particolari features: ➔ Chat segrete: messaggi cifrati con autodistruzione. ➔ Gruppi e Super-gruppi. ➔ Multipiattaforma, basato su Cloud. -
Telegram: cos’è? ➔ Canali ◆ Un utente admin e tanti
utenti iscritti ◆ solo gli admin possono scrivere messaggi ◆ gli utenti iscritti possono soltanto leggere ➔ API fornite gratuitamente ➔ BOT -
Telegram: bot Un bot è un utente “software” con cui
un utente “umano” può scambiare ed inviare messaggi. I bot di telegram possono offrire svariate funzionalità: ➔ Inviare/ricevere media ➔ Possono essere fornite di IA ➔ Possono essere usati nelle chat di gruppo I bot sono riconoscibili dai propri nickname, avranno sempre la parola bot alla fine del nome. -
Telegram: bot É possibile comunicare con i bot inviando dei
messaggi semplici oppure lanciando dei comandi seguiti dal carattere speciale “/”. Comandi standard ➔ /start per avviare il bot ➔ /stop per arrestare il bot ➔ /help informazioni di utilizzo Comandi per bot nei gruppi ➔ @nome_bot [messaggio semplice] ➔ /comando@nome_bot [messaggio] -
Telegram: bot SearchGoBot: un telegram bot che velocizza l’esperienza di
ricerca via Google, effettuando ricerche sul web usando soltanto il client Telegram. Inviando un messaggio al bot con la parola o frase che abbiamo intenzione di cercare, il bot inoltrerà la richiesta a Google. Riceveremo come risposta dei messaggi contenenti link e descrizione della ricerca fatta. -
API Google Search ➔ Approccio 1: HTML ◆ Ricerca di
ciò che ci serve direttamente dall’HTML fornitoci da Google ➔ Approccio 2: JSON ◆ Le API fornite da Google sono inviate in un formato “parsabile” da più linguaggi di programmazione. -
JSON JavaScript Object Notation è un formato testuale per descrivere
i dati: ➔ rende più semplice lo scambio tra programmi: ➔ non dipende dai linguaggi ➔ facilmente leggibile, notazione “chiave”:”valore” -
JSON Tipi elementari ➔ Number: numeri a virgola mobile ➔
String ➔ Boolean ➔ Array [ ] ➔ Object { } -
JSON Google offre una moltitudine di API, alcune di queste
permettono di personalizzare la ricerca in base alle proprie necessità, in questo caso useremo una tra le più semplici. Basta fare una richiesta GET al link seguente seguito dal termine che si vuole cercare: http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=TERMINE+DA+CERCARE -
JSON ➔ Molto più ridotto rispetto alla risposta HTML. ➔
Contiene SOLO informazioni strettamente necessarie alla nostra ricerca! Approfondimento sulla struttura JSON -
Go: caratteristiche Go è un linguaggio di programmazione compilato nato
in Google nel 2009. É stato creato per rispondere alle moderne esigenze degli sviluppatori: ➔ brevi tempi di compilazione. ➔ performante su tutti i calcolatori. ➔ soddisfa le necessità attuali della programmazione concorrente. ➔ ha un Garbage collector -
Go: caratteristiche ➔ Supporto nativo della concorrenza ➔ Supporto nativo
di unicode (tipo rune) ➔ Fortemente tipato ➔ “do more with less” (solo 25 keywords) ➔ Documentazione ricca ➔ Go Playground -
Go: tipi bool rune string uintptr byte uint, uint16,..., uint64
int, int16,..., int64 float32, float64 complex64, complex 128 struct array slice map pointer interface function channel -
Go: comandi Dichiarazione di variabili e assegnamento: equivalente a if-then-else:
Cicli: for Nota: NON esiste il while, si usa un for con una guardia Switch: function, main and “Hello World” -
Go: JSON dati di “spesa” in formato JSON tipo “spesa”
corrispondente ai dati JSON -
Go: JSON Marshalling Per codificare i dati JSON si usa
la funzione Marshal. Una volta definita la struttura da codificare, produciamo una sua istanza e la convertiamo in stringa JSON usando json.Marshal(istanza). -
Go: JSON Unmarshalling Per decodificare i dati JSON si usa
la funzione Unmarshal. Una volta definita la struttura da codificare e la stringa Json da trasformare in istanza basta invocare json.Unmarshal(stringa, riferimento), passando come parametri la stringa ed il riferimento dell’istanza da popolare. Basterà passare il riferimento della variabile lista per popolarla con i valori contenuti nella jsonString -
Go: Ricerca su Google É la funzione che rappresenta il
cuore del nostro bot: Il risultato sarà un array di stringhe contenenti i risultati del termine che abbiamo inserito come parametro -
Ricerca: HTTP GET Request Inviamo una richiesta HTTP GET contenente
l’URL delle API di Google. Come abbiamo visto, sappiamo che la risposta a questa richiesta sarà una stringa JSON che dovremo poi convertire in una struttura dati usando il metodo Unmarshal. -
il tipo googleSearchResponse Se tutto è andato per il meglio,
la variabile searchResults conterrà i risultati della ricerca Google effettuata, possiamo manipolarla come meglio vogliamo. searchResults.ResponseData.Results conterrà i risultati della ricerca. Adesso siamo in grado di ricevere risposte Google usando un programma Go. -
BotFather BotFather è un bot che permette a sua volta
la creazione di altri bot telegram. Per creare un nuovo bot basta aggiungere BothFather su telegram come @BotFather e creare un nuovo bot tramite il comando /newbot. Riceveremo l’API KEY, necessaria per far comunicare il nostro bot con Telegram. -
Telebot Una volta ottenuta l’API Key da BotFather bisogna interfacciare
il bot alle API di Telegram, occorre un procedimento simile a quello che abbiamo appena visto per effettuare la ricerca Google. ➔ Registrazione del bot usando nome del bot e API key ➔ Scambio di messaggi usando le API di telegram (sempre in formato JSON) utilizzeremo una libreria già scritta: github.com/cortinico/telebot -
Telebot: Download per scaricare la libreria basta usare il comando
go get seguito dal link della libreria. NOTA: necessita di git installato -
Telebot Dopo aver scaricato ed importato telebot, istanziamo una variabile
di tipo telebot.Bot Inseriamo i parametri di accesso usando il tipo Configuration. Telebot offre: ➔ tipo Bot ➔ tipo Configuration ➔ il metodo Start() -
SearchGoBot: telebot Start() è un metodo applicabile al tipo Bot
➔ Configuration: variabile contenente i parametri di accesso ➔ Il tipo Responder è una funzione che restituisce una coppia di valori ◆ Responder: funzione che gestisce messaggi ricevuti e da inviare -
Tutto molto bello, ma... ➔ Google offre API molto più
complete e sofisticate di quella presentata qui ➔ C’è un limite imposto da Google per il numero di ricerche che è possibile fare ◆ per superare questo limite bisogna pagare ➔ Questo bot gira in una macchina locale ◆ una volta spenta, il bot non sarà più operativo ➔ Go presentata molte altre caratteristiche non presentate qui Per questo e molto altro ancora, ci affidiamo alla vostra curiosità ;-) -
Link utili: SearchGobot v2: https://github.com/GianniGM/goSearch Telebot: https://github.com/cortinico/telebot Google APIs: https://developers.google.com/speed/libraries/
Documentazione Go: https://golang.org/ Go PlayGround: https://play.golang.org/ -
Google Cloud Platform ◦ cloud.google.com ◦ Hostato nei datacenter di
Google ◦ Svariati servizi, in base alle proprie esigenze -
Google Compute Engine ◦ IaaS (Infrastructure as a Service) di
Google ◦ Permette l’esecuzione di VM predefinite o customizzate ◦ Storage su SSD, connessioni in Fibra, Global load balancing ◦ Ottimo per applicativi CPU Intensive -
Google Container Engine ◦ Orchestratore di cluster di container Docker
◦ Basato su Kubernetes ◦ Free fino a 5 nodi nel cluster ◦ Ottimo se la vostra applicazione è deployata tramite docker -
Google App Engine ◦ PaaS (Platform as a Service) di
Google ◦ Fully managed ◦ Scala su richiesta ◦ Si deploya il codice, AppEngine deciderà quante/quali istanze avviare ◦ Ottimo per applicativi che possono avere picchi di richieste nel tempo (ad esempio un Bot di telegram…) -
Pros ◦ Nessuna manutenzione dei server ◦ Applicazioni facilmente scalabili
◦ Gratuito fino ad un certo limite ◦ Integrato in svariati tool -
Cons ◦ Codice “castrato” (solo un sottoinsieme delle funzioni/librerie) ◦
Accesso al filesystem read-only (sola lettura) ◦ Esegui codice solamente in risposta a richieste HTTP ◦ Lock-in ◦ No multi-threading -
Services • Cloud Datastore Database NoSQL • Cloud SQL Database
Relazionale • Cloud Storage Archivazione di file grossi • Mem Cache Caching di dati globali • Authentication Login degli utenti tramite Google Auth • Task Queues Esecuzione asincrona di task futuri • Logging Scrittura di Log • Urlfetch Esecuzione di chiamate HTTP • Mail API Invio di email • Security Scanner Ricerca di vulnerabilità nella propria applicazione -
Restrictions ◦ Le applicazioni gireranno all’interno di una sandbox ◦
Non si può scrivere sul filesystem! ◦ Non si può “rispondere lentamente” ◦ Non si possono effettuare system call The Go runtime restricts the use of standard library packages that would violate the sandbox policies. Such functions have been replaced by stubs that return an os.ErrPermission error or removed entirely. From https://cloud.google.com/appengine/docs/go/runtime -
The GO SDK 1. Scaricare lo SDK https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go 2. Unzippalo
in una cartella (/home/gopher/appengine) 3. Imposta la variabile d’ambiente PATH $ export PATH=$PATH:/home/gopher/appengine 4. Assicurati di avere Python 2.7 (Lo SDK è scritto in parte in Python) $ /usr/bin/env python -V Python 2.7.10 5. Siete pronti per sviluppare per App Engine in Go! -
goapp ◦ Il comando base per lavorare con App Engine.
◦ Un wrapper del comando go (goapp build, goapp run, ...) ◦ $ goapp help [topic] Ottiene aiuto su un comando ◦ $ goapp serve Esegue un development environment locale ◦ $ goapp deploy Deploya l’app su AppEngine -
goapp serve È possibile modificare il codice sorgente e vedere
le modifiche in tempo reale. -
app.yaml • runtime: go Nel nostro caso il runtime è
semplicemente Go • api_version: go1 È disponibile solo una api_version (per ora…) • handlers: … Definisce l’elenco degli endpoint • application: my-app-id L’application ID da cloud.google.com • version: v1 La versione dell’applicazione, per supportare versioni multiple dell’app -
handlers handlers: - url: /images static_dir: static/images - url: /.*
script: _go_app handlers: - url: / script: _go_app - url: /index\.html script: _go_app - url: /browse/(books|videos|tools) script: _go_app -
scaling instance_class: B8 manual_scaling: instances: 5 instance_class: F2 automatic_scaling: min_idle_instances:
5 max_idle_instances: automatic min_pending_latency: 30ms max_pending_latency: automatic max_concurrent_requests: 50 instance_class: B8 basic_scaling: max_instances: 11 idle_timeout: 10m -
goapp deploy - The first time Autenticazione con OAuth2, il
token viene salvato in ~/.appcfg_oauth2_tokens -
getUpdates ◦ Approccio più semplice per ottenere i messaggi da
Telegram ◦ Implementa il Long Polling (con timeout) ◦ Perfetto per testare il bot ◦ Funziona in ogni circostanza (dietro NAT, etc…) ◦ Non necessita di configurazioni particolari (firewall, etc…) -
setWebhook ◦ Approccio più complesso per ottenere i messaggi da
Telegram ◦ Riceve i messaggi con una logica push ◦ Si fornice l’URL dove si riceveranno delle POST per ogni messaggio al bot ◦ Richiede un certificato SSL ◦ Se si usa un certificato self-signed, deve essere passato come parametro -
setWebhook ◦ L’utilizzo di setWebhook risulta obbligato su App Engine
per come è pensata la piattaforma (esegui codice su richiesta HTTP). ◦ Ci permette di risparmiare risorse ◦ Il certificato SSL viene offerto gratuitamente da Google -
telebotgae ◦ Un fork di telebot ◦ Funziona utilizzando setWebhook
(altrimenti inutilizzabile su GAE) ◦ Scrive sul log di App Engine ◦ Per l’utente è molto simile a telebot ◦ Espone l’oggetto http.Response, necessario per accedere alle funzionalità di App Engine (context) -
telebotgae 1. Creaiamo un progetto su cloud.google.com 2. Creiamo un
nuovo bot con @BotFather 3. Copiamo la cartella bot_example/ da github.com/cortinico/telebotgae/ 4. Mettiamo il project ID dentro il file app.yaml 5. Mettiamo l’API Key e il nome del bot nel file hello.go 6. Scrivi la logica del bot nel file hello.go 7. Deploya con $ goapp deploy 8. Ricordati di chiamare setWebhook -
Logging ◦ La stampa su standard output/error non funziona (ovviamente)
◦ Si deve utilizzare il pacchetto google.golang.org/appengine/log ◦ I log potranno quindi essere visti/scaricati -
Questions? Giovanni Modica [email protected] @infernatico /GianniGM Nicola Corti [email protected] @cortinico
/cortinico github.com/cortinico/telebotgae Slide distribuite sotto licenza CC By-4.0