Mis favoritos | Español | Acceder

WaveProtocol.org

Obtén más información sobre el protocolo de federación de Google Wave (Google Wave Federation Protocol) y participa.

Robots de Google Wave: tutorial de Python

La forma más sencilla de comprender cómo funcionan las extensiones en Wave es crear un robot de Wave. Los robots son aplicaciones que interactúan con Wave a través del protocolo de Wave (interfaz HTTP). Actualmente, sólo son compatibles los robots alojados en Google App Engine. En el futuro, admitiremos cualquier arquitectura cliente que implemente el protocolo de Wave.

En este tutorial, utilizaremos la biblioteca cliente Python para desarrollar un robot de ejemplo. (Estos conceptos son iguales para los usuarios de la biblioteca cliente Java™, aunque los detalles de implementación serán diferentes). En este breve tutorial podrás crear un robot de ejemplo, subirlo a App Engine y ver cómo funciona con Wave.

Antes de empezar, asegúrate de que tienes Python 2.5 o una versión posterior instalada en tu sistema. Puedes determinar si tienes Python instalado (y su versión) ejecutando el siguiente comando de la línea de comandos:

hostname$ python --version
Python 2.6.2

Puedes descargar Python en la página de descargas de Python.

La biblioteca cliente Python

El desarrollo de los robots de Google Wave requiere la compilación con una biblioteca cliente. Este tutorial utiliza la biblioteca cliente Python de robots de Wave disponible en el alojamiento de proyectos de Google. Este proyecto contiene el código fuente para la propia biblioteca en la ubicación siguiente:

Crea un directorio para alojar el código fuente de tu robot de Python y extrae la biblioteca cliente Python en un directorio waveapi mediante el comando svn siguiente:

hostname$ svn checkout http://wave-robot-python-client.googlecode.com/svn/trunk/src/waveapi waveapi

Este comando creará un directorio waveapi en tu directorio de código fuente actual. Ten en cuenta que si consultas el código a través del protocolo HTTPS y autenticas tu identidad, puedes colaborar directamente con el proyecto de software libre.

Configuración de App Engine

Puedes desarrollar robots de Wave y otras aplicaciones web para App Engine a través de tus herramientas de desarrollo de Python. Antes de continuar, sigue las instrucciones para la instalación del SDK de Python incluidas en la documentación de App Engine.

Registro de tu aplicación en App Engine

También puede que desees registrar tu robot mediante la ID de aplicación en https://appengine.google.com.. Puedes registrar hasta diez ID de aplicaciones y los registros de las aplicaciones no se pueden deshacer ni eliminar, así como tampoco se puede cambiar la ID de aplicación una vez registrada. Si deseas conservar los registros de aplicaciones asignados, puedes seleccionar una ID de aplicación que sepas que vas a utilizar para un proyecto futuro. Además, puede que desees reservar una ID para la realización de pruebas con tus robots.

Accede a la consola de administración de App Engine en tu navegador web. Accede a través de tu cuenta de Google y, si es necesario, crea una. Si no has utilizado esta cuenta con App Engine anteriormente, se te puede pedir que verifiques tu cuenta mediante un SMS y un teléfono móvil.

En My Applications haz clic en el botón Create an Application. Selecciona una ID de aplicación y sigue las instrucciones para completar el registro. La nueva aplicación aparece en la lista. Puedes hacer clic en su nombre para visitar la consola de administración de esta aplicación.

Configuración de tu aplicación Python

Una vez que tengas una ID de aplicación válida, crea una especificación de aplicación app.yaml nueva en la raíz de tu directorio fuente con el contenido siguiente:

application: applicationName
version: 1
runtime: python
api_version: 1

handlers:
- url: /_wave/.*
  script: applicationName.py
- url: /assets
  static_dir: assets

No tienes que proporcionar a tu secuencia de comandos Python el mismo nombre que a tu ID de aplicación, aunque es lo habitual. También especificamos un patrón URL para servir elementos estáticos para la aplicación como, por ejemplo, imágenes, hojas de estilo, etc.

Para obtener más información sobre cómo empezar a utilizar App Engine, consulta la guía de introducción de App Engine para Python.

Hello, Robot!

A continuación vamos a escribir el código Python. En primer lugar, crea un archivo *.py con el mismo nombre indicado en tu archivo app.yaml (por ejemplo, applicationName.py). Añade el código siguiente:

from waveapi import events
from waveapi import model
from waveapi import robot

def OnParticipantsChanged(properties, context):
  """Invoked when any participants have been added/removed."""
  added = properties['participantsAdded']
  for p in added:
    Notify(context)

def OnRobotAdded(properties, context):
  """Invoked when the robot has been added."""
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("I'm alive!")

def Notify(context):
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("Hi everybody!")

if __name__ == '__main__':
  myRobot = robot.Robot('appName', 
      image_url='http://appName.appspot.com/icon.png',
      version='1',
      profile_url='http://appName.appspot.com/')
  myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
  myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
  myRobot.Run()

Vamos a explicar este código en las próximas secciones.

Importación de bibliotecas cliente

Para convertir una aplicación Python en un robot, tenemos que incluir la biblioteca de robot Python a través de las instrucciones de importación (import) siguientes:

from waveapi import event
from waveapi import model
from waveapi import robot

Definición de tu función principal

Una vez importadas las bibliotecas adecuadas, define tu función principal. Ten en cuenta que lo hacemos en la parte inferior del archivo, de forma que podamos hacer referencia a las funciones definidas antes de la declaración __main__.

if __name__ == '__main__':
  myRobot = robot.Robot('appName', 
      image_url='http://appName.appspot.com/icon.png',
      version='1',
      profile_url='http://appName.appspot.com/')
  myRobot.RegisterHandler(events.WAVELET_PARTICIPANTS_CHANGED, OnParticipantsChanged)
  myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
  myRobot.Run()

Este código simplemente define un robot nuevo con el nombre especificado, registra un único gestor de eventos, indicando al sistema que nos interesan los eventos WAVELET_PARTICIPANTS_CHANGED y WAVELET_SELF_ADDED y, a continuación, ejecuta el robot.

Si tienes una imagen de aplicación, puedes definirla para su uso como avatar de robot en el parámetro image_url. De lo contrario, puedes omitirla. La URL de perfil (profile_url) no se utiliza actualmente, pero probablemente deberías dejarla, ya que puede que la utilicemos en el futuro.

Acceso a las olas

Deseamos utilizar el evento WAVELET_SELF_ADDED para detectar cuándo se añade el robot a la ola y para volver a escribir la información en la ola. En primer lugar, escribimos una función OnRobotAdded() para gestionar nuestro evento:

def OnRobotAdded(properties, context):
  """Invoked when the robot has been added."""
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("I'm alive!")

Puede que también deseemos utilizar el evento WAVELET_PARTICIPANTS_CHANGED para detectar cuándo se añade a la ola algún elemento distinto a un robot. Escribimos una función OnParticipantsChanged() para gestionar nuestro evento:

def OnParticipantsChanged(properties, context):
"""Invoked when any participants have been added/removed"""
  added = properties['participantsAdded']
  for p in added:
    Notify(context)

Cada vez que se añadan o se eliminen participantes de la ola, recibirá este evento. Para cada participante que se añada, ejecutamos la función Notify(). Ten en cuenta que ejecutamos explícitamente Notify() para cada participante añadido, ya que no tenemos la garantía de obtener eventos discretos para todos los participantes. (El sistema de eventos puede agrupar varios participantes en un evento).

Actualmente, la función Notify() permite escribir en la ola:

def Notify(context):
  """Called when this robot is first added to the wave."""
  """Also called whenever a new participant is added to the wave>"""
  root_wavelet = context.GetRootWavelet()
  root_wavelet.CreateBlip().GetDocument().SetText("Hi everybody!")

Ten en cuenta que creamos una señalización visual nueva en la óndula, recuperamos el documento para esta señalización visual y establecemos el texto de forma explícita.

Versiones del robot

Se han versionado los robots del API de Wave. Esto permite al sistema de Wave detectar cuándo han cambiado los robots o cuándo se han modificado sus funciones. Si modificas las funciones de un robot (mediante la adición o la eliminación de eventos supervisados, por ejemplo), también deberás modificar el identificador de versión del constructor de robot.

Cuando se implementa un robot, el sistema de Wave comprueba si el identificador del robot es diferente del almacenado en caché. (El identificador del robot es sencillamente una cadena de texto). Si es así, Wave actualizará el robot y modificará el sistema para generar los eventos nuevos que hayas indicado que te interesan.

Implementación del robot

Puedes probar tu robot nuevo implementándolo en App Engine y, a continuación, añadiéndolo a una ola.

Nota: actualmente no existe ningún mecanismo que permita realizar pruebas de los robots de Wave en un equipo local con el servidor de desarrollo de App Engine. Una versión futura del SDK de Wave incluirá herramientas que permitan realizar pruebas de los robots de forma local antes de implementarlos en App Engine.

Para implementar la aplicación en App Engine, utiliza cualquier iniciador de App Engine que se pueda aplicar a tu sistema operativo. (Este tutorial se ha realizado a través de GoogleAppEngineLauncher de Mac OS). Durante la implementación, el iniciador de App Engine solicita el nombre de usuario y la contraseña asociados a la aplicación registrada y ejecuta appfg.py.

A continuación se muestra un ejemplo de resultado del iniciador de Mac OS:

*** Running appfg.py with the following flags:
    --no_cookies --email=username@gmail.com --passin update
Scanning files on local disk.
Initiating update.
Password for username@gmail.com: Cloning 1 application file.
Deploying new version.
Checking if new version is ready to serve.
Closing update: new version is ready to start serving.
Uploading index definitions.
If deploy fails you might need to 'rollback' manually.
The "Make Symlinks..." menu option can help with command-line work.
*** appcfg.py has finished with exit code 0 ***

Puedes comprobar si tu aplicación está disponible si cargas el archivo http://appName.appspot.com/_wave/capabilities.xml de Robot. La biblioteca cliente Python genera de forma automática este archivo XML, que indica los eventos para los que se ha programado que responda el robot. A continuación se muestra un archivo típico:

Nota: la biblioteca cliente Java no genera de forma automática el archivo capabilities.xml. En el caso de esta biblioteca, debes crear y proporcionar el archivo manualmente. Para obtener más información, consulta la sección Configuración de tu robot en el tutorial de Java.

Adición del robot a la ola

Puedes añadir un robot a una ola agregándolo como participante de la ola con la que desees interactuar. Para ello, primero debes añadir la dirección del robot a tus contactos actuales. (Actualmente debes hacerlo fuera de la ola actual).

A continuación, crea una ola nueva en Wave. Añade tu robot a la ola mediante su ID de Wave, que es la ID de aplicación de App Engine seguida de @appspot.com (por ejemplo, dummyrobot@appspot.com). El robot se une a la ola y añade su saludo.

¡Enhorabuena! ¡Has creado tu primer robot de Wave!