跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

如何使您的 PHP 应用程序变成聊天机器人(bot)

连接几乎所有的 PHP 应用程序到 IRC 服务器并使信息随处可用

Jack Herrington (jack_d_herrington@codegeneration.net), 高级软件工程师, "Code Generation Network"
Jack D. Herrington 是一名高级软件工程师,具有 20 多年的从业经验。他是以下 3 本书的作者:Code Generation in ActionPodcasting Hacks 以及即将出版的 PHP Hacks。他还撰写了 30 余篇文章。

简介: 有一个免费的模块可以用于将 PHP 应用程序连接到 IRC 服务器,并对消息作出响应。为了说明如何使用该模块,本文向您展示如何在 PHP 中创建一个 IRC 聊天机器人(bot)(bot 是 automatic robot 的简称),用于向您告知按邮政编码查询的天气情况。

发布日期: 2006 年 3 月 16 日
级别: 初级
访问情况 : 2161 次浏览
评论: 


您不断想要与您的 PHP 程序进行交谈?您痴迷于即时消息?如果是这样,我可以为您提供一个模块!该模块存在于 PHP 扩展及应用资料库(PHP Application and Extension Repository,PEAR)中,用于将 PHP 应用程序连接到 Internet 中继聊天(Internet Relay Chat,IRC)服务器,并对服务器的消息作出响应。实际上,PEAR 模块是将 PHP 应用程序变成 bot

聊天机器人(bot)是什么?

您不知道 bot 是什么?其实并不只有您不知道。聊天机器人(bot) 是一个程序,可以登录到一个系统中(例如,IRC 系统或西洋双陆棋服务器)并回答问题或进行游戏。

聊天机器人(bot)的意义在于,您能够通过经常使用的机制 —— 即时消息 —— 与其进行通信。如果您总是在聊天室中,那么现在不需要离开聊天室就可以得到当地的天气信息。本文向您展示如何在 PHP 中创建一个 IRC 聊天机器人(bot),用于以向您告知按邮政编码查询的天气情况。

IRC 基础

假如您不熟悉 IRC 系统,可以从这里入门。IRC 系统由两部分组成:服务器和客户机。服务器创建数个虚拟信道供用户登录并互相通信。信道被给予一个熟悉的名称,以与对话的主题匹配。

通过指定主机名称、端口号和所需的别名,将 IRC 客户机软件连接到服务器。客户机在成功地连接到服务器之后,就能够加入任何数目的信道并开始发送和接收消息。要发送消息,只需在一个文本框中输入消息,并按 Enter 键,就跟任何其他的即时消息客户机一样。然后客户机发送消息到服务器,服务器然后将消息广播到加入该信道的所有其他的客户机。IRC 客户机软件对所有的操作系统及便携设备可用。

聊天机器人(bot)可以像其他的客户机那样运行。它们连接到服务器,然后加入一个或多个信道。一般而言,聊天机器人(bot) 不会自主地发出消息。更确切地说,它们侦听信道中来自用户的符合特定格式的消息。聊天机器人(bot)发出消息以响应这些特定格式的请求。

本文中 聊天机器人(bot)查找的用户消息以 weather 开始,后跟邮政编码。(但是一开始,我仅查找 weather 以使例子简单。)


安装 PEAR 模块

从安装几个 PEAR 模块开始。PEAR 是用户提供的模块组成的资料库。这些模块涵盖了读写不同类型的文件、使用不同的 Web 服务、科学模块以及更多内容。

PEAR 的一个主要功能是,站点为 Microsoft® Windows®、Linux® 以及 Mac OS X 操作系统提供了脚本,使您能够通过计算机的命令行方便地安装 PEAR 模块。下面是我在 Windows 命令提示窗口下的会话,通过该会话安装了 Net_SmartIRC 模块:


清单 1. Windows 命令提示窗口下的会话

    C:\ >pear install Net_SmartIRC
    downloading Net_SmartIRC-1.0.0.tgz ...
    Starting to download Net_SmartIRC-1.0.0.tgz (185,991 bytes)
    ........................................done: 185,991 bytes
    install ok: Net_SmartIRC 1.0.0
  


安装 IRC 服务器

技巧

要使用本文中的代码,需要安装 Net_SmartIRC 和 Services_Weather 模块, 以及它们依赖的模块(参见 参考资料 获得下载地址)。例如,Services_Weather 需要 XML_Serializer(包含在其他模块中)。PEAR 脚本列出了必须安装的组件。注意:如果 PEAR 脚本提示没有现有模块的已发布版本,那么使用强制选项 (-f) 来强制安装模块。

创建 IRC 聊天机器人(bot)的下一个步骤是设置聊天机器人(bot)能够登录的服务器。您可能已经使聊天机器人(bot) 登录到了一个公共服务器,但是我建议先安装一个本地服务器用于测试。

我选择运行 Windows 版本的 “beware ircd” 服务器(beware ircd 服务器还有一个 Linux 版本)。我查看了几台服务器,发现这一台是最容易使用的。安装 beware ircd 服务器很简单,我将其安装在 C:\ircd 目录下。从该目录下,我通过打开命令提示符并键入如下命令,运行该服务器:

    C:\ircd> bircd
  

注意:无需更改任何配置。

但是如何知道服务器是否正在运行呢?要进行验证,需要安装 IRC 客户机。


安装 IRC 客户机

要测试本地服务器,并且与聊天机器人(bot)进行通信,需要安装 IRC 客户机。我选择安装用于 Windows 的常见的 mIRC 客户机(在撰写本文时,V6.16 是最新版本)。您可以选择适合您的平台的客户机。

安装 mIRC 客户机后,我从 Startstart mIRC 应用程序。接着使用 Connect 命令连接到 localhost。我使用菜单中的 join 命令,连接到 #weather 信道,如图 1 所示。


图 1. 从 IRC 客户机加入 #weather 信道
从 IRC 客户机加入 #weather 信道

连接信道后,将显示如图 2 所示的窗口。从这里我可以与其他人或者是聊天机器人(bot)交谈。


图 2. #weather 信道的聊天界面
 #weather 信道的聊天界面

现在,服务器已在本地运行,IRC 客户机已安装好并在运行,并且安装了 PEAR 模块,我就可以编写接收我所在地区的天气状况的 PHP 聊天机器人(bot) 了。


从连接开始

我将创建脚本的几个版本。每一个版本都会添加更多的函数。PHP 聊天机器人(bot)脚本的第一个版本如清单 2 所示。在该脚本中,我登录到 IRC 服务器并创建了一个对特殊类型的消息作出响应的类。该模块专门用于为 IRC 创建 聊天机器人(bot)。


清单 2. 聊天机器人(bot)第一个简单的版本

    <?php
    include_once('Net/SmartIRC.php');
    
    class weatherbot
    {
    function weather(&$irc, &$data)
    {
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    'Yeah, weather');
    }
    }
    
    $host = "localhost";
    $port = 6667;
    $nick = "weather";
    $chan = "#weather";
    
    $bot = &new weatherbot( );
    $irc = &new Net_SmartIRC( );
    $irc->setUseSockets( TRUE );
    $irc->registerActionhandler( SMARTIRC_TYPE_CHANNEL,
    '^weather', $bot, 'weather' );
    $irc->connect( $host, $port );
    $irc->login( $nick, 'Weather bot', 0, $nick );
    $irc->join( array( $chan ) );
    $irc->listen( );
    $irc->disconnect( );
    ?>
  

脚本中重要的部分是 registerActionhandler 方法,该方法连接到具有特殊动作字符串和方法的 bot 对象。^weather 字符串是一个正则表达式,如果该字符串与进入 IRC 信道的任何文本类型相匹配,那么将调用动作处理器。

脚本中其他重要的部分是 Weatherbot 类中的 weather 方法。该方法对天气请求作出响应,并且传回(在此时)“Yeah, weather”。(在本文的结尾部分,它将告诉您天气状况。)

要启动脚本,我使用下列命令在命令提示符下运行它:

    C:\ircd> php ircbot.php
  

脚本注册到本地 IRC 服务器,并开始进行无限循环。

图 3 展示了注册到服务器的 weather 聊天机器人(bot)。同时也展示了我在文本窗口中输入 weather 并按 Enter 键。


图 3. 与 weather 聊天机器人(bot)进行交谈
与 weather 聊天机器人(bot)进行交谈

Weather 聊天机器人(bot)接着能够以固定的字符串 Yeah, weather 作出响应。

这是一个好的开始。现在,如何获得天气状况呢?


获得天气状况

要获得天气状况,将使用 Weather Web 服务 PEAR 模块。清单 3 展示了该模块,我对该模块进行了修改以提供我所在地区的天气状况。


清单 3. 报告天气状况的 weather 聊天机器人(bot)

<?php
include_once('Net/SmartIRC.php');
include_once('Services/Weather.php');
$weather = new Services_Weather();
$wdc = $weather->service( "Weatherdotcom" );
class weatherbot
{
  function weather(&$irc, &$data)
  {
     global $wdc;
     $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
            'Yeah, weather');
     $fc = $wdc->getForecast( 94587, 1 );
     foreach( $fc['days'] as $day )
     {
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Condition: ".$day['day'][ 'condition' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "High: ".$day[ 'temperatureHigh' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Low: ".$day[ 'temperatureLow' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Wind: ".$day['day'][ 'wind' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Wind Degrees: ".$day['day'][ 'windDegrees' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Wind Direction: ".$day['day'][ 'windDirection' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Precipitation: ".$day['day'][ 'precipitation' ] );
       $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
          "Humidity: ".$day['day'][ 'humidity' ] );
     }
  }
}
$host = "localhost";
$port = 6667;
$nick = "weather";
$chan = "#weather";
$bot = &new weatherbot( );
$irc = &new Net_SmartIRC( );
$irc->setUseSockets( TRUE );
$irc->registerActionhandler( SMARTIRC_TYPE_CHANNEL,
  '^weather', $bot, 'weather' );
$irc->connect( $host, $port );
$irc->login( $nick, 'Weather bot', 0, $nick );
$irc->join( array( $chan ) );
$irc->listen( );
$irc->disconnect( );
?>
  

我所做的第一个更新是添加 include 指令以引用天气服务模块。然后创建了一个天气服务对象。在 weather 方法中,调用 getForecast 方法并请求给定邮政编码地区的天气预报 —— 在本例中,邮政编码是 94587,即 Union City, Calif 的邮政编码。

从那里,我得到第一天的天气信息,并通过 IRC 信道将天气结果以消息的形式发送出去。图 4 展示了产生的文本窗口。


图 4. 带有硬编码邮政编码的天气响应
带有硬编码邮政编码的天气响应

但是我想您并不想要得到 所在地区的天气信息。那么,如何得到您所在城市的天气信息呢?


得到您需要的天气信息

要得到与您相关的天气信息,需要解析请求的文本。这就意味着要对 weather 方法做一些小小的修改,如清单 4 所示。


清单 4. 新的 weather 方法

    class weatherbot
    {
    function weather(&$irc, &$data)
    {
    global $wdc;
    
    $zip = $data->messageex[1];
    
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Yeah, weather for $zip");
    
    $fc = $wdc->getForecast( $zip, 1 );
    foreach( $fc['days'] as $day )
    {
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Condition: ".$day['day'][ 'condition' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "High: ".$day[ 'temperatureHigh' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Low: ".$day[ 'temperatureLow' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Wind: ".$day['day'][ 'wind' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Wind Degrees: ".$day['day'][ 'windDegrees' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Wind Direction: ".$day['day'][ 'windDirection' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Precipitation: ".$day['day'][ 'precipitation' ] );
    $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel,
    "Humidity: ".$day['day'][ 'humidity' ] );
    }
    }
    }
  

IRC 模块巧妙地将用户输入的消息断开为单词,可以在 messageex 数组中以数组的方式引用这些单词。在本例中,第一个条目是邮政编码。

图 5 展示了如何使用具有邮政编码的天气请求。正如所看到的,我输入 19081,这是 Swarthmore, Pa.,Swarthmore College 所在地的邮政编码。


图 5. Swarthmore, Pa. 的天气情况
图 5. Swarthmore, Pa. 的天气情况

当然,我应该进行更多的错误检查,例如确保邮政编码是有效的。但是我将这些留给您自己来完成。


结束语

本文涵盖了连接 PHP 应用程序到 IRC 的基本内容。您可以使用该应用程序作为起点,并且添加自己的 PHP 类到代码中。然后您就可以通过 IRC 利用浏览器使用您的 Web 应用程序了。

我是让用户使用他们喜欢的交流方式的坚定的拥护者 —— 发送电子邮件消息或者是通过即时消息客户机。本文所提供的仅仅是在 PHP 应用程序中放入另一种类型的接口的一个例子。我鼓励在带有 PHP 代码的标准的 Web 范围之外进行思考。

另外,我鼓励您将自己的模块提供给 PEAR。最好是提供干净压缩的代码,这将有益于大家。


参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • 访问 IRC.org 站点,查找有关 IRC 聊天系统的更多信息。

  • 还有 Bot-Depot,在这里您能够与其他编写 聊天机器人(bot)的程序员进行交谈。

  • 访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,以帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。

获得产品和技术

  • 查阅 Net_SmartIRC 模块,我使用该模块连接到 IRC 服务器。

  • 查阅 Services_Weather 模块,我使用该模块访问 Weather 服务。

  • 研究 mIRC IRC 客户机,我使用其连接到 IRC 服务器并与 PHP 聊天机器人(bot)进行交谈。

  • 尝试使用 beware IRC 服务器,它能够在 Windows 和 Linux 操作系统上运行。

  • 研究 PEAR 模块资料库,在那里能够找到很多有用的模块。

  • 使用 IBM 试用软件 改进您的下一个开放源码开发项目,可以通过下载或从 DVD 中获得这些软件。

讨论

关于作者

Jack D. Herrington 是一名高级软件工程师,具有 20 多年的从业经验。他是以下 3 本书的作者:Code Generation in ActionPodcasting Hacks 以及即将出版的 PHP Hacks。他还撰写了 30 余篇文章。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Web development
ArticleID=161766
ArticleTitle=如何使您的 PHP 应用程序变成聊天机器人(bot)
publish-date=03162006
author1-email=jack_d_herrington@codegeneration.net
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。