Preparation
(1) Create a new App on your Facebook Developers.
(2) Add Product > Messenger
(3) Go to Messenger > Settings > Token Generation and link this App to the Facebook Page that you want to listen to Messages by generating a Token.

(4) You will be prompted with a permission request. Accept to authorize this App and copy the generated token as it will be needed later.
Setup Webhook
(1) Facebook needs to validate your server when setting up the callback webhook). This involves Facebook sending a token to your webhook URL and you respond with a specific challenge string.
(2) First, we will create a Rails app, with a single route. You can use your app id as the route URL. E.g.
Rails.application.routes.draw do match 'fb0000111122223333', :via => [:get, :post], :to => 'facebook_requests#create' end
(3) The controller action will look like this:
class FacebookRequestsController < ApplicationController
def create
if params.has_key?('hub.mode') && params['hub.mode'] == 'subscribe'
if params['hub.verify_token'] == 'your_token'
response = params['hub.challenge']
else
response = 'Error'
end
render plain: response, status: :ok and return
end
render status: :bad_request
end
end
(4) Deploy the App.
(5) Go to Messenger > Settings > Webhooks and add a new webhook. Enter the Webhook URL and the token for verification. For subscription fields, we will select "messages", "messaging_postbacks", "messaging_optins" and "message_deliveries".

(6) Click "Verify and Save" and Facebook will fire a verification message to your server. If your server responded correctly, you will see webhook setup is completed. You can set the webhook to the page your select earlier.

Read and Process Webhook Message
(1) You can now add logic to your controller code to handle commands. For this example, we do some simple math calculations based on the inputs.
class FacebookRequestsController < ApplicationController
def create
if params.has_key?('hub.mode') && params['hub.mode'] == 'subscribe'
if params['hub.verify_token'] == 'your_token'
response = params['hub.challenge']
else
response = 'Error'
end
render plain: response, status: :ok and return
end
if params.has_key?(:entry)
params[:entry].each do |entry|
entry[:messaging].each do |messaging|
sender_id = messaging[:sender][:id]
message_text = messaging[:message][:text]
matches = /^([0-9.-]{1,})([+\-*\/]{1})([0-9.-]{1,})[=]{0,1}$/.match(message_text)
if matches.nil?
FacebookApi.send_message(sender_id, 'Sorry. I do not understand this command.')
else
a = BigDecimal(matches[1])
b = BigDecimal(matches[3])
case matches[2]
when '+'
result = a + b
when '-'
result = a - b
when '*'
result = a * b
when '/'
if b == BigDecimal('0')
result = 'Undefined'
else
result = a / b
end
else
result = 'Sorry. I do not understand this command.'
end
FacebookApi.send_message(sender_id, "#{result}")
end
end
end
end
render status: :ok
end
end
(2) We also need to use the messenger API to send the result back to the user.
class FacebookApi
include HTTParty
base_uri 'https://graph.facebook.com/v2.6/me/messages?access_token=the_access_token'
debug_output (Rails.env.production? ? Rails.logger : $stdout)
open_timeout 30
read_timeout 30
def self.send_message(recipient, message)
post('/',
:headers => {
'Content-Type' => 'application/json'
},
:body => {
:recipient => {
:id => recipient
},
:message => {
:text => message
}
}.to_json
)
end
end
(3) Deploy the App and test.
Test It!
That's all. Now you have a messenger bot that can do maths.
