如何使您的 PHP 应用程序变成聊天机器人(bot)-2
- UID
- 1066743
|
如何使您的 PHP 应用程序变成聊天机器人(bot)-2
从连接开始我将创建脚本的几个版本。每一个版本都会添加更多的函数。PHP 聊天机器人(bot)脚本的第一个版本如清单 2 所示。在该脚本中,我登录到 IRC 服务器并创建了一个对特殊类型的消息作出响应的类。该模块专门用于为 IRC 创建 聊天机器人(bot)。
清单 2. 聊天机器人(bot)第一个简单的版本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <?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”。(在本文的结尾部分,它将告诉您天气状况。)
要启动脚本,我使用下列命令在命令提示符下运行它:
1
| 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)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| <?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. 带有硬编码邮政编码的天气响应但是我想您并不想要得到我 所在地区的天气信息。那么,如何得到您所在城市的天气信息呢? |
|
|
|
|
|