编程实现PHP应用程序变成聊天机器人(bot)

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


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


图 2. #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)接着能够以固定的字符串 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. 的天气情况


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







结束语

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

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

另外,我鼓励您将自己的模块提供给 PEAR。最好是提供干净压缩的代码,这将有益于大家。
<?php namespace BotMan\BotMan; use React\Socket\Server; use BotMan\BotMan\Http\Curl; use React\EventLoop\LoopInterface; use BotMan\BotMan\Cache\ArrayCache; use BotMan\BotMan\Drivers\DriverManager; use BotMan\BotMan\Interfaces\CacheInterface; use Symfony\Component\HttpFoundation\Request; use BotMan\BotMan\Interfaces\StorageInterface; use BotMan\BotMan\Storages\Drivers\FileStorage; class BotManFactory {     private static $extensions = [];     /**      * @param $methodName      * @param $callable      */     public static function extend($methodName, $callable)     {         self::$extensions[$methodName] = $callable;     }聊天机器人(chatterbot)是一个用来模拟人类对话或聊天的程序。“Eliza”和 “Parry”是早期非常著名的聊天机器人。它试图建立这样的程序:至少暂时性地让一个真正的人类认为他们正在和另一个人聊天。Chatterbots已应用于在线互动游戏Tinymuds。一个单独的玩家可以在等待其他“真实”的玩家时与一个chatterbot进行互动。目前至少有一个公司正在制造一种产品,这种产品让你建立一个chatterbot以便用来掌握相关市场或关于你网站的其它问题。不难想象两个chatterbots互相交谈甚至互相交换关于自身的信息,如此一来,他们的对话将会变得更为复杂。(看看人工智能就会知道这个想法如果实现了会引起怎样的惊慌)。当然,他们可以使用更多普通的聊天缩略词
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值