Facebook webhook – cập nhật facebook trực tiếp

Facebook Webhooks (FW)

Là 1 tính năng của Facebook Graph API. Tính năng này cho phép Facebook app của bạn đăng ký sự thay đổi từ 1 chủ thể (page, user, permission hay application). Mỗi khi chủ thể có thay đổi (có bài post mới, thay đổi ảnh bìa, share 1 link…), FW sẽ gửi 1 HTTP POST request đến server của bạn.

Đăng ký một chủ thể

Để đăng ký, bạn vào khu vực dashboad của app mình, truy cập vào mục Webhooks ở menu bên trái.
Click vào New subscription, chọn 1 hình thức chủ thể (Page chẳng hạn)
page 1
page2
Ở popup hiện ra, bạn cần điền 3 thông tin:
Callback URL: đây là link sẽ nhận HTTP POST request mỗi khi có sự kiện mới xảy ra. Mình sẽ nói rõ hơn về nó ở phần sau.
Verify Token: đây là chuỗi ký tự bất kỳ, nó dùng đề chứng thực cái Callback URLcủa bạn. Sẽ nói rõ ở phần sau 😛
Subscription Fields: những sự kiện của chủ thể mà bạn đưng ký lắng nghe, ở trên hình mình chọn lắng nghe các thay đổi về new feeds của page.

Ngoài ra, bạn có thể đăng ký bằng cách sử dụng /{app-id}/subscriptions Graph API edge, nhưng mình thấy cái này không cần thiết :3

Lưu ý: một số Subscription Field sẽ yêu cầu app của bạn phải được FB duyệt thì bạn mới lấy quyền đó được, nhưng với cơ bản là feed thì không cần, bạn cứ test thoả mái để cảm nhận 😛

Cấu hình Callback URL

Chứng thực Callback URL

Khi bạn click Verify and Save, FW sẽ gửi 1 HTTP GET request đến Callback URL của bạn. Request này sẽ chứa những thông tin (params) sau:
hub.mode: là string có giá trị là subscribe
hub.challenge: 1 chuỗi ngẫu nhiên (sẽ cần nó liền á)
hub.verify_token: chính là cái Verify Token mà bạn nhập lúc đăng ký một chủ thể phía trên

Khi nhận được request này, bạn cần phải:
– Kiểm tra xem cái hub.verify_token param có giống với Verify Token mà bạn nhập không. Đây là bước kiểm tra bảo mật để biết chắc rằng bạn đang nhận request từ FB chứ không phải ai khác.
– Kiểm tra xem cái hub.mode có phải là subscribe hay không.
– Return cái hub.challenge param về, để FW biết là mình đã cấu hình Callback URL xong xuôi và sẵn sàng nhận hook. HTTP code phải là 200

Một hàm chứng thực được viết bằng Ruby với grape framework:

Quan trọng: Callback URL phải là link https. Để có được link https bạn phải Mua chứng chỉ SSL, giá cũng khá khoai đó, vậy nếu không có tiền mua thì sao? Chịu à? Đọc tiếp bạn sẽ biết 😛

Nhận hàng

Mỗi khi chủ thể có thay đổi (có bài post mới, thay đổi ảnh bìa, share 1 link…), FW sẽ gửi 1 HTTP POST request đến Callback URL.

Request này sẽ chứa những thông tin cơ bản về sự thay đổi kia, bạn sẽ sử dụng những thông tin cơ bản đó kết hợp với Graph API để lấy đầy đủ thông tin về sự thay đổi về. Lấy về được rồi thì thích làm gì với nó thì làm 😀

Để lấy thông tin đầy đủ của sự thay đổi (feed chẳng hạn), ta có thể sử dụng app token của mình, bạn truy cập vào Access Token Tool để lấy được app token của app mình. Token này là cố định và có giá trị vô thời hạn, nên cứ thỏa mái gọi Graph API 😛

Có một lưu ý là để đảm bảo tính bảo mật, trong request, FW có nhúng vào header 1 trường X-Hub-Signature với nội dung là: hsa1={public key} Cái public key này được sinh ra bằng thuật toán SHA1 với nội dung là Request's body và private key là app secret của bạn (cái này lên trang app dashboard là có.
Lưu ý là cái body sẽ được dùng dưới dạng escaped unicode (vd: äöå sẽ được encode thành \u00e4\u00f6\u00e5), bởi vậy, trước khi check SHA1 thì bạn phải encode body trước.

Tần suất

Nếu có gửi fail, FW sẽ cố gửi lại liền, sau vài lần fail, nó sẽ giảm tần suất lại và cố gắng gửi trong 24 giờ tiếp theo. Nếu quá 24h mà server không nhận được request thì FW sẽ huỷ và không gửi nữa. Bởi vậy, sẽ có trường hợp tin nhắn bị tới trùng nhau, bạn cần tính cả trường hợp này khi xử lý Webhook.

Đến đây là cơ bản xong các kiến thức cần trang bị để có thể làm việc được với FW rồi, bạn có thể tham khải thêm tài liệu chính thức.

Eh eh, nãy giờ có thấy nói gì đến đăng ký cho page nào cụ thể đâu mà đòi nhận hook?

Đúng rồi, khó khăn mới chỉ bắt đầu, đời đâu có như mơ đâu :v

Cấp quyền để nhận hook

Để đăng ký nhận hook ở 1 page cụ thể, bạn phải được chủ page đó cấp quyền.

Sau khi được cấp quyền, bạn sẽ được 1 page access token Ta sẽ dùng token này để gọi /{page_id}/subscribed_apps Graph API. Thao tác này FW gọi là “your app be installed on the page”.

Việc cài đặt cấp quyền này hơi rườm rà, may sao, FB có cung cấp công cụ Graph API Explorer giúp mình thực hiện các thao tác ở trên kia 1 cách dễ dàng.

Cấp quyền

Đầu tiên, tạo 1 facebook fan page để lát nữa mình hook vào page này lắng nghe nội dung cập nhật.

Tiếp đến, truy cập vào Graph API Explorer, ở góc trên bên phải, mục Application:, chọn tên app mà lúc nãy bạn đăng ký một chủ thể (trong hình dưới là Demo Hook).

Mục Get token, chọn Get page access token.

get page access token 1
Sẽ có 2 popup hiện lên yêu cầu bạn cấp quyền. Sau khi câp quyền, quay trở lại mục Get token sẽ có danh sách các page của bạn, bạn chọn page lúc nãy.
page access token 2

Đăng ký nhận hook

Sau khi được cấp quyền thì đăng ký nhận hook.
Để đăng ký, gửi một POST request -> /{page_id}/subscribed_apps.
facebook webhook
Nếu thành công, kết quả trả về sẽ là:

Để kiểm tra lại, bạn có thể gọi GET request -> /{page_id}/subscribed_apps

Trường link chính là link Callback URL á.

Đến đây là đã có đủ thẩm quyền để nhận được hook rồi.
Việc cuối cùng phải lo đó là link https.
Tiếp đến mình sẽ giới thiệu 1 thủ thuật để có được link https đồng thời có thể test hook ngay trên localhost.

ngrok – dịch vụ biến hàng fa kè thành hàng hiệu

Lên trang chủ đăng ký 1 tài khoản và tải file ngrok excutable về, bỏ vào thư mục /bin/ngrok để ta có thể gọi lệnh $ ngrok từ bất cứ đâu.

Mở terminal lên, chạy lệnh:

Con số 3000 chính là port mà bạn muốn mở. Cũng chính là port mà server app của bạn đang chạy.

Terminal sẽ chuyển sang 1 màn hình real-time:

Thông số trong đấy khá dễ hiểu đúng không?

Chính là dòng mà mình cần, vậy là ta đã có link https.

Đó là dưới local, còn trên server staging đồ thì sao?

Thì cũng làm tương tự thôi, có điều hơi khác là mọi thao tác phải làm bằng dòng lệnh hết.

Ví dụ cho ubuntu server:

Vấn đề khác nảy sinh, sau khi mở cổng, nếu bạn tắt cửa sổ terminal đi thì ngrok cũng tắt luôn, điều này ở dưới local thì còn chấp nhận được chứ lên server không lẽ mở máy mình miết để giữ cửa sổ đó?

May sao, mình có thể cho ngrok chạy ngầm được. Sau khi deploy app lên server, bạn chạy lệnh:

Thay số 80 bằng cổng mà server app bạn chạy, mà thường là chạy ở cổng 80 thôi 😛

Sau khi chạy xong thì bạn truy cập vào https://dashboard.ngrok.com/status để lấy link https.

Vậy là xong, mọi vấn đề được giải quyết, bắt tay vào xây dựng app kiếm tiền thôi :v

Lập trình và hơn thế nữa

Spread the love
  •  
  •  
  •  
  •  
  •  

Leave a Reply

1 Comment on "Facebook webhook – cập nhật facebook trực tiếp"

Notify of
avatar
Sort by:   newest | oldest | most voted
liemqv
Guest

Hay quá, cảm ơn tác giả.