Khi lập trình viên chơi facebook - Biến Facebook messenger thành bot tra cứu tử vi

Giới thiệu

Ở trong cái xã hội mà nhà nhà, người người, từ trẻ nhỏ tới người già, từ nông thông tới thành thị đều dùng mạng xã hội có vẻ lặp từ xã hội - nhưng kệ đi =)). Đặc biệt thứ mà nhiều người đa số đều dùng đó chính là facebook. Nên là facebook là gì hay là làm thế nào chơi facebook thì mình sẽ không đề cập ở trong bài viết này, thế nhá! Với mình là một lập trình viên à mà có là lập trình viên không ta? chắc chỉ là thằng đi code thôi =(( thì hôm nay, tại đây mình sẽ hưóng dẫn các bạn chơi facebook một cách thật ngầu, thật chất.

=> Xàm xàm thế đủ rồi, bắt đầu thôi nào =)) => Sản phẩm của mình làm ra trong hôm nay chính là: Biến messenger cá nhân trên facebook của bạn thành một bot đa năng =))

Demo

Bắt đầu

Thì với mình là một thằng code Python nên trong bài viết này mình xin được phép sẽ dùng Python để múa rìu qua mắt thợ.

  • Chuẩn bị: Những thứ chuẩn bị ở đây anh/em code python chắc chắn biết cài rồi nên mình chỉ liệt kê mà không hưóng dẫn nữa nhé
    • Python 3.6
    • Cài đặt thư viện fbchat và requests:
    $ pip install fbchat requests
    
    • Tạo một folder project: Chắc chắn rồi, khi code chúng ta cần vứt code vào 1 folder ở đây mình đặt tên folder là nguyenmanh_messenger_bot.
    • Tạo file main.py: * Đây chính là file mình sẽ code chương trình chính trong này =)) nói những thứ thừa thãi v**
    • Tạo file tu_vi.py: Dùng để code mấy thứ liên quan tới API tử vi
    • Tạo file session.json: Dùng lưu session facebook
    • Tạo file nguyen_manh_bot.py: Dùng để code bot messenger alt text
  • Danh sách API dùng trong bài viết:
    • Tử vi cung hoàng đạo hằng ngày: https://api.kma-chatbot.com/cunghoangdao.php?cung=<Tên cung hoàng đạo>
      • Ví dụ cung hoàng đạo: Song ngư
    • Tử vi 12 con giáp hằng ngày: https://api.kma-chatbot.com/tuvi.php?tuoi=<con giáp>
      • Ví dụ con giáp: Sửu

Triển khai code

  • Code tu_vi.py:
import requests


class TuVi():
    def __init__(self):
        pass

    def con_giap(self, Cgiap=''):
        url = 'https://api.kma-chatbot.com/tuvi.php?tuoi={}'.format(Cgiap.strip())
        loi_phan = ''  # Lời phán

        try:
            r = requests.get(url)
            data_json = r.json()

            set_attributes = data_json.get('set_attributes')

            if set_attributes:
                loi_phan = '-----{}-----\n- {}\n- {}\n- {}\n- {}\n'.format(
                    set_attributes.get('tvcongiap'),
                    set_attributes.get('congviec'),
                    set_attributes.get('tinhcam'),
                    set_attributes.get('taivan'),
                    set_attributes.get('cantrong')
                )
        except:
            loi_phan = 'Có thể con giáp bạn nhập bị sai :('

        return loi_phan

    def cung_hoang_dao(self, cung_hd=''):
        # Cái này mình cho API rồi các bạn tự viết nha =)) Lười!
        pass

  • Code nguyen_manh_bot.py
# -*- coding: UTF-8 -*-
from fbchat.models import *
from fbchat import log, Client

from tu_vi import TuVi


class NguyenManhBot(Client):
    def onMessage(self, author_id, message_object, thread_id, thread_type, **kwargs):
        self.markAsDelivered(thread_id, message_object.uid)
        self.markAsRead(thread_id)

        log.info("{} from {} in {}".format(message_object, thread_id, thread_type.name))

        if author_id != self.uid:
            if message_object.text:
                if message_object.text == '/Getid' or message_object.text == '/getid':
                    self.send(Message(text=message_object.author), thread_id=thread_id, thread_type=thread_type)

                elif '/tuvi' in message_object.text:
                    tuoi = message_object.text[message_object.text.index('/tuvi') + len('/tuvi'):]
                    tuvi = TuVi()
                    loi_phan = tuvi.con_giap(Cgiap=tuoi)
                    self.send(Message(text=loi_phan), thread_id=thread_id, thread_type=thread_type)
                else:
                    self.send(Message(
                        text='\n \n Tôi là Nguyễn Mạnh. \n- Tôi sẽ rep sau khi đi công việc về \n- Nếu xem tử vi gõ /tuvi <tuổi>; ví dụ: /tuvi sửu. \n- Tin nhắn của bạn: {0}'.format(
                            message_object.text)),
                        thread_id=thread_id,
                        thread_type=thread_type
                    )

  • Code main.py
import json

from nguyen_manh_bot import NguyenManhBot


def main():
    # Load session đăng nhập từ trước nếu có
    with open('session.json') as f:
        session_cookies = json.load(f)

    client = NguyenManhBot('username', 'password', session_cookies=session_cookies)

    # Lấy session và lưu vào file để lần sau dùng cho đăng nhập
    session_cookies_new = client.getSession()
    with open('session.json', 'w') as outfile:
        json.dump(session_cookies_new, outfile)

    # Lắng nghe phản hồi từ messenger
    client.listen()


if __name__ == '__main__':
    main()

Đưa code lên heroku

Bây giờ bạn đã có một bot khá ok rồi, bạn có thể chạy trên local nhưng để chuyên nghiệp hơn thì chúng ta nên đưa nó lên heroku để không phải bật máy cho nó listen mãi =))

  • Bước 1: Vào heroku tạo một tài khoản
  • Bước 2: Tạo app heroku
  • Bước 3: Cài git và heroku lên máy
  • Bước 4: Deploy code lên heroku
    • Để heroku chạy được code bạn thì cần phải tạo 1 file 'Procfile' trong project với nội dung
    worker: python test.py
    
    • Làm theo các bưóc sau để đưa code lên
      • Đăng nhập heroku
      $ heroku login
      
      • Khởi tạo git
      $ git init
      
      • Add remote của heroku vào git Thay nguyen-manh-messenger bằng tên app bạn tạo trên heroku
      $ heroku git:remote -a nguyen-manh-messenger
      
      • Deploy app của bạn
      $ git add .
      $ git commit -am "Lần đầu làm chuyện ấy"
      $ git push heroku master
      

Kết quả

  • Source code: https://github.com/nguyenmanh1997/nguyenmanh-messager
  • Sau khi làm theo như mình hướng dẫn bên trên thì bạn đã có một con bot tra cứu tử vi trên messenger cá nhân của bạn rồi. Giờ vào tận hưởng thành quả đi nào.
  • Các bạn dựa vào code mình làm và nâng cấp thêm nhiều chức năng mới nhé.
  • Chúc các bạn thành công!