65.9K
CodeProject 正在变化。 阅读更多。
Home

快速轻松地将您的Slack应用程序与IBM Watson/Bluemix Assistant服务集成

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2019 年 2 月 25 日

CPOL

7分钟阅读

viewsIcon

8773

downloadIcon

77

如何快速轻松地创建自动聊天机器人或即时通讯 (IM) 应用程序

背景

IBM Watson/Bluemix Assistant服务

我们主要从创建Slack账户和设置特定的聊天机器人应用程序开始整个Slack集成过程。有大量的文档和指南描述了创建Slack账户和部署各种Slack应用程序的过程,例如

在本节中,我们还将讨论注册IBM Cloud和创建Watson/Bluemix Assistant服务,以及根据我们的需求进行配置。

创建IBM Cloud账户

要创建IBM Cloud账户,我们必须通过访问https://cloud.ibm.com/registration并输入我们的凭证完成注册。

完成注册后,请转到您的IBM Cloud仪表板,然后点击创建资源按钮。在资源窗格中,选择AI/Watson Assistant,如下图所示。

之后,选择正确的服务名称、位置、资源组和计划,然后点击页面右下角的创建按钮以部署资源。

之后,您将被重定向到新创建的服务页面。

启动IBM/Bluemix Assistant服务

要继续部署,请点击助理服务页面上的启动工具按钮。别忘了下载ibm-credentials.env文件并将其复制到项目的目录中。

之后,您将被重定向到另一个页面,在该页面中,您必须点击页面底部的创建技能按钮。

创建对话技能

要创建特定的技能,请确保您在以下页面中输入技能名称和描述。

点击创建按钮后,您将被重定向到网页,您可以在其中为正在部署的技能创建特定的意图。

添加意图

要创建特定的意图,您必须遵循以下网页中的意图添加过程。

构建对话

最后,在创建特定的助理服务之前,我们必须创建一个对话并将意图添加到对话的节点中,如下所示。

创建特定对话后,现在让我们添加一个新节点并将其与先前创建的意图关联起来。

创建助理服务

最后,我们必须按照以下过程创建特定的助理服务。

Using the Code

在本节中,我们将演示如何创建一个Slack API Web应用程序服务器,该服务器将消息路由到前面讨论的IBM Watson/Bluemix助理服务。

初始化Slack和IBM Watson Assistant API

要实现特定的自定义Web应用程序服务器,我们首先要安装和初始化Slack和IBM Watson Assistant API。以下是以下Web应用程序服务使用的API和Node.js模块列表:

  • 'bootkit' - 提供基本Slack API功能的Node.js模块。
  • 'watson-developer-cloud' - 提供与IBM Watson Cloud连接的Node.js模块。
  • 'express''request' - 用于部署Express 4应用程序Web服务的Node.js模块。

以下代码说明了如何安装和使用这些Node.js模块。

npm install express request --save
npm install botkit watson-developer-cloud --save

安装完这些模块后,我们必须将以下代码添加到Web应用程序的主脚本文件chatbot.js中。

const Botkit = require('botkit');
const express = require('express');
const request = require('request');

const AssistantV1 = require('watson-developer-cloud/assistant/v1');

'express''request'模块实际上是用于支持Slack API和特定聊天机器人引擎脚本的Express 4 Web服务器功能的。

加载Slack和IBM Cloud配置

为了提供Slack和IBM Watson/Bluemix Assistant客户端连接,我们必须指定一些参数,这些参数是连接我们的聊天机器人引擎服务与Slack和IBM Cloud所必需的。本文介绍的项目包含三个主要的配置文件来支持此连接。

ibm-credentials.env

ASSISTANT_APIKEY=<YOUR_API_KEY>
ASSISTANT_URL=<SERVER URL>

该文件包含两个变量:ASSISTANT_APIKEYASSISTANT_URL。这两个变量的值用于指定先前创建的Watson Assistant服务API密钥标识符,以及我们的应用程序服务器将与之通信的特定服务器实例的URL。API_KEYURL的值在Watson Assistant服务器创建期间生成。

conversation.json

另一个文件conversation.json用于存储Watson Assistant工作空间连接参数的数量,包括数据。工作空间ID是我们实际需要从该文件中检索的唯一参数值。整个文件内容如下所示。

{

   ...

  "workspace_id": "YOUR_WORKSPACE_GUID",
  "counterexamples": [],
  "system_settings": {
    "tooling": {
      "store_generic_responses": true
    }
  },
  "learning_opt_out": false,
  "status": "Available"
}

conversation.json文件是一个string JSON格式的文件,可以从Watson Assistant仪表板下载,其中包含workspace-id所需的正确GUID值。

slack.json

slack.json - 我们要讨论的最后一个重要配置文件。该文件包含字符串JSON格式的数据,用于建立与Slack API服务的连接的主要凭证。

{
  "clientId": "YOUR_APP'S_CLIENT_ID",
  "clientSecret": "CLIENT_SECRET",
  "redirectUri": "YOUR_NGROK_SERVER_URL",
  "clientSigningSecret": "SIGNED_SECRET",
  "token": "SLACK_APP'S_AUTH_TOKEN"
}

要运行聊天机器人Web应用程序,我们必须通过编辑这些配置文件来提供正确的凭证。

聊天机器人Web应用程序服务器在其执行开始时使用以下代码加载这些文件。

require('dotenv').config({ path: './ibm-credentials.env' });

const slack_config = JSON.parse(
    require('fs').readFileSync('slack.json').toString());

var ib_config = JSON.parse(require('fs').
    readFileSync("./conversation.json"));

创建Slack聊天机器人实例

创建Slack聊天机器人实例是完成实际消息处理任务之前必须执行的下一个初始化阶段。要创建Slack聊天机器人实例和特定控制器,我们必须实现下面列出的代码。

const slackController = Botkit.slackbot(slack_config);
const slackBot = slackController.spawn(slack_config);

此代码的第一行使用Botkit对象和从特定配置文件加载的参数来实现Slack聊天机器人控制器实例化,这些参数作为slackbot(slack_config)方法的参数传递。在第二行执行期间,通过调用所创建控制器(的spawn(slack_config)方法来创建特定的slackBot对象。

实例化IBM Watson/Bluemix Assistant

在初始化阶段,我们必须完成的另一项任务是实例化Watson Assistant对象,如下所示。

const assistant = new AssistantV1({
    version: '2019-02-25',
    iam_apikey: process.env.ASSISTANT_APIKEY,
    url: process.env.ASSISTANT_URL
});

在这种情况下,我们使用从特定配置文件ibm_credentials.env加载的参数列表(例如,凭证和版本)来创建一个助理对象。

启动已创建的Slackbot

要启动我们在初始化阶段已经实例化的Slackbot,我们必须执行下面列出的代码。

slackBot.startRTM((err, bot, payload) => {
    if (err) {
        throw new Error('Could not connect to Slack');
    }
    slackController.log('Slack connection established.');
});

在这种情况下,我们使用slackBot对象并调用startRTM(...)方法来启动我们的Slackbot,提供与Slack Hub的连接。此方法接受回调或lambda函数作为单个参数。在此回调函数中,我们执行基本的异常处理和连接状态任务。

创建监听器以处理传入消息

最后,我们要做的就是实现消息处理程序并将其分配给先前创建的控制器。为此,我们必须使用slackController对象并调用特定的slackController.hears(...)消息来处理传入的消息。回调或lambda函数是此方法的实际参数之一。每当新消息通过Ngrok本地连接从Slack Hub到达控制器时,就会调用此回调函数。

slackController.hears(['.*'], ['direct_message', 'direct_mention'], (bot, message) => {
    bot.startConversation(message, (err, convo) => {
        console.log("question: " + message["text"]);
        assistant.message({
            workspace_id: ib_config.workspace_id,
            input: { 'text': message["text"] }
        }, function (err, response) {
            if (err)
                console.log('error:', err);
            else
                response["output"]["text"].forEach(
                    function (resp) {
                        console.log("response: " + resp);
                        convo.say(resp); });
        });
    });
});

以下回调函数在其参数中接收两个参数。第一个参数(即“bot”)是Slackbot对象的实例。第二个参数是从Slack收到的消息。通过使用bot对象,我们调用startConversation(...)方法,并将message参数值作为第一个参数传递。此外,我们定义另一个回调或lambda函数,在收到新消息时触发。此另一个回调有两个参数,如err变量或convo对象,用于提供聊天功能。在此回调中,我们正在实现一段代码,该代码使用先前创建的助理对象将传入消息路由到IBM Watson Assistant服务。具体来说,我们调用message(...)方法,该方法接受多个参数,例如workspace-idinput消息,以及一个回调或lambda函数来处理来自助理服务的响应。message(...)方法将传入消息分派到助理服务,并通过调用特定的回调方法来处理响应。在消息由助理处理后,我们将响应作为存储在response["output"]["text"]变量中的数组接收。之后,我们执行一个简单的for-each循环,通过调用convo.say(resp)方法将每个响应消息发送回Slackbot。

总的来说,以下代码只执行从Slack聊天机器人应用程序控制台到特定助理服务的传入消息的路由,处理响应并将响应消息发送回Slack聊天机器人应用程序。

历史

  • 2019年2月25日 - 文章最终版本已发布
© . All rights reserved.