内容


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

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

Comments

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

聊天机器人(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 服务器

创建 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 信道
从 IRC 客户机加入 #weather 信道

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

图 2. #weather 信道的聊天界面
 #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)进行交谈

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. 的天气情况
图 5. Swarthmore, Pa. 的天气情况

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

结束语

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

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

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


相关主题

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
  • 查阅 Net_SmartIRC 模块,我使用该模块连接到 IRC 服务器。
  • 查阅 Services_Weather 模块,我使用该模块访问 Weather 服务。
  • 访问 IRC.org 站点,查找有关 IRC 聊天系统的更多信息。
  • 研究 mIRC IRC 客户机,我使用其连接到 IRC 服务器并与 PHP 聊天机器人(bot)进行交谈。
  • 尝试使用 beware IRC 服务器,它能够在 Windows 和 Linux 操作系统上运行。
  • 研究 PEAR 模块资料库,在那里能够找到很多有用的模块。
  • 还有 Bot-Depot,在这里您能够与其他编写 聊天机器人(bot)的程序员进行交谈。
  • 访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,以帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
  • 使用 IBM 试用软件 改进您的下一个开放源码开发项目,可以通过下载或从 DVD 中获得这些软件。

评论

添加或订阅评论,请先登录注册

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