Facebook Message Bots

Giới Thiệu

Facebook Message Bot

  • Tháng 04/2016 Facebook ra mắt Messenger Platform phiên bản Beta, trong đó cho phép developer có thể viết 1 con Bot để có thể trả lời tự động.
  • Đây chính là cơ hội để có thể kết nối với lượng người dùng khổng lồ trên thế giới dùng facebook thông qua mesenger.
  • Thông tin gửi nhận giữa user và Bots là một message template trong đó có thể chứa: text, images, các CTAs (Calls to action).

Ứng Dụng

Cách Tạo Một Facebook Message Bot

Mô hình gửi nhận của Facebook Message Bot

  1. User gửi message tới Facebook Message Bot
  2. Facebook Message Bot đóng gói message và gửi nội dung user đã gửi tới WebHook Server
  3. Tại WebHook Server, sau khi nhận được message, tùy thuộc vào mục đích của Bot muốn tạo ra, Develop sẽ tạo ra 1 message Reponse (message template của Facebook) và
  4. WebHook Server gửi trả lại Facebook Message Bot nội dung message temple đã được tạo ra. Trong nội dung message gửi có lưu userId đã send tới FB Message Bot
  5. Gửi lại nội dung để hiển thị trong màn hình chát message của user

Dựng mô hình

Trong mô hình trên thì người Developer sẽ phải thiết lập một Facebook Message Bot và Dựng một Webhook Server Bot. Mọi việc liên quan đến lập trình để phục vụ cho việc trả lời tự động của Bot sẽ được viết trên WebHook Server Bot.

Tạo một Webhook Server bot

  • Code sample gửi nhận message với  Facebook Message Bot: git@github.com:dinhphi/test-chat-bot-fb.git
  • Webhook theo wikipedia: “A webhook in web development is a method of augmenting or altering the behavior of a web page, or web application, with custom callbacks

Cách tạo trên https://c9.io (cung cấp 1 VPS online)
– Có thể sử dụng chính VPS của bạn, hoặc một VPS online khác. Cài đặt npm và chạy nodeJs trên file server.js

  • Nhập [Workspace name], [Clone from Git or Mercurial URL]: git@github.com:dinhphi/test-chat-bot-fb.git, template: Node.js
  • RUN server

Một số phần chính trong Server.js (tham khảo sau khi lấy source code từ github về) - Là server bằng Node.js

  • Tạo app:
var app = express();
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}));
var server = http.createServer(app);


app.get('/', (req, res) => {
  res.send("Home page. Server running okay.");
});


app.set('port', process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || 3002);
app.set('ip', process.env.OPENSHIFT_NODEJS_IP || process.env.IP || "127.0.0.1");

server.listen(app.get('port'), app.get('ip'), function() {
  console.log("Chat bot server listening at %s:%d ", app.get('ip'), app.get('port'));
});
  • Tạo webhook
app.get('/webhook', function(req, res) {
  if (req.query['hub.verify_token'] === '12345') {
    res.send(req.query['hub.challenge']);
  }
  res.send('Error, wrong validation token');
});
  • [hub.verify_token] là một thành phần quan trọng để khi start server lên thì để App Facebook Messenger xác nhận thông tin verify_token. Giá trị này có thể là một chuỗi bất kỳ, Khi xác thực bên Facbook Messenger Bot cần nhập trùng với bên WebHook.

  • Nhận Message từ App Facebook Messenger Bot

function receivedMessage(event) {
  var senderID = event.sender.id;
  var recipientID = event.recipient.id;
  var timeOfMessage = event.timestamp;
  var message = event.message;

  console.log("Received message for user %d and page %d at %d with message:", 
    senderID, recipientID, timeOfMessage);
  console.log(JSON.stringify(message));

  var messageId = message.mid;

  // You may get a text or attachment but not both
  var messageText = message.text;
  var messageAttachments = message.attachments;

  if (messageText) {

    // If we receive a text message, check to see if it matches any special
    // keywords and send back the corresponding example. Otherwise, just echo
    // the text we received.
    switch (messageText) {
      case 'image':
        sendImageMessage(senderID);
        break;

      case 'button':
        sendButtonMessage(senderID);
        break;

      case 'generic':
        sendGenericMessage(senderID);
        break;

      case 'receipt':
        sendReceiptMessage(senderID);
        break;

      default:
        sendTextMessage(senderID, messageText);
    }
  } else if (messageAttachments) {
    sendTextMessage(senderID, "Message with attachment received");
  }
}
  • Trong ví dụ này tùy vào message mà user gửi đến có thể tùy chỉnh gửi lại user các dữ liệu khác nhau. Ví dụ trên nếu user gửi text: ‘image’ thì sẽ gửi lại user 1 hình ảnh nào đó. Tương tự nếu gửi một ‘generic’ thì sẽ nhận được một template message thuộc dạng generic. Hoặc một text bất kỳ thì sẽ nhận được theo dạng text.
  • Gửi Message tới App Faccebook Messenger Bot
function callSendAPI(messageData) {
  request({
    uri: 'https://graph.facebook.com/v2.6/me/messages',
    qs: { access_token: 'EAAEIcu29G2MBAIXVs02oqPHxMqFsku3heDN0E50KorDzY1LBmnUPgbgQA4FWuiCFPb3CZArofz1KijokqgNZBrbTR3H9ZCW7JNh4SYILZAZAcZBRcDeid36Uk0ThluioU9l7YZCmkllstkL5YHaZBDsthcTtppouHIAWMP1DcYnYAwZDZD'},
    method: 'POST',
    json: messageData

  }, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      var recipientId = body.recipient_id;
      var messageId = body.message_id;

      console.log("Successfully sent generic message with id %s to recipient %s", 
        messageId, recipientId);
    } else {
      console.error("Unable to send message.");
      console.error(response);
      console.error(error);
    }
  });  
}

Một số chú ý:

  1. Trước khi có thể thiết lập thì phải tạo 1 App và 1 Page phục vụ cho facebook message bot.
  1. Setup WebHook (các thông tin cần thiết tham khảo phần tạo webhook server ở trên)
  2. Lấy Page Access Token – sau khi lấy thì token này sẽ cần phải thiết lập cho webhook phục vụ khi gửi message

Kết quả chạy thử

WebHook Server

Facebook Send Message

Tạo Một Sample Chat Bot

Nội Dung

CleverBot & Facebook Message Bot

  • Mô hình
  • Gắn nội dung vào việc sendTextMessage trên webHook
var bot = new cleverbot("vFPSSsQ3GjoTqsAK", "lRkHTo2OhNQCp3jOUQAkBxDgMsi9y2Oy");
bot.setNick("dinhphirobot");
  
function sendTextMessage(recipientId, messageText) {
  bot.create(function (err, session) {
       if ( err ) {
        // handle the error safely
        console.log('Have create error');
    }
  // session is your session name, it will either be as you set it previously, or cleverbot.io will generate one for you

  // Woo, you initialized cleverbot.io.  Insert further code here
});
  bot.ask(messageText, function (err, response) {
  console.log(response); // Will likely be: "Living in a lonely world"
   var messageData = {
    recipient: {
      id: recipientId
    },
    message: {
      text: response
    }
  };

  callSendAPI(messageData);
   if ( err ) {
        // handle the error safely
        console.log('Have error');
    }
  });

 
}

Kết quả

Kết luận

  1. Thông qua message facebook có thể tùy chỉnh message gửi tới user
  2. Ứng dụng sử dụng của FB mesenger flatform có thể đa dạng hóa dựa vào message template
  3. Có thể sử dụng bên thứ 3 khác nữa (ví dụ clever bot) để tạo message hoặc ứng dụng tùy ý.
  4. Khó khăn trong việc trên là có server đẻ đặt webhook
  5. Chưa hoàn thiện do chưa deploy app, có thể nói tới trong một bài viết khác.
  6. Có thể tạo các Bot cho IoT, EC, application…

Tham khảo