12/08/2018, 16:03

Tạo botchat facebook với thư viện fbchat

Hôm nay mình sẽ giới thiệu với các bạn về một thư viện bot chat đó là fbchat. Hiện nay thì có rất nhiều thư viện hỗ trợ việc tạo bot chat cho facebook nhưng vừa rồi mình có dịp học sơ qua về Python nên có tìm hiểu thấy thư viện này cũng khá hay, hỗ trợ khá đầy đủ các tính năng cơ bản như gửi tin ...

Hôm nay mình sẽ giới thiệu với các bạn về một thư viện bot chat đó là fbchat. Hiện nay thì có rất nhiều thư viện hỗ trợ việc tạo bot chat cho facebook nhưng vừa rồi mình có dịp học sơ qua về Python nên có tìm hiểu thấy thư viện này cũng khá hay, hỗ trợ khá đầy đủ các tính năng cơ bản như gửi tin nhắn văn bản, gửi emotion hay gửi hình ảnh và đặc biệt là bot chat này là cho facebook cá nhân. Bây giờ chúng ta bắt đầu nào!

Trước tiên các bạn cần cài đặt python và pip vào máy:

  1. Đối với window, các bạn có thể tham khảo cách cài đặt ở đây Python & pip Windows installation. Vì hiện tại mình đang sử dụng Ubuntu để viết bài này nên không thể chạy lên trực tiếp để cài đặt. Tuy nhiên mình đã test cài đặt thành công trên máy window và hướng dẫn trong link trên cũng khá cụ thể nên chắc các bạn sẽ không gặp lỗi khi đang cài.
  2. Đối với Ubuntu, vì máy mình đã cài sẵn rồi nên mình sẽ không hướng dẫn cài, nhưng mình thấy cũng chỉ cần chưa tới 5 câu lệnh thì bạn đã có thể cài được python và pip một cách dễ dàng. Tiếp theo, chúng ta cài đặt thư viện fbchat của python bằng lệnh sau:
pip install fbchat

Sau khi đã cài đặt thành công các bước trên, bây giờ chúng ta bắt đầu tạo vào việc tạo chatbot.

Đầu tiên, các bạn tạo một tập tin có phần mở rộng là py, ví dụ ở đây mình sẽ đặt tên là bot.py. Tiếp theo mở tập tin lên và code nào! Cơ chế của thư viện này là nó sẽ giả lập 1 trình duyệt và đăng nhập vào tài khoản của bạn, sau đó sẽ thực hiện các request như GET/POST, vì vậy nếu tài khoản của bạn đang sử dụng bảo mật hai lớp thì khi chạy bot bạn cần phải vào facebook để approve cho login của bot. Và vì nó sẽ giả lập trình duyệt và login, nên sẽ cần đến email và mật khẩu của tài khoản thay vì sử dụng Graph_API.

# -*- coding: utf-8 -*- 
from fbchat import log, Client
from fbchat.models import *

client = Client('<email>', '<password>')
client.listen()

Cùng thử gõ đoạn code như vậy vào tập tin, và mở terminal hoặc cmd đối với Window lên và dẫn đến thư mục chứa tập tin. Sau đó dùng lệnh sau để chạy tập tin:

python bot.py

Cùng nhìn vào log trên terminal nào :couple_mm::

Nếu log ở terminal như vậy có nghĩa là mọi thứ đã OK rồi đấy!

Tiếp theo, chúng ta tạo một class con kế thừa từ class Client, để override lại một số method cần thiết.

# -*- coding: utf-8 -*- 
from fbchat import log, Client
from fbchat.models import *

class AutoBot(Client):
    def onMessage(self, mid=None, author_id=None, message=None, thread_id=None, thread_type=ThreadType.USER, ts=None, metadata=None, msg={}):
        log.info('Đã nhận được tin nhắn từ {} với nội dung là: {}'.format(author_id, message))
        
client = AutoBot('<email>', '<password>')
client.listen()

Hàm onMessage() sẽ bắt sự kiện khi cuộc trò chuyện có tin nhắn mới, và sẽ in ra log với format như trên. Giải thích sơ về các tham số cần dùng đến trong này:

  • author_id: ID của người gởi,
  • message: Nội dung tin nhắn,
  • thread_id: ID của cuộc trò chuyện

Các tham số còn lại các bạn có thể xem thêm ở đây fbchat.client. Bây giờ thử chạy lại bot và thử gởi một tin nhắn mới vào tài khoản và xem log trên terminal nào :couple_mm:: Đây là kết quả của mình kết quả.

Tiếp theo chúng ta sẽ thực hiện trả lời lại tin nhắn của người dùng bằng hàm sendMessage(). Để gửi một tin nhắn, ngoài hàm sendMessage() để gửi văn bản, chúng ta cũng có thể sử dụng hàm sendEmoji(), sendRemoteImage(), sendLocalImage().

# -*- coding: utf-8 -*- 
from fbchat import log, Client
from fbchat.models import *

class AutoBot(Client):
    def onMessage(self, mid=None, author_id=None, message=None, thread_id=None, thread_type=ThreadType.USER, ts=None, metadata=None, msg={}):
        log.info('Đã nhận được tin nhắn từ {} với nội dung là: {}'.format(author_id, message))
        log.info('Thực hiện gửi message đến {}'.format(author_id))
        self.sendMessage('            
0