php机器人程序
是否曾经想过与您的一个PHP应用程序聊天? 您沉迷于即时消息吗? 如果是这样,我有适合您的模块吗? 该模块位于PHP应用程序和扩展存储库(PEAR)中,可让您PHP应用程序附加到Internet中继聊天(IRC)服务器并响应其消息。 本质上,PEAR模块将您PHP应用程序变成bot 。
机器人的价值在于您可以通过经常使用的机制与它进行通信:即时消息传递。 如果您一直在聊天室中,那么您现在不必离开他们来查找当地的天气情况。 本文向您展示了如何在PHP中创建一个IRC机器人,该机器人可以告诉您邮政编码的实时天气。
IRC基础
如果您不熟悉IRC系统,请阅读以下内容。 IRC系统具有两个组件:服务器和客户端。 服务器创建了几个虚拟通道,人们可以登录以彼此通信。 给频道提供熟悉的名称,这些名称应该映射到对话的主题或主题。
然后,IRC客户端软件通过指定主机名,端口号和请求的昵称将其连接到服务器。 客户端成功连接到服务器后,它可以加入任意数量的通道并开始发送和接收消息。 要发送消息,只需像在其他即时消息客户端中一样,在文本框中键入消息并按Enter键即可。 然后,客户端将该消息发送到服务器,服务器再将该消息广播到已加入该频道的所有其他客户端。 IRC客户端软件可用于每个操作系统以及便携式设备。
机器人的行为就像其他客户一样。 它们连接到服务器,然后加入一个或多个渠道。 一般来说,漫游器不会独立发送消息。 而是,他们在适合特定格式的频道中侦听来自用户的消息。 僵尸程序会发出响应这些特殊格式请求的消息。
本文中的漫游器会寻找以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僵尸程序的下一步是设置该僵尸程序可以登录的服务器。 您可以让漫游器登录到公共服务器,但是我建议您首先在本地安装服务器以进行测试。
我选择为Windows运行“小心ircd”服务器。 (也可以在Linux上使用beware ircd服务器的版本。)我查看了一些服务器,这是最容易使用的服务器。 安装当心ircd服务器很容易,我将其放在C:\ ircd中。 在该目录中,我通过打开命令提示符并键入以下命令来运行服务器:
C:\ircd> bircd
注意:无需更改配置。
但是,您如何知道服务器正在运行? 要验证这一点,您需要安装IRC客户端。
安装IRC客户端
要测试本地服务器以及与机器人通信,您需要安装IRC客户端。 我选择为Windows安装流行的mIRC客户端。 (在撰写本文时,V6.16是最新版本。)您可以选择适合您的平台的客户端。
安装了mIRC客户端后,我从“ 开始”菜单中启动了mIRC应用程序。 然后,我使用Connect
命令连接到localhost 。 我使用菜单中的join
命令将其附加到#weather频道,如图1所示。
图1.从IRC客户端加入#weather频道
加入频道后,将出现图2所示的窗口。 从这里,我可以与其他人或机器人聊天。
图2. #weather频道的聊天界面
现在,在本地运行服务器,启动IRC客户端并运行并且安装了PEAR模块的情况下,我可以编写PHP机器人来检索家乡的天气情况。
从连接开始
我将创建脚本的多个版本。 每个版本将添加更多功能。 清单2显示了PHP bot脚本的第一个版本。在此脚本中,我登录到IRC服务器并创建一个将响应特定类型消息的类。 该模块专门用于为IRC创建机器人。
清单2.该机器人的第一个简单版本
<?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
方法。 此方法响应天气请求,并发送回(此时)“是的,天气”。 (到本文结尾,它将告诉您天气情况。)
要启动脚本,我使用以下命令从命令提示符运行它:
C:\ircd> php ircbot.php
该脚本登录到本地IRC服务器,然后经历无限循环。
图3显示了天气bot登录到服务器。 它还显示了我在文本窗口中输入weather并按Enter 。
图3.与天气机器人对话
然后,天气机器人以固定的字符串“ Yeah, weather
作出响应。
这是一个好的开始。 现在,你如何得到天气?
得到天气
要获取天气,请使用Weather Web服务PEAR模块。 清单3显示了该模块,我对其进行了修改,以提供家乡的天气情况。
清单3.报告天气的天气机器人
<?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。
从那里,我获得了第一天的天气信息,并通过IRC频道将天气结果作为消息发送出去。 图4显示了结果文本窗口。
图4.带有硬编码邮政编码的天气响应
但是我确定你不想要我家乡的天气情况。 那么,您如何获得所在城市的天气?
获取所需的天气信息
获取与您相关的天气信息需要解析请求文本。 这意味着对天气方法进行微小的更改,如清单4所示。
清单4.新的天气方法
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
数组中作为数组引用的messageex
。 在这种情况下,第一项将是邮政编码。
图5显示了如何使用带有邮政编码的天气请求。 如您所见,我输入了19081 ,这是Swarthmore College的所在地宾夕法尼亚州Swarthmore的邮政编码。
图5.宾夕法尼亚州斯沃斯莫尔的天气
当然,我应该包括更多的错误检查,以确保邮政编码有效。 但我会留给你。
外箱思考
本文介绍了将PHP应用程序连接到IRC的基础知识。 您可以将此应用程序作为起点,并将自己PHP类连接到代码。 然后,您可以将Web应用程序与浏览器一起使用,并通过IRC使用。
我坚决主张以用户喜欢的交流方式来吸引用户-发送电子邮件或通过即时消息客户端。 本文仅提供在PHP应用程序中放置另一种类型的接口的一个示例。 我鼓励您在标准Web框之外考虑PHP代码。
与此相关的是,我鼓励您为PEAR贡献自己的模块。 这是对干净封装的代码的很好的介绍,并且对社区有所帮助。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-phpbot/index.html
php机器人程序