IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Lotus  >

创建自己的Sametime Bots 第一部分

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

John W. Rooney

XML error: Please enter a value for the author element's jobtitle attribute, or the company-name element, or both.



Dick McCarrick

XML error: Please enter a value for the author element's jobtitle attribute, or the company-name element, or both.



2003 年 6 月 01 日

这些日子以来,来自于IBM/Lotus 激动人心的一项新型技术是Sametime bots。这些是充分利用Sametime的提醒和实时协作功能,向后台数据源,如:数据库或Web页面提供基于文本的交互式界面程序。Bot执行特殊的工作,如查找请求的信息、即将开展一项活动时提醒并在用户日历中查找双方都可用的会议时间。您可以设计Bots ,从而您可以在线交谈和询问,就好像它们是活生生的人一样。

本文是两篇讨论Sametime bots的第一部分。在本文中,我们介绍Sametime bots的概述和它们的工作方式。然后我们介绍使用可用的Sametime工具包来创建Sametime bot的基本流程。最后我们详细测试一个简单的bot ,您可以修改来创建自己的bot。(您可以从 http://www-10.lotus.com/ldd/sandbox.nsf下载这类Bots的样例程序代码。)

我们假设您是一位富有经验的Sametime和Java编程人员,熟悉与Sametime一同提供的开发人员工具包。

什么是Sametime bot?


我们首先承认bot一词-来源于机器人-可能会让某些人想起那些古老的恐怖电影,片中大机器怪物无情地毁坏那些毫无防备的人类。但是,在软件领域,bot拥有更深远的意义。在临床方面,bot可以简单的定义为根据用户指令执行特殊任务的软件工具。例如,bot可以查找并检索您请求的信息,或者作为您和您查找的数据的中间媒体。它们可以与您实时进行交互或在后台运行。

当您向Sametime应用bot技术时,事情很快变得有趣。例如,Sametime bot可以使用提醒技术来跟踪整个Sametime社区-目前已经登录的用户,登录用户的状态等。另外,bot可以接入数据仓库,如Notes和DB2数据库,检索成员信息,如工作职位和专业技术领域。这立即提升了解决问题的某些极具吸引力的可能性,涉及在其它应用程序当中查找最合适的人选来回答特定问题。

而且,Sametime bot是作为您好友列表中的在线人员出现的。换句话说,当运行一个bot时,您将看到它在线,就好像它是Sametime社区的家庭成员一样。这使您能够设计用户实际上可以与其交互的bots-询问自然语言问题,发布指令等。对于Sametime用户来说,一个精心设计的bot就像一个永远在线的专家一样,它可以高速回答问题和执行指令。Bots甚至可以有内置的"个性"来增强用户体验(当然,适用于单一目的的简单bot将有可能在这一方面受到限制)。

另一重点是当您和其它人在线时Sametime bot就可以获知。当特定事件发生时这允许bot开始与您进行交谈。这使您能够设计简单(例如,定时的提示)或复杂(例如,当您需要会唔的三个人同时全部在线时启动Sametime会议)的应用程序。稍微设想一下,当您离线时您可以创建bot来收集某些信息并在您登录后向您发送这类信息-或者把它发送到您选择的其它应用程序,如Notes数据库。这一项让Sametime bot通知您的功能对工作流程开发人员很有吸引力,它们可能更喜欢即时信息(而不是电子邮件)来通知人们文件正在等待它们的审批。

结合所有这些特性,您可以设计一些令人惊讶的高级交互式应用程序。例如,在IBM我们向员工提供大量的Sametime bot,包括:

  • Calendar,查询指定人员的日历以查找双方都可以出席的会议时间
  • Dictionary,在在线字典中查找请求的词语。
  • Help,允许用户在多个在线帮助系统中进行查询。
  • RemindMe,当时间/日历事件发生时通知用户(例如即将召开的会议或假期)。
  • SkillTap,查找并帮助用户联系拥有一项或多项请求的技能的其它员工。
  • Stockquote,从任何在线股票市场ticker检索价格数据(当然不是在工作时间内花费大量的时间来做这一项工作。)
  • WhatIs,定义IBM缩略语(因此它非常流行) 。

即使在这一小规模的Sametime bot样本中,也很容易发现一项或多项应用程序是如何满足您的需求。例如,帮助bot对于企业帮助台来说可能非常有用。该bot查找最常见的问题,进行自然语言分解以查找关键字。然后它在多个在线帮助数据库中查找这些关键字,从而查找与用户询问的问题最相匹配的问题。最后,该bot向用户发送Sametime信息,列出它找到的问题以及到适当答案的链接。类似的Sametime bot可以帮助您降低支持成本。

其它使用Sametime bot的领域包括(但不限于):

  • 自动响应用户发送的信息(包括向特定用户发送定制的信息)
  • 服务器生成的告警和其它一般公告
  • 离线信息传递
  • 捕获并存储在线会话

必须注意的是Sametime bot可以用于任何Sametime可用的环境。例如,您可以创建Sametime bot 来增强QuickPlace,该Sametime bot作为永远在线的"小组成员", 您可以与之联系来迅速获得信息。(当然,QuickPlace也使用自己的Placebot技术)

这一节我们的目标是帮助您了解Sametime bots的概念、它们的工作方式以及您可以做的一些事情。如果我们完全了解,您将希望了解更多关于如何构建自己的Sametime bot的信息。





回页首


设计和部署考虑因素


在这一节,我们提供您设计、编程和部署自己的Sametime bots时要考虑的一些建议。





回页首


设计bot


设计Sametime bot时您应考虑用户与其交互的方式的特殊特性。正如我们前面提到的,bot 可以拥有在线与一位真实的用户进行交谈的"外观",这位用户为Sametime社区的另一位成员。因此,bot界面在其是否成功中起着至关重要的作用。这对于设计用于帮助技术不太精湛的用户查找信息的bot来说尤其如此。

因此,当规划您的Sametime bot时,考虑它将承认并接受的关键字和动词。这些要素可以结合到用户乐于交谈的自然语言界面。同样记住bot将如何响应用户。信息读起来应像完整的句子,而不是需要解释不可思议的包含文字和数字的字符串。精心设计的"天然"界面将增加开发bot的时间和复杂性,但它是一项使用户感到舒适的值得做的工作。





回页首


对bot进行编程


您使用Sametime开发人员工具包Toolkit来创建bot。Sametime工具包分为两类:客户端和服务器端工具包。客户端工具包主要直接与用户交互,服务器端工具包在服务器上运行并提供后台服务。您可以使用任何这些工具包来创建Sametime bot:

  • (客户端) Java、C++和COM Toolkit
  • (服务器端)Community Server Toolkit

关于这些和其它Sametime工具包的更详细信息,请参阅LDD Today 文章" A tour of Sametime toolkits。" 您还可以参阅Sametime toolkit 产品随机文档,该文档可以从 http://www.lotus.com/ldd/doc 下载。





回页首


部署bot


Sametime bots通常运行作为单独的应用程序,然而它们也可以运行作为servlets或者甚至Domino代理。Bot可以在客户机上运行,也可以在服务器上运行。客户机更普通一些,但运行在服务器上的bot更方便多位管理员访问(因此可用于向整个Sametime社区发送公告和信息)。

对Sametime服务器而言,bot通常被认为是"另一个人"。这意味着当用户登录时,该服务器期望bot提供有效的用户名和密码。然后该服务器将根据其用户目录,Domino 目录或LDAP目录,对这些信任级别进行鉴别。当您启动bot,时您可以提供用户名和密码信息作为参数,例如botname username password。当然,这意味着您输入的用户名和密码组合必须存在于Sametime 服务器使用的LDAP或Domino目录中。(经常,当启动bot 时用户将简单的输入它们自己的用户名和密码。然后bot在获得启动bot的用户的授权后开始运行。)

对于自动启动以响应特定日期/时间或其它即将触发的事件而发生的Sametime bots来说,安全性可能要稍微复杂一些。在这种情况下,bot必须为Sametime服务器提供用户名和密码且无需人员干预。这类信息将被保存到bot可以访问的程序或文件中,以便把这类信息传送给服务器。此时您需要确保非法用户不能访问信任的数据。





回页首


"Eightball"样例bot


现在我们把注意力转向我们的样例Sametime bot,您可以从Sandbox下载获得这一bot。 我们把这类bot称为"Eightball"bot,因为它使用随机信息来响应用户的问题。当然,这类bot在真正的Sametime环境中部署了很少的应用程序(除非您有太多充裕的时间)。但是,Eightball 非常适合于展示您如何对bot进行编程:

  • 登录Sametime 服务器
  • 侦听登录用户信息
  • 响应用户信息(在随机响应的情况下,然而在真正的生产bot中您构建了逻辑来分析用户的问题,选择适当的响应或措施)

我们以简单概述用于创建这一bot 的Sametime Java工具包开始这一部分。然后我们详细测试该bot,介绍哪一个子程序在发挥作用(此时讨论将更多的涉及技术,因此要求用户对Java编程有比较深入的了解。)





回页首


Sametime Java工具包


在研究程序之前,您需要了解Sametime Java 工具包的许多事情,我们使用它来创建这类样例Sametime bot。在本例中,我们使用三个重要工具包领域:

  • Sametime对象
  • Sametime服务和组件
  • Listener

我们将随后详细介绍每个领域。关于Sametime Java工具包的完整信息,请参阅Sametime Java工具包开发人员指南。

Sametime对象


Sametime Java工具包为开发人员提供面向对象的API。Java编程人员应对这类API非常熟悉。Sametime 服务器和工具包提供的许多服务要求您创建某些对象来使用这类服务。例如,STSession对象持有一组与Sametime会话相关的组件。每个组件与Sametime 服务器提供的功能相关(如即时信息或感知)。您必须创建一个STSession对象实例,以将组件功能装载到您的应用程序中。

Sametime服务和组件


Sametime Java工具包包括访问Sametime服务器提供的各项服务的组件。这些服务包括:

  • 社区服务,使您能够登录和退出Sametime服务器和运行功能,如设置您的状态
  • 即时消息服务,允许服务发送信息(文本或数字)
  • 查找服务,使您能够查询服务器来获得关于用户或组的信息并返回相关的STObject (STUser或STGroup)
  • 场所服务,允许您定义虚拟场所(如n-路聊天)并邀请用户加入

在我们的实例中,使用的唯一服务是社区服务。

您可以通过多种方式将需要的组件装载到应用程序中。最简便的方式是使用STSession 的loadAllComponents或loadSemanticComponents方法。您可以使用loadComponents 方法并传送您希望接入的组件列表来逐个装载组件。在您装载完应用程序组件之后,您需要获得它们各自API的引用信息以使用它们的功能。您可以使用STSession.getCompAPI()方法来做到这一点。例如,如果您希望访问InstantMessagingService API,使用以下程序:

s= (InstantMessagingService)session.getCompApi(InstantMessagingService.COMP_NAME);

其中s 是持有服务API参考信息的变量名称,session是持有当前STSession对象的引用信息变量的名称。

STSession不区别组件,因此您需要为返回的引用信息匹配正确的类型(在这种情况下InstantMessagingService)。您可以使用这一表单来获得任何Sametime工具包组件API的参考信息。

Listener


Sametime Java 工具包的API和服务是异步操作的。这意味着您需要部署Listerer来接收服务器发送的事件。因此当您在服务器上调用一项功能时(如登录),在服务器响应之前可能会存在延迟。当谈到期望的即时信息处理领域时,您将随机收到服务器发送的事件(如与指定用户新信息或状态变化相关的事件)。使用listeners,服务器通知您感兴趣的事件,使您能够采取措施来响应这些事件。

正如前面提到的,许多服务需要helper对象来使用它们的功能。一些服务(如InstantMessagingService)把helper对象直接返回到事件中。例如,尽管您可以使用createIM() 方法来直接创建IM (即时信息处理)对象,当事件被触发时imReceived() event handler返回一个IM对象。我们在样例Eightball bot中展示较新的技术。





回页首


Eightball bot 程序


这一节测试我们的Sametime bot -Eightball程序。您可以从 http://www.lotus.com/ldd/Sandbox.nsf

下载来获得这一bot样例程序。.

在程序的第一部分,我们从我们需要用来提供bot功能的工具包引入不同的包。我们还引入java.util.*,以生成随机响应:

/* Sametime Bot Sample
import com.lotus.sametime.awareness.*;
import com.lotus.sametime.community.*;
import com.lotus.sametime.core.comparch.*;
import com.lotus.sametime.core.constants.*;
import com.lotus.sametime.core.types.*;
import com.lotus.sametime.im.*;
import java.util.*;

在我们的EightBallBot主类中,我们需要确定我们将实现的listeners。在这种情况下,我们注册listeners登录事件和与即时信息处理相关的事件:

public class EightBallBot implements Runnable, LoginListener, ImServiceListener, ImListener {
CommunityService commService;
Thread engine;
InstantMessagingService imService;
STSession stsession;
//responses holds the array of random answers to user inquiries
String [] responses = { "Yes",
"No",
"Maybe",
"Doesn't look good",
"Try again",
"Answer hazy"};

通常Sametime应用程序只有一个STSession对象。但由于您可以有多个会话,每个STSession有一个保存在静态会话表中的名称。在任何应用程序中,指定的名称只有一个会话,因此我们需要绕接使用try/catch语句创建会话的程序:

public EightBallBot(String serverName, String userId, String password) {
try {
stsession = new STSession("EightBallSession");
} catch (DuplicateObjectException e) {
e.printStackTrace();
return;
}

在创建会话后,我们可以装载需要的组件。在这种情况下,我们简单装载了所有语义(非-UI)组件并启动会话。由于CommunityService API用于登录到Sametime服务器,我们首先需要使用前面介绍的方法来获得该API的引用信息。在拥有引用信息之后,我们添加一个listener来检查与登录相关的事件,使用loginByPassword 方法来尝试登录该服务器:

stsession.loadSemanticComponents();
stsession.start();
commService = (CommunityService)stsession.getCompApi(CommunityService.COMP_NAME);
commService.addLoginListener(this);
commService.loginByPassword(serverName, userId, password);
}

如果您实现了listener界面,如LoginListener,那么有一些您将必须处理的事件(在这种情况下为loggedIn()和loggedOut() 事件)。好的IDE自动为这些需要的事件添加stub。如果我们成功登录到该服务器,那么我们将接收到loggedIn()事件。在这一handler中,我们可以请求InstantMessagingService的引用信息,注册我们的应用程序为接收交谈信息。我们使用registerImType()方法来显示我们希望接收到的信息的类型(这是极其重要的一步)。缺省情况下InstantMessagingService拒绝没有注册的IM类型的任何信息。然后我们添加listener imService.addIMServiceListener(this)来接收任何输入的即时信息:

public void loggedIn(LoginEvent e) {
imService = (InstantMessagingService)stsession.getCompApi(InstantMessagingService.COMP_NAME);
imService.registerImType(ImTypes.IM_TYPE_CHAT);
imService.addImServiceListener(this);
}
public void loggedOut(LoginEvent e) {}

当用户使用我们的bot启动一次会话时,imServiceListener启动imReceived()事件并传送一个IM对象。当用户双击其好友表中的bot ID 时这一事件立即触发。在IBM许多其它的bot中,我们使用这一事件(和相关IM对象的属性和方法)来立即响应该位用户。这种响应可能包括:

  • 欢迎信息
  • 帮助文本信息
  • 专门为该位用户定制的信息

例如,在设计用于为用户信息中的股票提供当日交易价格的bot中,我们可以使用这一事件来立即向用户返回这类信息。为了收到用户发送的后续信息,我们需要使用e.getIM().addIMListener(this)来添加IMListener。在我们的例子中:

  • e 由事件返回并参考我们与联系我们的用户一同打开的IM会话
  • getIM() 是我们用于获得与这一事件相关的IM对象的方法
  • addIMListener() 是我们用于侦听本会话中其它信息的IM对象的方法

程序代码是:

public void imReceived(ImEvent e) {
e.getIm().addImListener(this);
}

当我们实现IMListener 接口时需要以下方法:

public void dataReceived(ImEvent e) {}
public void imClosed(ImEvent e) {}
public void imOpened(ImEvent e) {}
public void openImFailed(ImEvent e) {}

在我们的例子中,我们关注当我们接收用户发送的文本时触发的事件。注意:Sametime也可以用于发送数字数据。如果您的应用程序使用IM信道来发送和接收数字数据,同时能全面控制Sametime用户社区使用的客户机(或者您与设计用于处理事件的定制的应用程序之间的信息处理协作),那它将变得非常强大。

正如我们提到的,我们的bot意味着使用随机信息来响应用户的查询。我们不对用户信息的内容特别感兴趣,但在大多数bot中您需要从信息提取内容,使用它来选择适当的响应或执行某些其它功能(如数据库查询)。当用户向Eightball发送文本信息时触发textReceived() 事件。您可以使用IMEvent的getText()方法来分解该信息的内容。例如,假设您的bot为用户提供连接包含部件信息的数据库的接口。您可以使用getText()方法来确定用户请求的部件编号、从信息中分解出部件编号和调用适当的功能来查询数据库中的部件信息。在我们的程序中,我们简单生成了随机响应信息并使用sendText()方法来发送这类信息:

public void textReceived(ImEvent e) {
Random rnums = new Random();
int item = rnums.nextInt(responses.length);
e.getIm().sendText(true, responses[item]);
}
public void serviceAvailable(AwarenessServiceEvent e) {}
public void serviceUnavailable(AwarenessServiceEvent e) {}
public void start() {
if (engine == null) {
engine = new Thread(this, "EightBallThread");
engine.start();
}
}
public void run() {
Thread myThread = Thread.currentThread();
while (engine == myThread) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
public static void main(String[] args) {
EightBallBot ebb = new EightBallBot("<server name>", "<user ID>", "<password>");
ebb.start();
}
}

正如我们提到的,Eightball不是Sametime bots中最卓越的部分。但它明显展示了在所有交互式bot中使用的多项重要的任务-登录、侦听用户信息和响应。我们将在第二部分中详细讨论更复杂、更易于使用的Sametime bots。





回页首


Sametime bots:您永远机警(Ever-alert)的朋友


在结束这一Sametime bots介绍性文章之前,我们希望您注意以下几点:

  • Bots 是使即时信息处理超出交谈范畴的第一步。

    利用Sametime社区来获得信息的价值很明显。(作者在编写本文时经常这样做。)但是您需要的人此时可能不在线,或不知道正确答案,或者也许您认为经常麻烦这个人

    是一种犯罪。而另一方面,永远可用的精心设计的Sametime bot知道您问题的答案,无论您是如何频繁打扰它,它总是很有耐心。

  • Bots 提供简单方便的数据接口

    每次当问题出现时,不是所有人可以(或希望)遍历所有可用的公司数据。Sametime bot 可以为您迅速做到这一点,获得关注的结果,感觉就好像您请求一位同事来做这一研究一样。

  • Bots 可以实现双向交互。

    当您需要Sametime bot 来提供信息或执行一项任务时,您可以开始与Sametime bot通信。相反,当某些即将触发的事件发生时该bot可以联系您。在这一方面,该bot可以作为您的虚拟助手,开展工作,监视您可能太忙而不能自己亲自完成的状况。

  • Bots 可以为工作流程和商业流程带来实时行为。

    正如我们前面提到的,在时间尤其关键的工作流程中,Sametime bots可以提供电子邮件更快的实时备选方案 。

在本文中,我们向您介绍了Sametime bot。我们阐述了它们的概念、它们的功效以及使用它们的方法。我们为您提供了一些背景知识和建议,方便您设计和部署自己的Sametime bots时进行考虑。我们还提供了简单的演示 bot,介绍程序代码是如何工作的,以及您如何采用它来创建真正您自己的bot。

我们希望本文对您兴镏T谙乱黄恼轮校颐墙晗傅慕樯苁褂肧ametime bots的例子,以及我们在IBM使用的真正发挥作用bots 。请继续关注!



参考资料

  • 本文摘自 www-10.lotus.com/ldd/today.nsf/Lookup/ST_Bots2



  • Lotus 专题:如果您是对Lotus感兴趣的开发人员,想进一步了解Lotus产品家族,熟悉Lotus产品是如何和IBM其他的产品一起协同工作的,Lotus是如何支持诸如XML、Web服务等等业界的开放标准的,如何用Lotus进行J2EE的开发,即刻访问 IBM developerWorks 中国网站的 Lotus 专题。在这里,我们为您精心收集了相关的文章、教程、红皮书,相信对您的开发会有所帮助。


作者简介

John W. Rooney是IBM互联网技术开发部经理。Rooney (朋友们这样称呼他)和其Webahead小组开发了在IBM内部广泛使用的大量应用程序,包括多个极其依靠Sametime bot技术的应用程序。


Dick McCarrick has co-authored this article




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款