IMPARIAMO A REALIZZARE UN I BOT DI TELEGRAM PER REALIZZARE UNA SORTA DI “ASSISTENTE DIGITALE”.
Telegram, il principale rivale di Whatsapp, sta ultimamente riscuotendo un grande successo grazie ai bot.
Un “bot” è un utente di Telegram i cui messaggi non vengono inviati da una persona, ma piuttosto da un programma. I bot hanno ovviamente una serie di vantaggi notevoli: possono rispondere in modo automatico a domande predefinite, oppure essere collegati ai sistemi demotici per permetterci di controllare in modo facile la nostra casa.
Ma possono anche essere utilizzati per divertirsi con gli amici e E, ovviamente, per fini lavorativi. Quello che vi proponiamo in questo articolo è una sorta di “assistente digitale”. In altre parole, il nostro bot si occuperà di rispondere ai messaggi ad esempio di clienti di un ristorante come se fosse un cameriere, indicando il menù del giorno, gli ingredienti che compongono ogni piatto, e raccogliendo le ordinazioni per il cibo da consegnare a domicilio. Il punto di partenza sarà un semplice file JSON.Questo file conterrà tutte le informazioni necessarie, per esempio gli orari di apertura ed il menù. Un file JSON è fondamentalmente una rappresentazione testuale di un array a più dimensioni, ed è molto intuitivo anche per chi non è un programmatore, quindi anche i gestori del locale potranno facilmente modificare questo file. Ecco un esempio di come potrebbe presentarsi:
{
“orari”: “da lunedì al venerdì: 14-23,
sabato e domenica: 12-15 e 16-23”,
“menu”: [
{“piatto”: “spaghetti al sugo”, “prezzo”: “16”,
“ingredienti”: “farina di frumento, uova, carne di manzo,
cipolle, carote, sedano, salsa di pomodoro, olio di semi”},
{“piatto”: “stinco di maiale”, “prezzo”: “15”,
“ingredienti”: “carne di maiale con osso, carote,
patate, salsa di pomodoro”},
{“piatto”: “bavarese al cioccolato”, “prezzo”: “5”,
“ingredienti”: “albumi, colla di pesce, latte bovino,
cioccolato fondente”}
}
PRIMI PASSI CON IL BOT
Il codice del bot comincia con delle righe chiamate “import”, per inserire nel programma il codice di alcune librerie. Queste librerie facilitano l’utilizzo di alcuni strumenti fondamentali per il funzionamento, e devono essere installate sul server che ospita il codice (nel nostro caso il server di Google App Engine). Owiamente, quelle che abbiamo scelto noi sono già integrate nei server di Google ma se volete utilizzare un server diverso dovrete assicurarvi di averle installate:
# coding: utf8
from _future_ import unicode_literals
import String!O
import json
import logging
import random
import urllib
import urllib2
from random import randrange, uniform
from apiclient.discovery import build
Queste librerie servono a contattare altri siti web e scaricare il loro contenuto (con una httprequest), oltre al calcolo di numeri casuali, da utilizzare per rendere un po’ più variabili i risultati delle ricerche. Prima delle librerie abbiamo specificato la codifica utf-8: questo è fondamentale, altrimenti Python non riconoscerà i caratteri italiani con accento ed il bot si bloccherebbe. La prima libreria che abbiamo integrato permette al bot di gestire in modo predefinito tutte le stringe come Unicode UTF-8.
from PIL import Image
Queste sono le librerie necessarie per gestire le immagini con Python.
from google.appengine.api import urlfetch
from google.appengine.ext import ndb
from google.appengine.api import mail
from urlparse import urlparse
import webapp2
Infine, le librerie standard di Google App Engine: permettono il funzionamento del programma sui server di Google. Ora cominciamo con il codice vero e proprio del programma.
fìlejson = ‘http://www.ilmiosrver.com/database.json’
database = “”
try:
jsn = urllib2.ur1open(fìlejson)
database = json.load(jsn)
except ValueError, err:
logging.info( err)
database = “”
Il codice principale del programma costruisce una webapp di Google con 4 comandi di base: /me, /updates, / set_webhook, e /webhook
app = webapp2.WSG!Application([
(‘/me’, MeHandler),
(‘/updates’, GetUpdatesHandler),
(‘/set_webhook’, SetWebhookHandler),
(‘/webhook’, WebhookHandler),
], debug=True)
Ogni volta che l’applicazione riceve uno di questi comandi, chiama una apposita funzione, la quale dovrà naturalmente svolgere le azioni previste per il nostro bot.
Le funzioni, inserite in classi, cui si fa riferimento sono le seguenti:
class MeHandler(webapp2. RequestHandler):
def get( self):
ur1fetch.set_default_fetch_deadline(60)
self.response.write(json.dumps(
json.load(ur11ib2.urlopen(BASE_URL + ‘getMe’))))
Per esempio, nel caso il comando ricevuto sia /me (cioè viene aperto l’indirizzo https://nomebot.appspot.com/me, come spieghiamo nel terzo tutorial) il programma contatta il server di Telegram con la richiesta getMe, e presenta sulla pagina web il risultato. Ovviamente, il risultato è una breve lista di informazioni sul nostro bot.
class GetUpdatesHandler(webapp2. RequestHandler):
def get( self) :
urlfetch.set_default_fetch_deadline(60)
self. respon;e. write(json. d umps(json. lo ad (
ur11ib2.urlopen(BASE_URL + ‘getUpdates’))))
Il comando/update non ci interessa più di tanto, ma è necessario per supportare gli aggiornamenti del programma.
class SetWebhookHandler(webapp2. RequestHandler):
def get(self):
urlfetch.set_default_fetch_deadline(60)
ur1 = self.request.get(‘url’)
if ur1:
self.response. write(json .dumps(
json.load(ur11ib2.urlopen(BASE_URL
+ ‘setWebhook’, ur11ib.ur1encode( { ‘uri’: uri})))))
Il comando /set_webhook è interessante: il suo compito è impostare presso il server di Telegrarn il webhook del nostro bot. In soldoni: il webhook è l’indirizzo web a cui Telegram deve inoltrare i messaggi che vengono inviati al bot, ed anche l’indirizzo web su cui appariranno le risposte del bot per ciascuno dei suoi interlocutori (risposte che poi Telegram dovrà recapitare ai rispettivi destinatari). Naturalmente, l’impostazione del webhook va fatta una volta sola, Telegram ricorderà l’indirizzo che viene specificato la prima volta: si può fare utilizzando il comando setWebhook e specificando l’indirizzo in formato JSON (tra parentesi graffe).
class WebhookHandler(webapp2. RequestHandler):
Ma la parte più interessante di tutte è owiamente il webhook stesso, perché è questa porzione del programma che definisce come risponderà il bot ai vari messaggi che riceve.
def post(self):
urlfetch.set_default_fetch_deadline(60)
body = json.loads(self.request.body)
logging.info(‘request.body:’)
logging.info(body)
self.response.writeUson.dumps(body))
Vedremmo nel successivo articolo come inviare i messaggi TELEGRAM