How to Create a Facebook Messenger Bot with Ruby on Rails

Chắc hẳn trong chúng ta, ít nhiều mỗi người đều đã nghe đến con Bot rồi, nhưng không phải ai cũng hiểu cơ chế hoạt động của nó. Ở bài viết này mình sẽ giới thiệu hướng dẫn cách tạo một con Bot bằng Rails. Tôi nghĩ làm việc với Rails rất tốt bởi vì nó đã support tất cả những thứ cần thiết để tạo ra một ứng dụng Chat Bot nho nhỏ của bạn. Nếu bạn muốn tạo ra những con Bot tinh vi hơn với các chức năng thông minh, bạn sẽ phải cần một số trung tâm điều khiển, ví dụ: nếu bạn muốn gửi tin nhắn cho tất cả người dùng ứng dụng của bạn. Chúng ta sẽ sử dụng gem facebook-messenger - đã được tạo ra bởi Hyper Nào chúng ta bắt đầu thôi!

Set up a Facebook App

Vào menu dành cho Facebook Developer và click "Add a New App", sau đó tạo một app như hình. Từ đây, bạn sẽ click "+Add Product" và add Messenger. Sau khi chúng ta config webhook, Facebook muốn chúng ta xác nhận Url cho ứng dụng của chúng ta.

Set up ứng dụng Rails

Thực hiện các set up sau:

  1. Cài đặt gem facebook-messenger. Note: Chúng ta sẽ sử dụng version mới nhất (0.11.1)
  2. Tạo 1 file config/initializers/facebook_messenger.rb và thêm code sau:
unless Rails.env.production?
  bot_files = Dir[Rails.root.join("app", "bot", "**", "*.rb")]
  bots_reloader = ActiveSupport::FileUpdateChecker.new(bot_files) do
    bot_files.each{ |file| require_dependency file }
  end
  ActionDispatch::Callbacks.to_prepare do
    bots_reloader.execute_if_updated
  end
  bot_files.each { |file| require_dependency file }
end
  1. Khởi tạo code trong Bot app/bot/listen.rb:
require "facebook/messenger"
include Facebook::Messenger
Facebook::Messenger::Subscriptions.subscribe(access_token: ENV["ACCESS_TOKEN"])
Bot.on :message do |message|
  puts "got your message!"
end

Note: Nhớ set biến ENV cho ACCESS_TOKEN để bảo mật tài khoản nhé!!! 4. Thêm code vào file config/application.rb để Rails biết về file Bot của chúng ta.

# Auto-load /bot and its subdirectories
config.paths.add File.join("app", "bot"), glob: File.join("**","*.rb")
config.autoload_paths += Dir[Rails.root.join("app", "bot", "*")]
  1. Định nghĩa Request trong route.rb. Mình sử dụng mount để nhận request thay thế cho root path:
# config/routes.rb
Rails.application.routes.draw do
  mount Facebook::Messenger::Server, at: "bot"
end
  1. Set các biến môi trường cho phép truy cập ứng dụng Facebook:
ACCESS_TOKEN=
VERIFY_TOKEN=
APP_SECRET=

Set Up Bot

Chúng ta sẽ set up để con bot lặp lại việc gửi message phản hồi:

# app/bots/listen.rb
require "facebook/messenger"
include Facebook::Messenger
Facebook::Messenger::Subscriptions.subscribe(access_token: ENV["ACCESS_TOKEN"])
# message.id          # => 'mid.1457764197618:41d102a3e1ae206a38'
# message.sender      # => { 'id' => '1008372609250235' }
# message.sent_at     # => 2016-04-22 21:30:36 +0200
# message.text        # => 'Hello, bot!'
Bot.on :message do |message|
  Bot.deliver({
    recipient: message.sender,
    message: {
      text: message.text
    }
  }, access_token: ENV["ACCESS_TOKEN"])
end

Như bạn thấy, message là một hash chứa những thông tin như: fb_id và nội dung message của người gửi. Tiếp tục thử trò chuyện với ứng dụng của bạn đi nào!

Link bài dịch: https://chatbotslife.com/create-a-facebook-messenger-bot-with-ruby-on-rails-4ffd8b851135 Tài liệu tham khảo: https://github.com/jgorset/facebook-messenger