Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go + AppEngine = <3

Go + AppEngine = <3

3dc29e8cfc6ef333e2b41a1b0e826b57?s=128

Nicola Corti

April 26, 2016
Tweet

Transcript

  1. Go + App Engine =

  2. GIOVANNI MODICA giangraziano@gmail.com @infernatico NICOLA CORTI corti.nico@gmail.com @cortinico

  3. Let’s Go with Telegram Bots

  4. Contenuti ➔ Telegram ➔ API Google Search ➔ Go ➔

    Implementazione del bot
  5. 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.
  6. 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
  7. 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.
  8. 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]
  9. 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.
  10. Aggiungere il bot SearchGobot per provarlo

  11. Aggiungere il bot SearchGobot per provarlo

  12. PROCEDIMENTO

  13. SearchBot INGREDIENTI • Go • Google APIs • JSON •

    Telebot
  14. 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.
  15. Approccio 1: HTML cerchiamo “golang” su google. La risposta html

    sarà...
  16. e la risposta sarà...

  17. 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”
  18. JSON Tipi elementari ➔ Number: numeri a virgola mobile ➔

    String ➔ Boolean ➔ Array [ ] ➔ Object { }
  19. JSON

  20. JSON

  21. 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
  22. JSON ➔ Molto più ridotto rispetto alla risposta HTML. ➔

    Contiene SOLO informazioni strettamente necessarie alla nostra ricerca! Approfondimento sulla struttura JSON
  23. Struttura JSON delle API di Google Search

  24. None
  25. 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
  26. 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
  27. 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
  28. 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”
  29. Go: funzioni e goroutine

  30. Go: JSON dati di “spesa” in formato JSON tipo “spesa”

    corrispondente ai dati JSON
  31. Go: JSON, altro esempio

  32. 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).
  33. 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
  34. None
  35. Preparazione

  36. 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
  37. 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.
  38. Ricerca: HTTP GET Request

  39. 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.
  40. struttura dei tipi definiti in “jsonType.go”

  41. Ricerca: Estrazione delle informazioni

  42. Go: Gestione errori

  43. Cottura

  44. 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.
  45. 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
  46. Telebot

  47. Telebot: Download per scaricare la libreria basta usare il comando

    go get seguito dal link della libreria. NOTA: necessita di git installato
  48. 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()
  49. 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
  50. SearchGoBot: telebot

  51. SearchGoBot: Test

  52. Pronto!

  53. PANORAMICA

  54. 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à ;-)
  55. 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/
  56. FINE

  57. Let’s Go with App Engine

  58. ICYDK App Engine...

  59. Google Cloud Platform ◦ cloud.google.com ◦ Hostato nei datacenter di

    Google ◦ Svariati servizi, in base alle proprie esigenze
  60. 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
  61. 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
  62. 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…)
  63. Why App Engine?

  64. Why App Engine?

  65. Pros ◦ Nessuna manutenzione dei server ◦ Applicazioni facilmente scalabili

    ◦ Gratuito fino ad un certo limite ◦ Integrato in svariati tool
  66. 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
  67. Pricing

  68. None
  69. 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
  70. The GAE SDK

  71. Supported Languages

  72. Supported Languanges Python 2.7 Java 7 PHP 5.5 Go 1.4

  73. Restrictions

  74. 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
  75. Restrictions

  76. Restrictions

  77. SDK Commands

  78. 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!
  79. 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
  80. Hello Engine ;)

  81. The Sample Project https://cloud.google.com/ appengine/docs/go/

  82. hello.go

  83. The project ID

  84. app.yaml

  85. goapp serve È possibile modificare il codice sorgente e vedere

    le modifiche in tempo reale.
  86. app.yaml

  87. 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
  88. 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
  89. 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
  90. scaling

  91. scaling

  92. Deploy

  93. goapp deploy

  94. goapp deploy - The first time Autenticazione con OAuth2, il

    token viene salvato in ~/.appcfg_oauth2_tokens
  95. http://my-first-sample-application.appspot.com/

  96. The Hollywood Principle

  97. getUpdates vs setWebhook

  98. 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…)
  99. getUpdates

  100. 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
  101. setWebhook

  102. setWebhook https://api.telegram.org/bot[API_KEY]/setWebhook?url=https://mysample-telegram-bot.appspot.com

  103. 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
  104. Let’s launch our gopher!

  105. telebotgae github.com/cortinico/telebotgae

  106. 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)
  107. 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
  108. hello.go - telebot

  109. hello.go - telebotgae

  110. app.yaml

  111. Managing & Stats

  112. 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
  113. Logging

  114. Managing

  115. The Dashboard

  116. Billing Status

  117. Versions

  118. BETA - Source Code

  119. None
  120. And now… it’s your turn!

  121. Questions? Giovanni Modica giangraziano@gmail.com @infernatico /GianniGM Nicola Corti corti.nico@gmail.com @cortinico

    /cortinico github.com/cortinico/telebotgae Slide distribuite sotto licenza CC By-4.0