这篇文章是我学习了三篇英文的文章之后总结出来的,算是翻译,也算是把自己的一点点困惑和理解的地方写出来,文章结尾我会发出这三篇文章的链接。


开始:首先,我们要知道的是bot framework是微软打造的一个用来制作自己的聊天机器人的框架,我们可以把开发出来的聊天机器人与一些网络平台所融合,比如微信什么的。在本文我们使用它所提供的nodejs的sdk来进行开发,既然用到了nodejs,那你的机器上肯定要有nodejs才行,不细说怎么安装,直接开始具体怎么实现我们自己的聊天机器人。

我们先做一个很简单的,仅仅能和我们进行一句问候,首先,我们需要在nodejs里安***ot builder这个sdk,我们怎么安装呢?打开nodejs的命令行,就是如下所示的东西。

打开之后,我们输入如下图所示命令来安***ot Builder


当安装成功,我们会看到如下图所示:


好了,现在我们可以愉快的开始我们打造聊天机器人之旅了。现在我们新建一个文件夹,名叫Bots(实际上叫什么都无所谓,原文里叫这个我就不改了),然后在这个文件夹瞎新建一个js文件叫做botserver.js。编写如下代码:

var builder=require('botbuilder');
var connector=newbuilder.ConsoleConnector().listen(); 
var bot=newbuilder.UniversalBot(connector); 
bot.dialog('/',function(session) { 
 session.send("Hithere,HowcanIhelpyou?"); 
});
简单解释一下上面的代码,首先使用require把botbuilder模块引入,因为我们使用命令行与bot聊天,所以我们在这里使用ConsoleConnector(这里要说一下,因为我们的机器人框架可以看作一种应用程序,但它要依托一个平台,就要创建一个连接器对象。在这里我们使用命令行连接器,因为我们使用的是命令行与机器人交互)。UniversalBot(通用机器人)这个类实现了管理bot和我们命令行对话的所有逻辑,最后调用它的dialog方法就可以实现对话了。接下来让我们来运行一下这段代码。依旧是打开nodejs的命令行,先把路径放在我们之前的Bots这个文件夹下,然后使用命令:

node botserver.js

就可以让我们的聊天机器人工作起来了。

自己玩玩吧,到这一步我们就实现了一个最简单的聊天机器人,虽然它永远只会说一句话。。。


接下来,我们要让我们的机器人能与我们进行互动:

我们来进行一个最简单的互动,人与人之间初次相逢,总会问对方的姓名,现在我们的聊天机器人也要来询问你的名字。下面是实现过程:

在新建一个js文件,名字随意,下面贴上实现的代码

var builder = require('botbuilder');
var connector = new builder.ConsoleConnector().listen();
var bot = new builder.UniversalBot(connector);
var intents = new builder.IntentDialog();
bot.dialog('/',intents);
intents.matches(/^Hi/i,[
	function(session){
		builder.Prompts.text(session,"Hi there! What's your name");
	},
	function(session,results){
		session.send('%s!How can I help you?',results.response);
	}
]);
intents.matches(/^need version/i,builder.DialogAction.send('The Lastest Bot version is 1.1'));
intents.onDefault(builder.DialogAction.send('Hi there! How can I help you today?'));

重复的地方就不说了,我们观察和上面第一个机器人有什么不同?我们观察之后发现,这次的dialog方法里参数变成了一个intents对象,而这个对象又包含了一个方法的数组,这里我来简单解释一下,如果你有点js基础应该可以看懂,这里先是用了一个正则来匹配/^Hi/i,如果匹配上了,就执行后面的回调方法,就是这个方法数组了,所以我们最关心的还是这个方法数组,我们来看一看它。这里的两个函数的关系是,上面的函数的响应可以传递到下面那个函数里去,在这里就是用户的输入了(调用了
builder.Prompts.text()
这个方法,当你输入了自己的名字,你的名字就是下个方法的results,所以我们在第二个方法里就可以打印出来我们输入的名字了。

下面的两个意图一个匹配的是请求版本号,另一个就是其他的所有情况,在这里就不细说了,现在,我们快点让我们的机器人运行起来,和它进行愉快的交流吧。


接下来,就是这篇文章真正的重头戏了,就是实现一个可以依靠用户输入的关键字实现查询含有关键字的五本图书的查询机器人,这里我们使用谷歌的图书查询API来完成。先把代码贴上来,如下:

var builder = require('botbuilder');
var https = require('https');
var connector = new builder.ConsoleConnector().listen();
var bot = new builder.UniversalBot(connector);
function getBooksData(key){
    https.get("https://www.googleapis.com/books/v1/volumes?q="+key+"&maxResults=5",function(res){
        var d = '';
        var i;
        res.on('data',function(chunk) {
            d += chunk;
        });
        res.on('end',function() {
            var e = JSON.parse(d);
            for (i = 0;i < e.items.length;i++) {
                console.log(i + 1 + ":" + e.items[i].volumeInfo.title);
            }
        });
    });
}

var intents = new builder.IntentDialog();
bot.dialog('/', intents);
intents.matches(/^Hi/i, [
    function(session){
        builder.Prompts.text(session, 'Hey, I am a BookBot. Welcome to Book Searching through Chat!.To start, which books you would like to search?');
    },  
    function(session,results){
        session.send('Here are books for topic - %s.', results.response);
        getBooksData(results.response);
    }
]);
intents.onDefault(builder.DialogAction.send('Hi there! How can I help you today?'));

这段代码虽然有点长,但是不难理解,它的核心部分依然是想我们实现的第二个对话机器人那样,就是加了一句
 getBooksData(results.response);
这段代码就是我们实现的图书查询的方法,它的具体实现在上面
function getBooksData(key){
    https.get("https://www.googleapis.com/books/v1/volumes?q="+key+"&maxResults=5",function(res){
        var d = '';
        var i;
        res.on('data',function(chunk) {
            d += chunk;
        });
        res.on('end',function() {
            var e = JSON.parse(d);
            for (i = 0;i < e.items.length;i++) {
                console.log(i + 1 + ":" + e.items[i].volumeInfo.title);
            }
        });
    });
}
这里还是调用https的get方法来请求图书信息,然后使用回调方法来处理请求到的json数据,这里就不细说了(因为我在这里也遇到了问题。。)

下面我把我遇到的问题贴出来


我也不知道是什么原因,希望有更熟悉nodejs的人给我指出,谢谢。


在这里,本人亲自做一个小结,创建一个聊天机器人的步骤如下:
1:引入模块
2:创建连接器
3:创建bot对象
4:调用对话框方法(可以是一组方法,参数为对话对象session)
然后在对话中实现我们具体的业务逻辑即可

最后,附上三篇原文:
http://www.c-sharpcorner.com/article/microsoft-bot-framework-and-node-js-part-one/
http://www.c-sharpcorner.com/article/microsoft-bot-framework-and-node-js-part-two/
http://www.c-sharpcorner.com/article/microsoft-bot-framework-and-node-js-part-three/