Избранное | Русский | Войти

Роботы Google Wave: руководство по Python

Проще всего понять работу расширений в Google Wave, создав Wave-робота. Роботы представляют собой приложения, которые взаимодействуют с Google Wave посредством Wave-протокола (HTTP-интерфейса). На данный момент поддерживаются только роботы, размещенные на Google App Engine. В будущем будет обеспечена поддержка любой клиентской архитектуры, реализующей Wave-протокол.

В этом руководстве для разработки робота используется клиентская библиотека Python. (Описанные здесь концепции применимы и для пользователей клиентской библиотеки Java™. Отличие заключается в технической реализации.) В этом кратком руководстве описано создание простого робота, его добавление в App Engine и работа с Google Wave.

Прежде чем начать, убедитесь, что у вас установлен Python 2.5 или более поздней версии. Чтобы определить наличие установки Python и номер установленной версии, нужно выполнить следующую команду в командной строке:

hostname$ python --version
Python 2.6.2

Загрузить Python можно со страницы загрузки Python.

Клиентская библиотека Python

Для разработки роботов Google Wave нужно скомпилировать клиентскую библиотеку. В этом руководстве используется клиентская библиотека Python роботов Google Wave, доступная на Хостинге проектов Google. В проект включен исходный код этой библиотеки по следующему адресу:

Создайте каталог для исходного кода робота Python и извлеките клиентскую библиотеку Python в каталог waveapi, выполнив следующую команду svn:

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

Эта команда создаст каталог waveapi в каталоге с текущим исходным кодом. Обратите внимание, что после проверки кода по HTTPS-протоколу и аутентификации можно напрямую вернуться к проекту с открытым исходным кодом.

Настройка App Engine

Разрабатывать роботов Google Wave и другие веб-приложения для App Engine можно с помощью любых инструментов для разработки на Python. Прежде чем продолжить, выполните инструкции по установке SDK Python, которые приведены в документации по App Engine.

Регистрация приложения в App Engine

Зарегистрировать робота по идентификатору приложения можно на сайте https://appengine.google.com. Можно зарегистрировать до десяти идентификаторов приложений. Регистрацию приложений нельзя отменить или удалить. Кроме того, нельзя изменить идентификатор приложения после его регистрации. Чтобы зарезервировать выделенные вам регистрации, выберите идентификатор приложения, который впоследствии используете для будущего проекта. Кроме того, можно зарезервировать идентификатор для тестирования роботов.

Перейдите в консоль администрирования App Engine в веб-браузере. Выполните вход, используя аккаунт Google. При необходимости создайте аккаунт. Если этот аккаунт не использовался для App Engine, может потребоваться подтвердить его посредством SMS и мобильного телефона.

В области Мои приложения нажмите кнопку Создать приложение. Выберите идентификатор приложения и следуйте инструкциям по завершению регистрации. Новое приложение появится в списке. Чтобы перейти в консоль администрирования для этого приложения, нажмите на его название.

Конфигурация приложения Python

Получив действительный идентификатор приложения, создайте спецификацию приложения app.yaml в корневом каталоге с исходным кодом следующего содержания:

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

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

Использовать в качестве названия скрипта Python идентификатор приложения необязательно, хотя это и привычно. Мы также указываем шаблон URL, который обрабатывает статические объекты для приложения, такие как изображения, таблицы стилей и т. д.

Начало работы с App Engine описано в Руководстве по началу работы с App Engine для Python.

Hello, Robot!

Теперь пора написать наш код на Python. Сначала создайте файл *.py с названием, указанным в файле app.yaml(например, applicationName.py). Добавьте следующий код:

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()

Этот код разъясняется в последующих разделах.

Импорт клиентских библиотек

Чтобы преобразовать приложение Python в робота, необходимо включить библиотеку роботов Python, используя следующие заявления import:

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

Определение основной функции

Импортировав необходимые библиотеки, определите основную функцию. Обратите внимание, что это делается в конце файла, чтобы можно было ссылаться на функции, определенные перед объявлением __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()

Этот код просто определяет нового робота с указанным названием, регистрирует обработчик отдельных событий, сообщая системе, что отслеживаются события WAVELET_PARTICIPANTS_CHANGED и WAVELET_SELF_ADDED, и запускает робота.

Если у приложения есть изображение, его можно установить в качестве аватара робота в параметре image_url. В противном случае этот параметр не нужен, и его можно удалить. В настоящее время параметр profile_url не используется, но его можно оставить – может пригодиться в будущем.

Доступ к волнам

Чтобы определить момент добавления робота в волну, мы используем событие WAVELET_SELF_ADDED. Затем мы отправляем информацию обратно в волну. Сначала напишем функцию OnRobotAdded() для обработки этого события:

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

Чтобы определить момент добавления других участников, отличных от робота, мы используем событие WAVELET_PARTICIPANTS_CHANGED. Напишем функцию OnParticipantsChanged() для обработки этого события:

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

Он получит это событие при каждом добавлении или удалении участников из волны. Для каждого добавляемого участника будем вызывать функцию Notify(). Обратите внимание на явный вызов функции Notify() для каждого добавляемого участника. Это обусловлено тем, что получение отдельного события для каждого участника не гарантировано. (Система событий может объединить несколько участников в одном событии.)

Функция Notify() непосредственно пишет волну:

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!")

Обратите внимание на создание объекта Blip в объекте Wavelet, получение документа для этого всплеска и явное указание текста.

Версии роботов

Роботам в API Google Wave присваиваются версии. Это позволяет системе Google Wave определять изменения роботов и их возможностей. Изменив возможности робота (например, добавив или удалив отслеживаемые события), необходимо также изменить идентификатор его версии в конструкторе робота.

При развертывании робота система Google Wave сравнит его идентификатор со значением в кэше. (Идентификатор робота представляет собой обычную текстовую строку.) Если так, Google Wave обновит робота и систему, которая создаст отслеживаемые события.

Развертывание робота

Чтобы проверить робота, разверните его в App Engine и добавьте в волну.

Примечание. В настоящее время не существует механизма для проверки Wave-роботов на локальном компьютере с помощью сервера разработки App Engine. В будущем выпуске SDK Google Wave будет предусмотрена возможность локальной проверки роботов до их развертывания в App Engine.

Чтобы развернуть приложение в App Engine, используйте загрузчик App Engine, подходящий для вашей операционной системы. (В этом руководстве используется загрузчик для Mac OS GoogleAppEngineLauncher.) При развертывании загрузчик App Engine запрашивает имя пользователя и пароль, связанные с зарегистрированным приложением, и выполняет файл appfg.py.

Вот пример результата работы загрузчика для 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 ***

Чтобы убедиться в доступности приложения, загрузите файл робота http://appName.appspot.com/_wave/capabilities.xml . Этот XML-файл автоматически создается клиентской библиотекой Python. В нем указываются отслеживаемые роботом события. Обычный файл показан ниже:

Примечание. Этот файл capabilities.xml не создается клиентской библиотекой Python автоматически. Для этой библиотеки необходимо создать и предоставить файл вручную. Дополнительную информацию можно найти в разделе Конфигурация робота руководства по Java.

Добавление робота в волну

Робот добавляется в волну, с которой нужно взаимодействовать, в качестве участника. Чтобы сделать это, необходимо сначала добавить адрес робота в существующие контакты. (На данный момент это нужно делать вне текущей волны.)

Теперь создайте волну в Google Wave. Добавьте робота в волну, используя его идентификатор Google Wave, который представлен в виде идентификатора приложения App Engine с @appspot.com (например, dummyrobot@appspot.com). Робот присоединится к волне и добавит приветствие.

Поздравляем! Вы создали своего первого Wave-робота!