Chinaunix首页 | 论坛 | 博客
  • 博客访问: 195124
  • 博文数量: 31
  • 博客积分: 2595
  • 博客等级: 少校
  • 技术积分: 334
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-28 16:03
个人简介

知行合一

文章分类

全部博文(31)

文章存档

2015年(1)

2014年(1)

2010年(9)

2009年(20)

我的朋友

分类: 系统运维

2009-06-25 13:48:41

注:以下文章如需转载,请注明所属作者,转载地址,谢谢!

Google wave机器人:Python 教程

了解扩展(extension)如何在wave中工作的最容易的方法就是亲自构建一个机器人。机器人是通过wave协议(HTTP 接口)与wave进行交互的应用程序。目前,我们只支持寄生在(hosted withgoogle app engine上的机器人。在以后我们将支持实现了wave协议的任何客户端架构。

在这篇教程中,我们将使用Python client library来开发一个机器人实例。(这里的概念等同JAVA client libray的使用,不过实现细节会有所不同。)在这篇简短的教程中,你将创建一个简单的机器人,将其上传到APP Engine上并看到它是如何与wave配合工作。

在你开始之前,请确保在你的系统中已经安装了Python2.5版本及以上版本。你可以通过执行下面的命令行来确定是否你已经安装了Python

hostname$ python --version

Python 2.6.2

Python客户端库(The Python Client Library

Google wave机器人的开发需要使用客户端库进行编译。这份教程使用了可以从google project主机上的wave robot python client librar。这份项目在下面的位置包含了库本身的代码:

hostname$ svn checkout waveapi

创建一个目录来为你的python机器人存储代码并使用下面的svn命令来将python client library释放到waveapi目录下。

svn checkout waveapi

这个命令将在你的当前目录下创建一个waveapi文件夹。注意,如果你使用了HTTPS协议和认证来下载代码,那么你可以直接将改过的代码上传到此开源项目中。

建立App EngineSetting up App Engine

你可以使用你的python开发工具来为app engine来开发wave机器人和其他的web应用程序。在开始之前,请先遵照系说明文档来安装python sdk

app engine注册你的应用程序(Registering Your Application with App Engine

你可能会想要使用来注册你的机器人。你可以注册十个应用程序ID,但是应用程序的注册过程不能被恢复,也不能被删除,在注册完成后,应用程序ID也无法被更改。如果你希望保留你分配的应用注册,你可以选择一个在你将来的项目中会使用的应用程序ID。你也许希望可以保留一个ID来测试你的机器人。

在浏览器中打开app engine管理控制台。用你的google帐号登录,如果有必要就创建一个新的帐号。如果在此之前你还没有使用这个帐号登录过app engine,那么你会被提示来使用SMS或移动电话来对你的帐号进行验证。

My Applications菜单下点击Create an Application按钮。选择一个应用程序ID,然后按照提示来完成注册。新的应用会出现在列表中。你可以点击它的名字来浏览这个应用。

配置你的Python应用(Configuring Your Python Application

当你有了一个有效的应用程序ID的时候,在你的源码根目录下创建一个新的app.yaml应用程序规格说明,显示如下:

application: applicationName

version: 1

runtime: python

api_version: 1

 

handlers:

- url: /_wave/.*

  script: applicationName.py

- url: /assets

  static_dir: assets

你的Python脚本的命名不需要同应用程序ID相同,虽然这么做是一个传统。我们也会用一个URL形式的链接来指定你的应用程序中的静态元素,如图片,样式表(stylesheet)等。

Hello,机器人!(Hello, Robot!

现在就开始写你我们的Python代码吧。首先,创建一个*.py文件,命名要和你在app.yaml文件中写的相同。(e.g. 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()

我们将在下面的章节中解释这段代码。

导入客户端库(Importing the Client Libraries

为了将一个python应用程序变成我们的机器人,我们需要使用下面的导入语句来包换Python机器人库.

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

定义你的主函数(Defining your Main Function)

一旦导入了合适的库,那么就定义你的主函数吧。注意,我们在文件的结束才定义主函数,是为了我们可以在__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_CHANGEDWAVELET_SELF_ADDED事件很感兴趣,然后运行这个机器人。

如果你有一张应用程序图片,你可以在image_url设置中来将其设置成Robot的头像来使用。也可以就留在那不用管它。Profile_url目前没有被使用,但你应该将它保留在其中,这样以后如果需要就可以使用了。

访问WavesAccessing Waves

我们想要使用WAVELET_SELF_ADDED事件来侦测机器人本身是不是被添加进了wave中,并将信息写回到wave中。我们将首先写一个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事件来侦测是否有除了机器人之外的其他人添加进了wave。我们将写一个OnParticipantsChanged()函数来处理这个事件:

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

 

无论什么时候,任何参与者被添加进wave或被从wave中删除,它都将得到这个事件。对于每一个被添加进来的参与者,我们将调用Notify()函数。注意,我们显示地为每一个加入的参与者调用Notify(),但是我们不保证可以得到每一个参与者的离散事件(事件系统可以将多个参与者绑定到一个事件当中。)

Notify()函数做的事情就是确实会将一些东西哦写入wave

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

注意到我们在wavelet中创建了一个新的Blip,获取了该blipdocument并且显示地设置了文本内容。

部署机器人(Deploying the Robot

你可以将机器人部署到App Engine来测试,然后再将其加入一个wave

注意:目前还没有机制可以让你能够用App Engine开发服务器在本机测试wave机器人。未来的wave sdk发行版包含一些工具,这些工具允许在将机器人部署到App Engine上之前于本地测试机器人。

要将应用程序部署到app engine上面,使用适合你的操作系统的App Engine launcher。(本教程是使用Mac OSGoogleAppEngineLauncher来写的。)当部署上的时候,App Engine Launcher将向你询问和注册的应用程序相关的用户名和密码,然后执行appfg.py。下面就是由Mac OS launcher输出的例子:

*** 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 ***

你可以用加载机器人的文件的方式来确认你的应用程序是否可用,文件地址为:这个XML是由Python客户端库自动产生的并且标明了机器人被用来响应的事件。一个典型的文件显示如下:

1

 

 

注意:这个capabilities.xml不会由java客户端库自动产生。对于那个库,你必须手动的创建和提供文件。更多的信息,请看Java教程中的“配置您的机器人”。

将机器人添加到wave中(Adding the Robot to the Wave

你可以将机器人以参与者的身份添加进一个你想与之交互的wave中。为了做到这一点,你必须首先将机器人的地址添加进你现有的联系人列表中。(你必须在当前wave的外边如此操作)

Wave中,现在可以创建一个新的wave了。使用该机器人的wave ID添加你的机器人,这个IDApp Engine (例如,dummyrobot@appspot.com)。此时,机器人加入wave,然后开始打招呼。

恭喜你!你已经构建了你的第一个wave机器人了!

结束语:因为不关注wave的外观和使用感受,只关注功能和其他应用的交互,所以文章翻译到此为止。全文链接下载:google wave期待中(API部分)

阅读(1581) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-07-01 18:28:10

来自谷奥的参观者,不错,希望坚持啊。 gadgets有空也翻译下吧,我很感兴趣啊,现对robots也容易些。

chinaunix网友2009-07-01 18:28:09

来自谷奥的参观者,不错,希望坚持啊。 gadgets有空也翻译下吧,我很感兴趣啊,现对robots也容易些。

zhaiqi1632009-06-25 22:24:08

注:google扩展(extensions)包括机器人(Robots)和配件(Gadgets),但是可能不会写Gadgets,所以对于Gadgets部分先不会考虑进行翻译学习。