知行合一
全部博文(31)
分类: 系统运维
2009-06-25 13:48:41
了解扩展(extension)如何在wave中工作的最容易的方法就是亲自构建一个机器人。机器人是通过wave协议(HTTP 接口)与wave进行交互的应用程序。目前,我们只支持寄生在(hosted with)google app engine上的机器人。在以后我们将支持实现了wave协议的任何客户端架构。
在这篇教程中,我们将使用Python client library来开发一个机器人实例。(这里的概念等同JAVA client libray的使用,不过实现细节会有所不同。)在这篇简短的教程中,你将创建一个简单的机器人,将其上传到APP Engine上并看到它是如何与wave配合工作。
在你开始之前,请确保在你的系统中已经安装了Python2.5版本及以上版本。你可以通过执行下面的命令行来确定是否你已经安装了Python。
hostname$
python --version
Python
Google wave机器人的开发需要使用客户端库进行编译。这份教程使用了可以从google project主机上的wave robot python client
librar。这份项目在下面的位置包含了库本身的代码:
hostname$
svn checkout
waveapi
创建一个目录来为你的python机器人存储代码并使用下面的svn命令来将python client library释放到waveapi目录下。
svn checkout
waveapi
这个命令将在你的当前目录下创建一个waveapi文件夹。注意,如果你使用了HTTPS协议和认证来下载代码,那么你可以直接将改过的代码上传到此开源项目中。
你可以使用你的python开发工具来为app engine来开发wave机器人和其他的web应用程序。在开始之前,请先遵照系说明文档来安装python sdk。
你可能会想要使用来注册你的机器人。你可以注册十个应用程序ID,但是应用程序的注册过程不能被恢复,也不能被删除,在注册完成后,应用程序ID也无法被更改。如果你希望保留你分配的应用注册,你可以选择一个在你将来的项目中会使用的应用程序ID。你也许希望可以保留一个ID来测试你的机器人。
在浏览器中打开app engine管理控制台。用你的google帐号登录,如果有必要就创建一个新的帐号。如果在此之前你还没有使用这个帐号登录过app engine,那么你会被提示来使用SMS或移动电话来对你的帐号进行验证。
在My Applications菜单下点击Create an Application按钮。选择一个应用程序ID,然后按照提示来完成注册。新的应用会出现在列表中。你可以点击它的名字来浏览这个应用。
当你有了一个有效的应用程序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)等。
现在就开始写你我们的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()
我们将在下面的章节中解释这段代码。
为了将一个python应用程序变成我们的机器人,我们需要使用下面的导入语句来包换Python机器人库.
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设置中来将其设置成Robot的头像来使用。也可以就留在那不用管它。Profile_url目前没有被使用,但你应该将它保留在其中,这样以后如果需要就可以使用了。
我们想要使用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,获取了该blip的document并且显示地设置了文本内容。
你可以将机器人部署到App Engine来测试,然后再将其加入一个wave。
注意:目前还没有机制可以让你能够用App Engine开发服务器在本机测试wave机器人。未来的wave sdk发行版包含一些工具,这些工具允许在将机器人部署到App Engine上之前于本地测试机器人。
要将应用程序部署到app engine上面,使用适合你的操作系统的App Engine launcher。(本教程是使用Mac OS的GoogleAppEngineLauncher来写的。)当部署上的时候,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客户端库自动产生的并且标明了机器人被用来响应的事件。一个典型的文件显示如下:
注意:这个capabilities.xml不会由java客户端库自动产生。对于那个库,你必须手动的创建和提供文件。更多的信息,请看Java教程中的“配置您的机器人”。
你可以将机器人以参与者的身份添加进一个你想与之交互的wave中。为了做到这一点,你必须首先将机器人的地址添加进你现有的联系人列表中。(你必须在当前wave的外边如此操作)
在Wave中,现在可以创建一个新的wave了。使用该机器人的wave ID添加你的机器人,这个ID是App Engine (例如,dummyrobot@appspot.com)。此时,机器人加入wave,然后开始打招呼。
恭喜你!你已经构建了你的第一个wave机器人了!
结束语:因为不关注wave的外观和使用感受,只关注功能和其他应用的交互,所以文章翻译到此为止。全文链接下载:google wave期待中(API部分)