Localhost上的ChatScript Bot

时间:2018-03-01 05:41:41

标签: php html localhost chatbot chatscript

我使用chatscript创建了一个聊天机器人。当我执行chatscript.exe程序时,它在.cmd中完美运行。 现在我正在尝试使用xampp在浏览器中运行chatbot。 我已完成以下步骤:

  1. 我在C盘上安装了XAMPP。
  2. 在XAMPP中> HTDOCS文件夹我在其中添加了Chatscript文件夹。
  3. 我正在使用chatscript提供的更好的网络界面。
  4. 当我尝试运行index.php文件时,机器人不会回复。
  5. 请在网络界面中找到以下代码。 的index.php

    <!DOCTYPE HTML>
    <html>
      <head>
        <title> CHATSCRIPT SERVER
        </title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style type="text/css">
          #responseHolder {
            min-width: 600px;
            min-height: 300px;
            width: 80%;
            height: 300px;
            overflow: auto;
            margin: 10px auto;
            background-color: pink;
    
          }
          </style>
      </head>
      <body class="bgimg">
        <div id="responseHolder"></div>
        <form id="frmChat" action="#">
        <p>
          Enter your message below:
        </p>
        <table>
          <tr>
            <td>Name:</td>
            <td>
              <input type="text" id="txtUser" name="user" size="20" value="" />
              <input type="hidden" name="send" />
            </td>
          </tr>
          <tr>
            <td>Message:</td>
            <td><input type="text" name="message" id="txtMessage" size="70" /></td>
          </tr>
          <tr>
            <td colspan="2"><input type="submit" name="send" value="Send Value" /></td>
          </tr>
        </table>
        </form>
    
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script type="text/javascript">
    
    var botName = 'rose';       // change this to your bot name
    
    // declare timer variables
    var alarm = null;
    var callback = null;
    var loopback = null;
    
    $(function(){
        $('#frmChat').submit(function(e){
        // this function overrides the form's submit() method, allowing us to use AJAX calls to communicate with the ChatScript server
        e.preventDefault();  // Prevent the default submit() method
        var name = $('#txtUser').val();
        if (name == '') {
            alert('Please provide your name.');
            document.getElementById('txtUser').focus();
        }
        var chatLog = $('#responseHolder').html();
        var youSaid = '<strong>' + name + ':</strong> ' + $('#txtMessage').val() + "<br>\n";
        update(youSaid);
        var data = $(this).serialize();
        sendMessage(data);
        $('#txtMessage').val('').focus();
        });
    
        // any user typing cancels loopback or callback for this round 
        $('#txtMessage').keypress(function(){
              window.clearInterval(loopback);
              window.clearTimeout(callback);
            });
    });
    
    function sendMessage(data){ //Sends inputs to the ChatScript server, and returns the response-  data - a JSON string of input information
    $.ajax({
        url: 'ui.php',
        dataType: 'text',
        data: data,
        type: 'post',
        success: function(response){
            processResponse(parseCommands(response));
        },
        error: function(xhr, status, error){
            alert('oops? Status = ' + status + ', error message = ' + error + "\nResponse = " + xhr.responseText);
        }
      });
    }
    
    function parseCommands(response){ // Response is data from CS server. This processes OOB commands sent from the CS server returning the remaining response w/o oob commands
    
        var len  = response.length;
        var i = -1;
        while (++i < len )
        {
            if (response.charAt(i) == ' ' || response.charAt(i) == '\t') continue; // starting whitespace
            if (response.charAt(i) == '[') break;   // we have an oob starter
            return response;                        // there is no oob data 
        }
        if ( i == len) return response; // no starter found
        var user = $('#txtUser').val();
    
        // walk string to find oob data and when ended return rest of string
        var start = 0;
        while (++i < len )
        {
            if (response.charAt(i) == ' ' || response.charAt(i) == ']') // separation
            {
                if (start != 0) // new oob chunk
                {
                    var blob = response.slice(start,i);
                    start = 0;
    
                    var commandArr = blob.split('=');
                    if (commandArr.length == 1) continue;   // failed to split left=right
    
                    var command = commandArr[0]; // left side is command 
                    var interval = (commandArr.length > 1) ? commandArr[1].trim() : -1; // right side is millisecond count
                    if (interval == 0)  /* abort timeout item */
                    {
                        switch (command){
                            case 'alarm':
                                window.clearTimeout(alarm);
                                alarm = null;
                                break;
                            case 'callback':
                                window.clearTimeout(callback);
                                callback = null;
                                break;
                            case 'loopback':
                                window.clearInterval(loopback);
                                loopback = null;
                                break;
                        }
                    }
                    else if (interval == -1) interval = -1; // do nothing
                    else
                    {
                        var timeoutmsg = {user: user, send: true, message: '[' + command + ' ]'}; // send naked command if timer goes off 
                        switch (command) {
                            case 'alarm':
                                alarm = setTimeout(function(){sendMessage(timeoutmsg );}, interval);
                                break;
                            case 'callback':
                                callback = setTimeout(function(){sendMessage(timeoutmsg );}, interval);
                                break;
                            case 'loopback':
                                loopback = setInterval(function(){sendMessage(timeoutmsg );}, interval);
                                break;
                        }
                    }
                } // end new oob chunk
                if (response.charAt(i) == ']') return response.slice(i + 2); // return rest of string, skipping over space after ] 
            } // end if
            else if (start == 0) start = i; // begin new text blob
        } // end while
        return response;    // should never get here
     }
    
    function update(text){ // text is  HTML code to append to the 'chat log' div. This appends the input text to the response div
        var chatLog = $('#responseHolder').html();
        $('#responseHolder').html(chatLog + text);
        var rhd = $('#responseHolder');
        var h = rhd.get(0).scrollHeight;
        rhd.scrollTop(h);
    }
    
    function processResponse(response) { // given the final CS text, converts the parsed response from the CS server into HTML code for adding to the response holder div
        var botSaid = '<strong>' + botName + ':</strong> ' + response + "<br>\n";
        update(botSaid);
    }
    
    </script>
    </body>
    </html>
    

    ui.php

    <?php
    
    //  =============  user values ====
    $host = "localhost";  //  <<<<<<<<<<<<<<<<< YOUR CHATSCRIPT SERVER IP ADDRESS OR HOST-NAME GOES HERE
    $port = 8080;          // <<<<<<< your port number if different from 1024
    $bot  = "rose";    
    // <<<<<<< desired botname, or "" for default bot
    //=========================
    
    // Please do not change anything below this line.
    $null = "\x00";
    $postVars = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
    extract($postVars);
    
    if (isset($send))
    {
         if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
           $userip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }else{
            $userip = $_SERVER['REMOTE_ADDR'];
        }   
        $msg = $userip.$null.$bot.$null.$message.$null;
    
        if(!$fp=fsockopen($host,$port,$errstr,$errno,300))
        {
            trigger_error('Error opening socket',E_USER_ERROR);
        }    
        // write message to socket server
        fputs($fp,$msg);
        while (!feof($fp))
        {
            $ret .= fgets($fp, 512);
        }
    
        fclose($fp);
        exit($ret);
    }
    

    请在下面找到问题的截图: Issue while accessing chatbot on localhost:8080

    我很难连接我的chatscript服务器和localhost。请让我知道我应该在UI.php中更改什么,以便机器人发送回复。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

UI.php文件中有一个错误。 $ret变量由于未声明而中断。如果您在$ret = '';上方添加fputs,则代码应该可以正常工作:

 // write message to socket server
    $ret = '';
    fputs($fp,$msg);
    while (!feof($fp))
    {
        $ret .= fgets($fp, 512);
    }

    fclose($fp);
    exit($ret);
}

答案 1 :(得分:0)

除了$ ret更正之外,在XAMPP中运行时,因为Web主机是Apache,所以客户端在使用CS over Web时将使用端口8080或8088。 将ChatScript作为服务器,需要使用端口1024(或用户定义的)启动ChatScript系统。 此外,Harry Bot在index.php文件中也被称为,如ui.php文件中一样更改为Rose。 完成这些操作后,我得到了CS响应。