Phần 2: Viết code xử lý tin nhắn và trả lời, test bot Facebook

Xin chào các bạn, sau khi đã hướng dẫn các bạn ở Phần 1, thì bây giờ mình tiếp tục với phần 2 của series tạo con bot chat cho Facebook này. Ở phần trước sau khi đến step này: Các bạn click vào "Đăng kí" trang cho mình nhé. Bây giờ chúng ta cũng đến với phần 2 nào:

1. Viết code xử lý tin nhắn và trả lời

Đầu tiên chúng ta sẽ thêm một số gem cơ bản cũng nhử xử lí phía url nehs Để các bạn có thể nhận được chuỗi html cũng như json trả về thì bạn phải add gem: gem 'http'. Tiếp theo việc nữa phải cấu hình trong file routes.rb của các bạn như sau: Đây là việc cực kì quan trọng để bạn có thể tiếp nhận được tin nhắn mà facebook gửi về. Tiếp theo khi đã cấu hình xong routes bạn cần require cái gem mình vừa thêm vào ở trên cũng như require thêm "json" nhé:

link file: app/config/application.rb

Giờ mình sẽ giải thích qua một chút về cơ chế tiếp nhận tin nhắn trả lời:

Ok giờ bạn đã hoàn thành việc setup một số gem cũng như routes cho nó rồi, bây giờ mình đi vào việc xử lí code nhé: Trước khi đến với phần code mình giải thích thêm một xíu. Mỗi khi có tin nhắn, facebook sẽ POST một request như sau lên Webhook của chúng ta

{
  "object":"page",
  "entry":[
    {
      "id": "PAGE_ID",
      "time":1457764198246,
      "messaging":[
        {
          "sender":{
            "id":"USER_ID"
          },
          "recipient":{
            "id":"PAGE_ID"
          },
          "timestamp":1457764197627,
          "message":{
            "mid":"mid.1457764197618:41d102a3e1ae206a38",
            "seq":73,
            "text":"hello, world!"
          }
        }
      ]
    }
  ]
}

Trong cái hash messaging ta sẽ đọc trường messaging.message.text xử lí và gửi chuỗi Json đến RestAPI của facebook để trả lời.

{
    "recipient":{
        "id":"USER_ID"
    }, 
    "message":{
        "text":"hello, world!"
    }
}

Giờ bạn tiếp tục làm theo đoạn code dưới đây trong file: app/controller/callback_controller.rb#received_data

  def received_data
    the_request = request.body.read
    data = JSON.parse(the_request)
    enteries = data["entry"]
     enteries.each do |entry|
      entry["messaging"].each do |messaging|
        sender = messaging["sender"]["id"]
        text = messaging["message"]["text"]
        myjson = {"recipient": {"id": "#{sender}"},"message": {"text": "hello, world"}}
        puts HTTP.post(url, json: myjson)
      end
    end
    render "received_data"
  end

Bạn đừng copy rồi chạy luôn nhé, để ý ở dòng puts HTTP.post(url, json: myjson) mình sẽ truyền một url vào method post này, vậy url này mình lấy ở đâu, giờ bạn quay trở lại trang: https://developers.facebook.com/apps, bạn sẽ lấy url ấy ở đây, click vào trang bạn đã tạo từ phần 1: Ở đây mình thêm một method url cho DRY xíu nhé:

 def url
    "https://graph.facebook.com/v2.6/me/messages?access_token=EAASW9XjGzzoBAHpVWBPxtozyVFbSaTyN58vePgFuGceuL3TcQg5AoLhOsFUiJBfAYrT5rynox5sLrDrqzZCVZCGmi28rKSFbEpUI9IPLXJNCyZCD0oj9JGuyrnhFzxSff5hYZArzRrPrALxz8KoSDdV6GhkbyfMP4QcB6PipegfQ2ce51Aua"
  end

Bây giờ chúng ta thử test phát nào, bạn click run project nhé. Và thử vào facebook rồi gửi 1 tin nhắn đến trang mà bạn đã tạo. Ừm nó không chạy đúng không nào, và sẽ hiển thị lỗi sau:

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken)

Lỗi này chắc khá quen thuộc rồi nhỉ, bạn hãy tìm hiểu ở đây nhé http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html Vậy chúng ta sẽ thêm đoạn code nhỏ ở đầu của callback_controller.rb nhé : protect_from_forgery with: :null_session.

2. Test bot trên facbook

Vậy là chúng ta đã hoàn thành rồi đấy, hãy vào gửi tin nhắn vào trang bạn tạo để thấy điều bất ngờ nhé, đoạn log nó sẽ hiển thị ra như sau:

Parameters: {"object"=>"page", "entry"=>[{"id"=>"335068436955582", "time"=>1511785790032, "messaging"=>[{"sender"=>{"id"=>"1275942702510442"}, "recipient"=>{"id"=>"335068436955582"}, "timestamp"=>1511785781309, "message"=>{"mid"=>"mid.$cAAFqTfUNKqRmLrmgPVf_XRXlVen5", "seq"=>764171, "text"=>"hi hi"}}]}], "callback"=>{"object"=>"page", "entry"=>[{"id"=>"335068436955582", "time"=>1511785790032, "messaging"=>[{"sender"=>{"id"=>"1275942702510442"}, "recipient"=>{"id"=>"335068436955582"}, "timestamp"=>1511785781309, "message"=>{"mid"=>"mid.$cAAFqTfUNKqRmLrmgPVf_XRXlVen5", "seq"=>764171, "text"=>"hi hi"}}]}]}}

Bạn hãy thử nếu không thành công hãy comment ở dưới nhé, ở phần sau mình sẽ deploy trên heroku và nộp cho facebook xét duyệt nhé. Cảm ơn bạn đã theo dõi!