Tạo Skype Bot với Microsoft Bot Framework

Bài viết này sẽ gồm có những mục sau:

Microsoft bot framework: giới thiệu Microsoft bot framework cùng các công cụ đi kèm
Bot Builder SDK: giới thiệu bộ SDK dùng để phát triển bot web service

  • Tạo bot nhắc nhở TODO cho ae trong công ty: Giới thiệu hướng phát triển con bot sử dụng trong công ty
  • Kết luận và link tham khảo

Microsoft Bot Framework

Framework bao gồm:

  • Bot Builder SDK: SDK .NET hoặc NodeJS để phát triển tính năng cho bot.
  • Bot Connector: service giúp cho bạn kết nối được với bot của bạn thông qua việc thiết lập các channel. Đóng vai trò trung gian - Forward message của bot tới user
  • Send back message của user tới bot
  • Developer Portal: https://dev.botframework.com, config bot của bạn
  • Bot Directory: chung cấp các con bot đã được phát triển rồi để ta có thể lấy về dùng.
  • Bot Emulator: để test bot trong quá trình dev

Bot là gì?

Bot vốn dĩ là web service tương tác với user qua các cuộc hội thoại thông qua các chanel được thiết lập sẵn (ext/SMS, Skype, Slack, Facebook Messenger,…).

  • Thiết lập các cuộc hội thoại một các tự do, cũng có thể sử dụng tương tác ngôn ngữ tự nhiên hay những tương tác former hơn thông qua các user choices hay actions.
  • Cuộc hội thoại có thể là simple text strings hoặc những công cụ phức tạp hơn như là  rich cards chứa text, images, và action buttons (hero card, thumb card,...).

Microsoft cung cấp SDK cho .NET và NodeJS, với các ngôn ngữ khác thì sử dụng RESTAPI để tương tác với Bot Connector.

Cơ chế hoạt động của bot

Bots: là con bot chúng ta sẽ phát triển, thực ra là 1 web service trong Developer Portal của Microsoft có yêu cầu web service này phải là HTTPS.

Bot Connector: sẽ route các message giữa user và bot thông qua các channel như là Skype, Slack, Facebook Messager,… Các channel được config trên Developer Portal.

Logic hoạt động của bot

Logic đơn giản chỉ có:

  • Automation todo messaging: vào 8h sáng và 17h hàng ngày gửi list todo vào group skype của công ty (sử dụng node cron để lập lịch)
  • Khi member trong group muốn biết list todo hiện tại thì sẽ gõ @<tên_bot> todo -> bot sẽ post list todo ra

Bot Builder SDK

Trong bài viết này tôi sẽ giới thiệu SDK của NodeJS, để sử dụng được SDK của NodeJS thì đâu tiên ta phải cài NodeJS đã.

Install NodeJS + Add thư viện Bot Builder (CentOS)

Cài node:

$ sudo yum install nodejs npm

Cài package của Bot Builder:

$ npm init
$ npm install --save botbuilder restify
  • botbuilder: SDK của Microsoft Bot Framework.
  • restify: package làm web service.

Thử làm "Hello World":

var restify = require('restify');
var builder = require('botbuilder');

//=========================================================
// Bot Setup
//=========================================================

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
  
// 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());

//=========================================================
// Bots Dialogs
//=========================================================

bot.dialog('/', function (session) {
    session.send("Hello World");
});

Khởi động bot:

$ node app.js

Cài Bot Emulator để test: hướng dẫn.

Khởi động Bot Emulator và thiết lập:

  • URL của web service bot.
  • Ấn connect.

Chat và sẽ thấy Hello World hiện ra.

  • Phần Details bên cạnh sẽ có lược sử các request + response và nội dung của request để giúp ta debug cho bot.

Giải thích ví dụ Hello World

Khởi tạo bot:

  • Khởi tạo web server:
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
...
server.post('/api/messages', connector.listen());

Sử dụng restify để tạo web server để xử lý tương tác với user.

  • Thiết lập connector: có 2 loại là ConsoleConnector (tương tác với bot thông qua console, sẽ ko cần web server như trên) và ChatConnector (tương tác với bot trông qua emulator hoặc các channel)
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
...
server.post('/api/messages', connector.listen());

process.env.MICROSOFT_APP_ID, appPassword: process.env.MICROSOFT_APP_PASSWORD là thông tin App tạo trên Microsoft Developer Portal, cần thiết khi chạy trên production, emulator ko cần.

  • Thiết lập bot:
var bot = new builder.UniversalBot(connector);

//=========================================================
// Bots Dialogs
//=========================================================
bot.dialog('/', function (session) {
    session.send("Hello World");
});

UniversalBot là bộ não của con bot, quản lý các cuộc hội thoại của bot và user qua việc định nghĩa các dialogs.

Quản lý các Dialogs để tương tác với users.

Message Type

Bot Builder SDK hỗ trợ 2 loại message:

  • Reactive Messages (message phản ứng)**: **response message  của bot cho user khi nhận được message từ user, thông thường sẽ được gửi qua method session.send().
  • Proactive Messages (message chủ động)**: **message tự động gửi từ bot đến user mà không cần user tương tác với bot, ví dụ như con bot skype sẽ gửi list todo hàng ngày vào 8h sáng.

Proactive Messages được send thông qua 1 trong 2 phương thức bot.send()bot.beginDialog() của lớp UniversalBot, để gửi message chủ động thì ta cần thông tin address của nơi mà ta muốn bot gửi message đến. Ta có thể lấy dữ liệu address thông qua session.message.address. Sẽ có dạng như sau:

  address:
   { id: '1485306--------',
     channelId: 'skype',
     user:
      { id: '29:10ZkF7DJz3CCiwAQKdodDjaoFlXJGS16----------',
        name: '【GMO】VNLAB Hieu Tran' },
     conversation:
      { isGroup: true,
        id: '19:e9b1e1da29a9473e990353354ebbd393@thread.skype' },
     bot:
      { id: '28:a23cbb4d-61e8-4143-8f5f-------------',
        name: 'jarvis' },
     serviceUrl: 'https://skype.botframework.com',
     useAuth: true }

Trong đó:

  • address.channelId: kênh mà ta thiết lập trên Developer Portal
  • address.user: chứa thông tin của user tương tác với ta
  • address.conversation: thông tin quan trọng nhất để gửi message chủ động chưa conversation id để gửi message
  • address.bot: thông tin của bot
  • address.serviceUrl: url của channel

Đoạn code sau là đoạn code gửi message chủ động thông qua request lên web server

server.post('/api/notify', function (req, res) {
    // Process posted notification
    var address = JSON.parse(req.body.address);
    var notification = req.body.notification;

    // Send notification as a proactive message
    var msg = new builder.Message()
        .address(address)
        .text(notification);
    bot.send(msg, function (err) {
        // Return success/failure
        res.status(err ? 500 : 200);
        res.end();
    });
});

Trong đó:

  • var address = JSON.parse(req.body.address);: lấy thông tin address từ boby của request ( tức là trong http request sẽ chứa thông tin conversation mà muốn bot gửi message tới)
  • Sau khi có được thông tin address thì ta chỉ cần sử dụng method bot.send() để gửi message.

Cards và Buttons

Trong skype ta có thể tạo các Card hay Button thay cho text message.

Các loại card hỗ trợ:

  • Hero card
  • Thumbnail card
  • Video card
  • Audio card
  • Animated GIF card
  • Carousel card (with hero or thumbnail images)
  • Sign in card
  • Receipt card

Các card và button này giúp người dùng tương tác thêm sinh động với bot. Các bạn có thể xem thêm tại link

Tạo bot nhắc nhở TODO

Yêu cầu

Quản lý lịch TODO của công ty, bao gồm:

  • List task
  • Người chịu trách nhiệm
  • Hạn phải hoàn thành

Tương lai:

  • Alert những task gấp
  • Tăng tính tương tác
    • Vote
    • Tra cứu thông tin cần thiết.
    • ...

Nếu ai đang làm trong cty của Nhật hoặc liên quan tới Nhật sẽ thấu hiểu tình cảnh có rất nhiều việc lặt vặt, không mang lại giá trị cho công ty, cá nhân nhưng ta vẫn phải làm hàng ngày, và tốt nhất để giải quyết nó một cách đơn giản, ko bị ảnh hưởng tới những việc có giá trị cao của chúng ta là ta phải tự động hoá những việc vặt vãnh đấy. Con bot này cũng cùng với mục đích đẩy để giảm bớt gánh nặng cho mấy ae trong công ty.

Hướng giải quyết

Sử dụng Microsoft Bot làm 1 chú bot thông qua skype để mỗi ngày vào 8h sáng (giờ cty bắt đầu làm việc) nhắc nhở todo list cho anh em trong cty.

Data source: sử dụng Trello (tool trực quan hoá công việc bằng các thẻ card), lý do tôi dùng trello làm data source vì độ trực quan cao, thao tác dễ, tương tác = API cũng rất đơn giản.

Vấn đề Scheduling: sử dụng node cron

Quản lý nodejs service: PM2

Trình tự thực thi

  1. Tạo app trên Application Registration Portal của Microsoft
  2. Lấy AppId và App Secret để config cho bot
  3. Tạo bot trên Developer Portal: link
  4. Config AppId và App Secret tạo ra ở trên
  5. Config các thông tin sau của bot
  1. Add Skype Channel trong Developer Portal
  2. Edit Skype Channel và enable group Group messaging để bot có thể tương tác với group trong skype
  3. Add bot vào skype của mình trên Developer Portal
  4. Add bot vào group trong skype
  5. Config cho bot các thông số:
  • Skype conversation id
  • Trello list id

Cơ chế hoạt động

Tổng quan sơ đồ hoạt động

List todo được lấy từ 1 list của Trello:

Nội dung của 1 todo sẽ bao gồm:

  • Tên task: title của card
  • Member: member được assign trên card
  • Due date: due date của card
  • Note: lấy từ description của card ( theo json format )

Kết luận

Đặc điểm nổi bật:

  • Sử dụng Microsoft Bot Framework giúp ta linh động hơn trong việc lựa chọn các channel để tương tác với người dùng.
  • Sử dụng trello làm data source giúp trực quan hoá tối đa task todo của công ty.
  • Giảm được thời gian quản lý task todo cũng nhưng giúp ae quên những task todo phải làm.

Hướng phát triển cho trương lai:

  • Phát triển AI cho bot hoặc xử lý ngôn ngữ tự nhiên (natural language processing)
  • Phát triển thêm nhiều tính năng tự động như là:
    • Alert liên tục những task khẩn cấp
    • Alert cuối tháng nhập time cho redmine
    • Chúc mừng sinh nhật ae trong cty
    • ...
  • Notify trên các channel như là Facebook messager (hiện tại chưa hỗ trợ add bot vào group)
  • ...

Tham khảo