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

Giới thiệu

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!

Cài đặt thư viện

Trước tiên các bạn cần cài đặt pythonpip 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 pythonpip 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.

Viết code cho 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('😚 Đây là tin nhắn trả lời tự động từ BOT 😚!', thread_id=thread_id, thread_type=thread_type)
        
client = AutoBot('<email>', '<password>')
client.listen()

Đây là kết quả của mình khi sau khi chạy bot và gởi tin nhắn kết quả. Nhưng mà hình như có gì đó không ổn, khi mà chúng ta gởi tin nhắn, thì không phải bot reply lại tin nhắn của chúng ta, mà là nó spam tin nhắn thì phải. Cùng tìm hiểu xem tại sao nhé :couple_mm:. Như ở trên mình đã nói hàm onMessage() sẽ bắt sự kiện khi cuộc trò chuyện có tin nhắn mới, vậy khi bot auto reply lại tin nhắn của chúng ta ở lúc đầu, thì tin nhắn mà bot gởi nó cũng tính là tin nhắn mới trong cuộc trò chuyện. Điều này dẫn đến hàm onMessage() sẽ được gọi liên tục. Nếu vậy hướng giải quyết sẽ là chỉ khi tin nhắn là của "người khác" gởi đến thì hàm sendMessage() bên trong hàm onMessage() mới được thực thi. Vậy thì làm sao phân biệt được tin nhắn có phải là của bot hay của "người khác" gởi? Chúng ta chỉ cần so sánh author_iduid của tài khoản đang đăng nhập vào, như vậy sẽ biết được người gởi tin nhắn là bot hay là "người khác". Và các bạn xem log, sẽ thấy lỗi UnicodeEncodeError: 'ascii' thì hãy import sys vào nhé. Hãy cùng cập nhật lại code và xem kết quả thôi :couple_mm::

# -*- coding: utf-8 -*- 
from fbchat import log, Client
from fbchat.models import *
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

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))
        if self.uid != author_id:
            self.sendMessage('😚 Đây là tin nhắn trả lời tự động từ BOT 😚!', thread_id=thread_id, thread_type=thread_type)
            
client = AutoBot('<email>', '<password>')
client.listen()

Với đoạn code như trên, chúng ta đã có một con bot đơn giản có thể tự động gởi tin nhắn khi có "người khác" gởi tin nhắn đến. Nhưng các bạn cần chú ý, nên thuê VPS ở Việt Nam để up con bot này nhé, đừng dùng VPS nước ngoài sẽ bị lock account facebook đấy :couple_mm:.

Kết luận

Trên đây là chia sẻ của mình về cách tạo một bot chat tự động gởi tin nhắn đơn giản, tuy nhiên các bạn có thể phát triển nó thêm bằng việc kết hợp với các API khác để giúp nó thêm hoàn thiện hơn, ví dụ như API của simsimi.

Tuy nhiên nếu chỉ chăm chăm dùng thư viện, dùng hàng có sẵn, bạn sẽ không học hỏi được gì. Ngoài ra, không phải mọi người ai cũng biết dùng Python, do đó chúng ta cần tìm hiểu nhiều hơn về cơ chế hoạt động của một con bot từ đầu đến cuối, từ đó chúng ta có thể tự viết cho mình một con bot hoàn thiện hơn.

Cảm ơn các bạn đã tham khảo bài viết này, nếu có vấn đề gì các bạn có thể góp ý cho mình ở phần bình luận bên dưới, xin cảm ơn :couple_mm:.

Tài liệu tham khảo

https://fbchat.readthedocs.io/en/master/.

CHÚC CÁC BẠN THÀNH CÔNG!