Tạo bot chat Facebook cá nhân bằng nodejs

"Bài viết sau được dịch từ chia sẻ trên smashingmagazine.com của Slobodan Stojanović,  một CTO của cơ quan phát triển phần mềm Cloud France Horizon đặt tại Montréal và là người tổ chức các buổi họp mặt của JS Belgrade."

Trong vòng vài tháng trở lại đây, Chat bot (Ứng dụng trò chuyện tự động) đã trở nên rất phổ biến, thật sự rất biết ơn những “ông trùm” như Slack, Telegram và Facebook Messenger. Nhưng Chat bot không hẳn là thứ gì đó hoàn toàn mới mẻ.

Giao diện Chat bot đã được đề cập đến trong Turing test (phép thử Turing – Một bài kiểm tra về khả năng trí tuệ của máy tính) nổi tiếng vào năm 1950. Sau đó là Eliza (đây là chương trình có khả năng làm việc giống như một chuyên gia phân tích tâm lý) năm 1966, một mô phỏng của liệu pháp tâm lý Rogerian cùng với một chương trình xử lý ngôn ngữ tự nhiên. Sau đó là đến Parry năm 1972, mô phỏng một người bị chứng tâm thần phân liệt (và, vâng, dĩ nhiên, Parry và Eliza đã gặp nhau)

Vào năm 1983, một quyển sách có tên The Policeman’s Beard is Half Constructed được tạo ra bởi Racter, một chương trình máy tính trí tuệ nhân tạo giúp tạo ra các đoạn văn bằng Tiếng Anh một cách ngẫu nhiên, sau đó thì được áp dụng triển khai như một Chat bot.

Nổi tiếng nhất phải kể đến là Alice (artificial linguistic Internet computer entity – thực thể máy tính Mạng ngôn ngữ nhân tạo), phát hành năm 1995. Mặc dù không thể vượt qua được Turing test nhưng nó đã 3 lần thắng giải thưởng Loebner. Năm 2005 và 2006, 2 nhân vật ảo Jabberwacky đều mang lại giải thưởng. Và năm 2014, Slackbot đã giúp những nhân vật ảo này trở nên phổ biến một lần nữa. Năm 2015, Telegram và FB Mess đã phát hành Chat bot hỗ trợ, sau đó năm 2016 Skype cũng làm tương tự, tiếp đến là Apple và một vài công ty đã giới thiệu ngày càng nhiều nền tảng Chat bot hơn.

Tạo bot chat Facebook cá nhân bằng nodejs

Bạn cần gì để xây dựng một Chat Bot?

Dĩ nhiên câu trả lời hoàn toàn phụ thuộc vào những gì bạn muốn xây dựng. Hầu hết, bạn có thể xây dựng một Chat bot mà không cần biết một thứ gì về Trí tuệ nhân tạo (AI), cũng có thể “tự xử” hoàn toàn hoặc là tận dụng một số thứ sắn có dành cho AI cơ bản.

The same goes for natural language processing (NLP); it’s more important than AI, but you can build a chat bot using an NLP library or, for some platforms, simply by using buttons and UI elements instead of word processing.

Đối với việc tiếp cận Xử lý ngôn ngữ nhân tạo (NLP); thằng này thì quan trọng hơn AI, nhưng bạn có thể xây dựng một chat bot bằng việc sử dụng thư viện NLP hoặc đối với một vài nền tảng, đơn giản là bạn chỉ cần dùng mấy cái nút có sẵn và các yếu tố UI thay có xử lý từ ngữ.

Và cuối cùng, bạn có cần biết tí gì và Lập trình không ư? Có rất nhiều nhà xây dựng hình ảnh ảo, vì thế nên không cần đâu. Nhưng nếu biết một chút thì nó cũng có ích đấy.

Như thế nào để xây dựng Một FB Mess Bot?

Bài viết này viết về cách xây dựng Chat Bot, giờ thì hãy “ngoáy” sâu vào nó nào. Hãy xây dựng một FB Mess bot đơn giản nhé.

Chúng ta sẽ sử dụng Node.js, nhưng bạn cũng có thể xây dựng một Chat Bot với bất kỳ ngôn ngữ lập trình nào cho phép bạn tạo một web API.

Tại sao lại là Node.js? Bởi vì nó là hoàn hảo cho Chat bot : Bạn có thể xây dựng một API đơn giản cực nhanh với hapi.js, ví dụ như Express. Nó hỗ trợ tin nhắn thời gian thực (RTM) cho Slack RTM bot và nó rất dễ hiểu (ít nhất là đủ dễ để xây dựng nên một Chat bot đơn giản)

FB đã có một Chat bot được viết bằng Node.js, hiện đã có trên Github. Nếu bạn kiểm tra code, bạn sẽ nhìn thấy rằng nó sử dụng bộ thư viện Express và có 3 webhooks (xác minh, xác thực và nhận tin nhắn). Bạn cũng sẽ thấy nó gửi phản hồi bằng Module Request của Node.js.

Có vẻ đơn giản đúng không?

Đúng là đơn giản thật, Nhưng để hoàn thành mẫu bot này bạn sẽ tốn tận 839 dùng code đấy. Không quá nhiều và bạn có thể chỉ cần một nửa số đó, nhưng nó vẫn quá nhiều Code Boilerplate để bắt đầu.

Bạn nghĩ sao nếu tôi nói rằng cũng cùng một kết quả nhưng chúng ta chỉ có thể tốn 5 dòng JavaScript?

var botBuilder = require(‘claudia-bot-builder’); module.exports = botBuilder(function (request) { return ‘Thanks for sending ‘ + request.text; });

Hay thậm chí chỉ vọn vẹn vài dòng như thế này với ECMAScript 6:

const botBuilder = require(‘claudia-bot-builder’); module.exports = botBuilder(request => Thanks for sending ${request.text});

Công cụ Claudia Bot Builder

Claudia Bot Builder giúp những nhà phát triển tạo ra Chat bot cho FB Mess, Telegram, Skype and Slack cũng như phát triển chúng ở Amazon Web Services’ (AWS) Lambda và API Gateway trong vòng vài phút.

Ý tưởng cốt lõi đằng sau dự án này là loại bỏ tất cả các boilerplate code và các infrastructure tasks chung, vì thế bạn có thể tập trung viết những phần thực sự quan trọng của Bot – quy trình kinh doanh của bạn. Mọi thứ còn lại là để Claudia Bot Builder lo.

Tại sao lại là AWS Lambda? Nó « thích hợp » một cách hoàn hảo cho Chat bot: Tạo ra một API đơn giản cực kỳ dễ dàng; nó trả lời nhanh hơn rất nhiều so với việc dùng công cụ Heroku miễn phí và nó cũng rẻ nữa. Yêu cầu thứ một triệu đầu tiên thì mỗi tháng bạn không phải tốn một đồng nào, và thứ một triệu tiếp theo thì chỉ 0.2$ thôi.

Sau đây là cách vô cùng dễ dàng để xây dựng một FB Mess Bot với Claudia Bot Builder:

Hãy xây dựng một Space Explorer Bot

Space Explorer là một Mess chat bot đơn giản sử dụng API của NASA nhằm thu thập dữ liệu và những hình ảnh về không gian.

Trước khi chúng ta bắt đầu, hãy tạo một FB page và app, sau đó add thêm Mess Intergration, như đã mô tả ở Hướng dẫn “Getting Started” của Facebook.

Sau đó tạo một file với tên bot.js theo cấu trúc sau:

const botBuilder = require(‘claudia-bot-builder’); module.exports = botBuilder(request => Hello from space explorer bot! Your request was: ${request.text});

Cài đặt các phụ thuộc:

npm init;

npm install claudia-bot-builder -S;

npm install claudia -g;

Tạo bot chat Facebook cá nhân bằng nodejs

Tạo một chức năng Lambda và theo các bước trong video liên kết với FB app của bạn:

claudia create –region us-east-1 –api-module bot –configure-fb-bot

Được rồi đó! Bạn đã tạo được Chat bot đầu tiên cho FB Mess của mình.

Nếu bạn gửi một tin nhắn tới trang của bạn, Bot của bạn sẽ trả lời. Nhưng câu trả lời lại cực kỳ đơn giản. Hãy thêm mắm thêm muối vào cho nó thú vị hơn nhé!

Integrate API của NASA

Trước khi chúng ta tiếp tục, hãy ghé thăm cổng API của NASA và lấy API key.

Sau đó, add API key (như một nasaAPIkey) của bạn vào các giai đoạn biến chuyển trong API Gateway. Bạn có thể làm thao tác này từ UI hoặc chạy lệnh sau:

  1 2 3 4 5   aws apigateway create-deployment \     --rest-api-id API_ID --stage-name latest \     --variables nasaApiKey=YOUR_NASA_API_KEY  

Đây, API_ID là API ID của bạn từ file claudia.json đã được tạo ra tự động ở bước trước đó.

Hãy add một câu trả lời thú vị hơn cho tin nhắn văn bản của bạn. Claudia Bot Builder có những Builder đơn giản cho những mẫu tin nhắn FB Mess.

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 const botBuilder = require('claudia-bot-builder'); const fbTemplate = botBuilder.fbTemplate; const rp = require('minimal-request-promise');   module.exports = botBuilder((request, originalApiRequest) => {   // If request is not postback   if (!request.postback)     // We'll get some basic info about the user     return rp.get(`https://graph.facebook.com/v2.6/${request.sender}?fields=first_name&access_token=${originalApiRequest.env.facebookAccessToken}`)       .then(response => {         const user = JSON.parse(response.body)         // Then let's send two text messages and one generic template with three elements/bubbles         return [           `Hello, ${user.first_name}. Welcome to Space Explorer! Ready to start a journey through space?`,           'What can I do for you today?',           return new fbTemplate.generic()             .addBubble(`NASA's Astronomy Picture of the Day`, 'Satellite icon by parkjisun from the Noun Project')               .addImage('https://raw.githubusercontent.com/stojanovic/space-explorer-bot/master/assets/images/apod.png')               .addButton('Show', 'SHOW_APOD')               .addButton('What is APOD?', 'ABOUT_APOD')               .addButton('Website', 'http://apod.nasa.gov/apod/')             .addBubble(`Photos from NASA's rovers on Mars`, 'Curiosity Rover icon by Oliviu Stoian from the Noun Project')               .addImage('https://raw.githubusercontent.com/stojanovic/space-explorer-bot/master/assets/images/mars-rover.png')               .addButton('Curiosity', 'CURIOSITY_IMAGES')               .addButton('Opportunity', 'OPPORTUNITY_IMAGES')               .addButton('Spirit', 'SPIRIT_IMAGES')             .addBubble('Help & info', 'Monster icon by Paulo Sá Ferreira from the Noun Project')               .addImage('https://raw.githubusercontent.com/stojanovic/space-explorer-bot/master/assets/images/about.png')               .addButton('About the bot', 'ABOUT')               .addButton('Credits', 'CREDITS')               .addButton('Report an issue', 'https://github.com/stojanovic/space-explorer-bot/issues')             .get();         ];       }); }

Bây giờ Bot của chúng ta có một lời chào nồng ấm như sau:

Tạo bot chat Facebook cá nhân bằng nodejs

Hay hơn rồi thấy chưa!

Tiếp theo, chúng ta muốn giải quyết Postback. Hãy bắt đầu với NASA’s Astronomy Picture of the Day:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // In case of the 'SHOW_APOD' postback, we'll contact NASA API and get the photo of the day. if (request.text === 'SHOW_APOD')   return rp(`https://api.nasa.gov/planetary/apod?api_key=${originalApiRequest.env.nasaApiKey}`)     .then(response => {       const APOD = JSON.parse(response.body)       return [         `NASA's Astronomy Picture of the Day for ${APOD.date}`,         `"${APOD.title}", © ${APOD.copyright}`,         new fbTemplate.image(APOD.url).get(),         APOD.explanation,         new fbTemplate.button('More actions:')           .addButton('Download HD', APOD.hdurl)           .addButton('Visit website', 'http://apod.nasa.gov/apod/')           .addButton('Back to start', 'MAIN_MENU')           .get()       ]     });

Và đây là những nhà thám hiểu sao Hỏa (Hiếu kỳ, Cơ hội và Tinh thần):

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 // Common API call function getRoverPhotos(rover, sol, nasaApiKey) {   // If sol (Mars day) is not defined, take a random one.   if (!sol)     sol = (parseInt(Math.random() * 9) + 1) * 100;     // Contact the API   return rp(`http://api.nasa.gov/mars-photos/api/v1/rovers/${rover}/photos?sol=${sol}&api_key=${nasaApiKey}`)     .then(response => {       let rawBody = response.body;         let roverInfo = JSON.parse('' + rawBody);       // Create generic template with up to 10 photos.       let photos = roverInfo.photos.slice(0, 10);       let roverImages = new fbTemplate.generic();         photos.forEach(photo => {         return roverImages.addBubble(photo.rover.name, 'At ' + photo.earth_date + ' (sol ' + photo.sol + '), using ' + photo.camera.full_name)           .addImage(photo.img_src)           .addButton('Download', photo.img_src)       });         // Send the message.       return [         `${roverInfo.photos[0].rover.name} rover`,         `Landing Date: ${roverInfo.photos[0].rover.landing_date} \nTotal photos: ${roverInfo.photos[0].rover.total_photos}`,         roverImages.get(),         new fbTemplate.button('More actions:')           .addButton('Show newest photos', `PHOTOS_${rover}_${roverInfo.photos[0].rover.max_sol}`)           .addButton('Visit Wikipedia', `https://en.wikipedia.org/wiki/${rover}_(rover)`)           .addButton('Back to start', 'MAIN_MENU')           .get()       ];     })     .catch(err => {       // If the selected sol doesn't have any photos, take the photos from sol 1000.       console.log(err);       return getRoverPhotos(rover, 1000, nasaApiKey);     }); }   // Curiosity photos if (request.text === 'CURIOSITY_IMAGES')   return getRoverPhotos('curiosity', null, originalApiRequest.env.nasaApiKey);   // Opportunity photos if (request.text === 'OPPORTUNITY_IMAGES')   return getRoverPhotos('opportunity', null, originalApiRequest.env.nasaApiKey);   // Spirit photos if (request.text === 'SPIRIT_IMAGES')   return getRoverPhotos('spirit', null, originalApiRequest.env.nasaApiKey);   // Rover photos by sol (Mars day) if (request.text.indexOf('PHOTOS_') === 0) {   const args = request.text.split('_')   return getRoverPhotos(args[1], args[2], originalApiRequest.env.nasaApiKey); }

Cuối cùng hãy thêm một số nội dung tĩnh để kết thúc:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 // About Astronomy Picture of the Day if (request.text === 'ABOUT_APOD')   return [     `The Astronomy Picture of the Day is one of the most popular websites at NASA. In fact, this website is one of the most popular websites across all federal agencies. It has the popular appeal of a Justin Bieber video.`,     `Each day a different image or photograph of our fascinating universe is featured, along with a brief explanation written by a professional astronomer.`,     new fbTemplate.button('More actions:')       .addButton('Show photo', 'SHOW_APOD')       .addButton('Visit website', 'http://apod.nasa.gov/apod/')       .addButton('Back to start', 'MAIN_MENU')       .get()   ];   // About the bot if (request.text === 'ABOUT')   return [     `Space Explorer is simple Messenger chat bot that uses NASA's API to get the data and images about the space`,     `It's created for fun and also as a showcase for Claudia Bot Builder, node.js library for creating chat bots for various platform and deploying them on AWS Lambda`,     new fbTemplate.button('More actions:')       .addButton('Claudia Bot Builder', 'https://github.com/claudiajs/claudia-bot-builder')       .addButton('Source code', 'https://github.com/stojanovic/space-explorer-bot')       .get()   ];   // Finally, credits if (request.text === 'CREDITS')   return [     'Claudia Bot Builder was created by Gojko Adžić, Aleksandar Simović and Slobodan Stojanović',     'Icons used for the bot are from the Noun Project',     '- Rocket icon by misirlou, \n- Satellite icon by parkjisun, \n- Curiosity Rover icon by Oliviu Stoian, \n- Monster icon by Paulo Sá Ferreira',     'This bot was created by Claudia Bot Builder team',     new fbTemplate.button('More actions:')       .addButton('Claudia Bot Builder', 'https://github.com/claudiajs/claudia-bot-builder')       .addButton('The Noun Project', 'https://thenounproject.com')       .addButton('Source code', 'https://github.com/stojanovic/space-explorer-bot')       .get()   ];

Kết quả

Sau khi sắp xếp lại một chút, code chúng ta sẽ trông như the source on GitHub.

Và đây là cách mà bot chúng ta làm việc:

Bạn có thể thử nó trực tiếp trên page hoặc trên Space Explorer bot page của FB Mess

Xong rồi đó! Bạn đã xây dựng thành công Chat bot đầu tiên của mình bằng cách sử dụng Claudia Bot Builder. Dễ quá đúng không?

Bây giờ thì triển thêm vài Chat bot ngầu hơn nữa nha.

Một vài ghi chú nho nhỏ:

Tôi đã chọn FB Mess như một điểm khởi đầu bởi vì hầu hết chúng ta đều đã quen với nó. Nhưng chúng tôi chọn Slack cho Bot đầu tiên của mình vì toàn đội của chúng tôi sử dụng Slack hàng ngày. Vì thế, chúng tôi quyết định xây dụng một team vacation-tracker bot thẳng đến Slack bằng cách sử dụng Claudia Bot Builder, Node.js, MariaDB và AWS Lambda.

Tùy theo ý tưởng của bạn, mục tiêu thị trường và nền tảng mà bạn quen thuộc nhất, bạn có thể bắt đầu với bất kỳ nền tảng hỗ trợ Chat bot nào mà bạn muốn.

Hãy ghé thăm website Claudia để xem cách phát triển và triển khai AWS Lambda dựa vào microservices và APIs. Sau đó cho chúng tôi biết nếu bạn có xây dựng một thứ gì đó thật ngầu với nó.

Gửi lời cảm ơn đặc biệt tới Lav Crnobrnja, Marko Kažić, Goran Gajić, Bojan Matić và Vuk Nikolić vì sự giúp đỡ và đóng góp tuyệt vời cho bài viết này.

Tác giả: Slobodan Stojanović, CTO của cơ quan phát triển phần mềm Cloud France Horizon.

Link bài gốc: https://www.smashingmagazine.com/2016/10/how-to-develop-a-chat-bot-with-node-js/

Dịch giả: David Ngo - YBOX.VN TranslatorBản quyền bài viết thuộc về YBOX.VN. 

(*) Bản quyền bài viết thuộc về YBOX.VN. Khi chia sẻ, cần phải trích dẫn nguồn đầy đủ tên tác giả và nguồn là "Dịch Giả: David Ngo - Nguồn: YBOX.VN". Các bài viết trích nguồn không đầy đủ, ví dụ:"Theo Ybox" hoặc khác đều không được chấp nhận và phải gỡ bỏ.

(**) Trở thành dịch giả trên YBOX.VN, xem chi tiết tại đây: http://bit.ly/yboxtranslateteam