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

使用 Microsoft Bot Framework 的基于位置的 FB Messenger 机器人

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.15/5 (4投票s)

2017年4月13日

CPOL

4分钟阅读

viewsIcon

12131

聊天机器人应用程序,用于从 Facebook Messenger 获取用户当前位置,使用 Microsoft Bot Framework。

引言

有许多方法可以为 Facebook Messenger 创建聊天机器人应用程序。我们将研究使用 Microsoft Bot Framework 为 Facebook 创建聊天机器人应用程序。我们在这里创建的机器人将能够获取 Facebook Messenger 设备上的当前位置。我想提供这个聊天机器人应用程序作为一个可工作的示例并附带解释。这将有助于有类似需求的人。

背景

此示例在 Node JS 中开发。它将通过要求用户从 Facebook Messenger Bot 共享其位置来获取用户的位置。作为先决条件,在开发 Bot 之前需要完成以下步骤。

  • Microsoft Bot Framework 门户 中注册一个机器人。记下注册机器人时生成的 Microsoft App ID 和密码。密码在机器人注册期间仅显示一次。稍后将在 Node JS 位置机器人示例中使用 App ID 和密码。
  • 在机器人注册期间,需要给出机器人示例部署到的消息终结点服务器 URL。机器人可以部署到任何云服务器或企业服务器。
  • 使用新创建的机器人中的“添加频道”选项添加 Facebook 频道,并按照 Microsoft 提供的步骤进行 Facebook 集成。您可以在链接中查看 Fb 频道注册的分步说明。请查看 Facebook 开发者链接,了解如何将 Facebook Messenger 频道与使用 Microsoft 创建的 Bot 集成。

Using the Code

现在您已经在 Microsoft Bot 门户中注册了机器人。让我们来看一下 Node JS 示例代码,以获取设备的当前位置。LocationBot Node JS 代码的根目录包含一个 package.jsonserver.jscore 目录。

Core Directory 是 Microsoft 用于构建聊天机器人应用程序的 Bot Builder SDK。可以从 Microsoft GitHub 存储库 的以下链接下载适用于 Node.js 的 Bot Builder SDK。下载的 Node 的核心目录必须放置在 LocationBot 示例根文件夹内。

Package.json 文件包含所需支持库的列表。通过在 LocationBot目录中执行命令“npm install”,可以下载上述引用的库。

{
  "name": "Location Bot",
  "version": "1.0.0",
  "description": "Example to find out current location",
  "dependencies": {
    "async": "^1.5.2",
    "base64url": "^1.0.6",
    "chrono-node": "^1.2.5",
    "jsonwebtoken": "^7.1.9",
    "node-uuid": "^1.4.7",
    "request": "^2.78.0",
    "restify": "^4.2.0",
    "rsa-pem-from-mod-exp": "^0.8.4",
    "sprintf-js": "^1.0.3"
  },
  "devDependencies": {
    "mocha": "^2.4.5"
  }
}

Server.js 是主要的 JS 代码,其中包含机器人背后的逻辑。在我们的示例中,机器人将在 Facebook Messenger 上从用户获取当前位置。

server.js 的以下代码定义了所需的库实例,并创建了一个在 Env 文件中定义或端口 3978 上运行的服务器。

var builder = require('./core/');
var restify = require('restify');

var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

创建 ChatConnector 实例,该实例接受 Microsoft App ID 和密码作为环境变量。开发人员需要在下面的 ChatConnector 实例中为在 Microsoft 门户中注册机器人时创建的值分配 App ID 和密码。

Server Instance 在 post 方法中公开终结点 URL。终结点 URL 将是机器人部署到的服务器,并附加了 post 方法中提到的 string/api/messages”。此终结点 URL 应在 Microsoft 门户中注册的机器人中更新。它实际上将聊天机器人应用程序与 Bot Connector 连接起来。Bot Connector 又将 Bot 与 Facebook、Skype 等不同频道连接起来。Microsoft Bot 支持的频道列表可在 Bot 门户中找到。

// Create chat bot
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});

var bot = new builder.UniversalBot(connector);

server.post('/api/messages', connector.listen());

获取纬度和经度值的实际调用编码在 bot 实例的 dialog 方法中。在我们的示例中,我们创建了一个路径为“/fbmessenger_getlocation”的 dialog。此 dialogcontent_type 设置为 location,并将其传递给 Facebook 对象。这会在 Messenger 中显示一个按钮,用于从用户那里获取位置详细信息。点击按钮后,用户将导航到一个屏幕,该屏幕根据位置提供商显示地图和当前位置详细信息。Messenger 会从屏幕上的 session 对象中的 entities 数组中获取位置详细信息。获取纬度和经度的完整 dialog 方法如下所示

bot.dialog('/', [
    function (session) {
        session.send("Hi. I can show you how to 
        fetch user's location on Facebook Messenger.");
        session.beginDialog('/fbmessenger_getlocation');
    }
]);

bot.dialog('/fbmessenger_getlocation', new builder.SimpleDialog((session, args) => {
    
    var initialRetryFlag = 3;
    var retryFlag = session.dialogData.hasOwnProperty('maxRetryFlag') 
    ? session.dialogData.maxRetryFlag : initialRetryFlag;
    var entityList = session.message.entities;

    if (session.dialogData.hasOwnProperty('maxRetryFlag') 
    && Array.isArray(entityList) && entityList.length 
    && entityList[0].geo) {

        var latit = roundNumber(entityList[0].geo.latitude, 3);
        var longit = roundNumber(entityList[0].geo.longitude, 3);

        // you got the latitude and longitude values. 
        // You can do the processing as per your requirement
        session.send("Latitude : "+latit);
        session.endDialog("Longitude : "+longit);
    }
    else if (retryFlag == 0) {
        // max retryFlag, quit
        session.endDialogWithResult({});
    }
    else {

        var replyMsg = new builder.Message(session).text
        ("Please share your location.");
        replyMsg.sourceEvent({
            facebook: {
                quick_replies:
                [{
                    content_type: "location"
                }]
            }
        });
        session.send(replyMsg);

        retryFlag -= 1;
        session.dialogData.maxRetryFlag = retryFlag;
    }
}));

当我们执行命令“node server”时,bot 将在端口号 3978 上开始运行。我们可以使用 Ngrok 在本地测试 botNgrok 会公开本地服务器端口,并提供一个公共网络可用的 URL。

用户可以通过创建用于访问机器人的 Facebook 页面在 Facebook Messenger 中搜索机器人。用户可以向 Messenger 中搜索的机器人发送“Hi”或“Hello”等消息,机器人会回复并进一步交互以获取位置详细信息。在提交给 Facebook 批准之前,机器人将可供在 Facebook 应用程序的角色部分中添加为测试人员的 Facebook 用户名使用。一旦提交并获得 Facebook 的批准,机器人将向公众开放搜索。

© . All rights reserved.