Board logo

标题: 如何使您的 PHP 应用程序变成聊天机器人(bot)-2 [打印本页]

作者: look_w    时间: 2018-7-16 12:24     标题: 如何使您的 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. 带有硬编码邮政编码的天气响应但是我想您并不想要得到 所在地区的天气信息。那么,如何得到您所在城市的天气信息呢?




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0