Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

Xây Dựng Một Slack Bot Bằng Python

by
Length:LongLanguages:

Vietnamese (Tiếng Việt) translation by Caitlyn Cat Tien (you can also view the original English article)

Final product image
What You'll Be Creating

Slack ra đời vào năm 2014 và đang được biết đến là ứng dụng kinh doanh phát triển nhanh nhất trong lịch sử. Hiện tại, có hơn 50.000 công ty thanh toán để sử dụng sản phẩm của Slack - kể cả nơi làm việc hiện tại của tôi.

Slack đã thực sự phân biệt bản thân nó với những ứng dụng trước đó, tập trung hơn vào việc trở thành một hệ thống nhắn tin với một số khả năng thoại và video. Slack đã thực sự tiếp cận và vượt quá những giới hạn và đang làm việc chăm chỉ để xây dựng một App Directory mạnh mẽ. App Directory chứa hàng trăm đến hàng nghìn sự tích hợp mang đến sự linh hoạt đáng kinh ngạc để nâng cao hiệu quả của công ty bạn.

Mục đích của bài viết này là minh hoạ cách làm thế nào bạn có thể xây dựng tích hợp duy nhất của riêng bạn với Slack, tận dụng Python phần cho logic.

Để giúp bạn tập trung nhằm hiểu cơ chế về những điều cơ bản của một Slack Bot, tôi sẽ tập trung vào một con bot tự xây dưng.

Tại sao lại xây dựng một Slack Bot?

Thậm chí dù Slack có một App Directory có đẳng cấp quốc tế, nhưng mỗi doanh nghiệp đều có các quy trình kinh doanh riêng biệt. Điều này khiến nhiều công ty gặp phải tình huống mà họ chỉ đơn giản là không thể tìm thấy một ứng dụng hoàn hảo cho họ.

Đây là lúc xây dựng Slack Bot của riêng bạn gia nhập cuộc chơi.

Công vụ của một Slack Bot là nhận và xử lý sự kiện phát sinh do tương tác của Slack từ đội ngũ của bạn. Slack cung cấp tối thiểu 50 loại hình sự kiện khác nhau, ví dụ như:

  • message: Môt thông điệp được gửi đến kênh.
  • team_join: Một thành viên mới đã gia nhập team.
  • member_joined_channel: Một người dùng đã gia nhập một kênh public hoặc private.

Và dĩ nhiên có nhiều loại hình sự kiện nữa mà bot của bạn có thể chọn lựa xử lý và phản hồi lại. Ví dụ, sự kiện team_join là một sự kiện tuyệt vời có thể bằt đầu một quá trình onboarding (đào tạo nhập môn cho người mới).

Mục tiêu của bài viết là minh hoạ làm sao một Slack Bot sẽ tương tác với sự kiện message để thực hiện những hành động cụ thể khi thành viên của nhóm tương tác với con bot.

Chọn đúng loại Slack Bot

Trong bài viết này, tôi sẽ tạo ra một ứng dụng Python và một Slack Bot có thể bổ sung vào dự án của nhóm để phản hồi các sự kiện message.

Để bắt đầu, tôi cần tạo ra một Bot trên Slack. Hai loại hình bot có thể được tạo ra:

  • một bot tự xây dựng
  • Tạo một ứng dụng và bổ sung một bot user

Bài này sẽ tạo một bot mới vì bot user cho một ứng dụng sẽ thích hợp hơn if tôi lên kế hoạch để viết và xuất bản một ứng dụng trên Slack. Cho rằng tôi muốn con bot chỉ dùng riêng trong nhóm của mình, một bot tùy chỉnh sẽ đủ dùng.

Tạo ra một Slack Bot riêng biệt

Một bot mới được tạo ra ở đây: https://my.slack.com/apps/A0F7YS25R-bots. Nếu bạn đã đăng nhập vào tài khoản Slack, phía trái chọn nút Add Configuration, nếu không hãy đăng nhập vào tài khoản Slack trước khi tiến hành tiếp. Nếu bạn chưa có tài khoản Slack, bạn có thể đăng ký miễn phí.

Việc này sẽ đưa bạn đến một trang mới yêu cầu bạn cung cấp một username cho bot của bạn. Nhập tên username vào, bảo đảm bạn tuân theo quy tắc đặt tên của Slack. Một khi bạn đã chọn một tên bot ngon lành, nhấn Add Bot Configuration.

Sau khi bạn đã tạo thành công bot của bạn, Slack chuyển hướng bạn đến một trang cho phép tùy biến thêm cho bot của bạn. Tôi sẽ để dành phần sáng tạo đó cho chính bạn. Điều duy nhất cần thiết từ trang này là API Token bắt đầu bằng xoxb-. Hoặc là tôi sao chép mã thông báo này đến một nơi an toàn để sử dụng sau này hoặc đơn giản là cứ duy trì mở trang này cho đến khi chúng tôi cần token cho các ứng dụng Python.

Thiết lập ứng dụng Python của bạn

Theo tài liệu chính thức của Slack cho Slack Developer Kit cho Python, hiện tại nó hỗ trợ phiên bản 2.7. Nó có đề cập đến phiên bản 3 sẽ được hỗ trợ trong tương lai gần.

Tôi đã có cài đặt phiên bản 2.7, vì vậy tôi sẽ đi cùng với phiên bản này của Python ngay lúc này. Nếu phần cài đặt Python của bạn đã được thiết lập và sẵn sàng, bạn có thể chuyển sang bước tiếp theo; nếu không, vui lòng truy cập vào trang Python Download và tải về phiên bản thích hợp cho hệ điều hành của bạn.

Để cài đặt Slack Developer Kit, tôi sẽ dùng PyPi để đơn giản hoá quá trình cài đặt của Slack Client. Trên một số hệ điều hành, lệnh pip có thể được chạy trực tiếp từ dấu nhắc lệnh. Nếu không, bạn sẽ cần tham khảo toàn bộ đường dẫn đến chương trình pip.

Ví dụ: trên hệ thống Windows của tôi, tôi chạy lệnh sau để cài đặt Slack Client từ dấu nhắc lệnh (tham khảo đường dẫn đầy đủ đến tệp pip.exe): \Python27\Scripts\pip install slackclient.

Tiếp theo, bạn sẽ muốn chọn một vị trí để lưu giữ ứng dụng của bạn. Tôi thích sử dụng GitHub, vì vậy tôi tạo ra một thư mục chính tên python có chứa tất cả các ứng dụng Python khác của tôi. Bên trong thư mục này, tôi đã tạo một thư mục con thích hợp gọi là slackbot.

Một khi tôi đã chọn nơi ứng dụng của tôi sẽ được lưu trữ, tôi sẽ lưu trữ phần cốt lõi của ứng dụng của tôi trong một tập tin gọi là slackbot.py.

Lần gọi Slack API đầu tiên của bạn

Giờ là lúc chạm tay vào bàn phím và kết nối với Slack và thực hiện lần gọi API đầu tiên. Hãy bắt tay vào code ngay, và sau đó tôi sẽ giải thích điều gì đang diễn ra:

Code bắt đầu với việc import thư viện Slack Client, tiếp theo là khởi tạo class SlackClient bằng token API của Slack Bot của bạn mà bạn đã lưu trước đó. Đảm bảo thay token trong ví dụ này bằng token của bạn.

Đối tượng SlackClient được lưu trữ trong một biến cục bộ gọi là slack_client sẽ được sử dụng để tương tác với Slack.

Sử dụng slack_client, gọi API để lấy danh sách những người dùng của đội ngũ của bạn. Nếu cuộc gọi API thành công, danh sách thành viên nhóm được lưu trữ trong biến users. Biến users trong một mảng được sử dụng vòng lặp for, in ra tên mỗi thành viên trong console của ứng dụng.

Slack hỗ trợ một số kiểu tương tác khác nhau với hệ thống. Đầu tiên, chúng tôi vừa hoàn tật việc gọi API. Slack đề xuất nhiều loại hình gọi API khác: Web API, Events API, Conversations API, Real Time Messaging API, và SCIM API. Việc gọi API để lấy về danh sách người dùng đã tận dụng SCIM API.

Trong ví dụ tiếp theo, tôi sẽ minh hoạ làm thế nào để sử dụng Real Time Messaging System. Khi chúng ta bắt đầu xây dựng bot sau cùng, API Conversations sẽ được sử dụng để gửi tin nhắn để đáp ứng các lệnh mà bot của chúng ta sẽ trả lời.

Kết nối với hệ thống Real TIme Messaging

Hệ thống RTM cung cấp rất nhiều quyền hạn vì Slack gửi các sự kiện mà ứng dụng của bạn có thể xử lý và phản hồi ngay lập tức. Tất nhiên, có rất nhiều sự kiện mà bot của bạn có thể không cần phải xử lý mọi sự kiện. Để minh hoạ cho nhiều sự kiện khác nhau chỉ xảy ra khi kết nối, ví dụ sau đây sẽ xuất ra mỗi sự kiện nhận được.

Hãy lập tức nhìn vào code để kết nối và bắt đầu ghi nhận sự kiện của Slack:

Giống như ví dụ trước đó, code bắt đầu với việc import thư viện Slack Client và khởi tạo class SlackClient với cùng API Token giống trước đó. Ví dụ này cũng import thư viện Time, sẽ được dùng sau này trong code.

Với SlackClient được tạo ra thành công, dòng code tiếp theo gọi phương thức rtm_connect. Điều được thực hiện với một mềnh đề if. Nếu kết nối không thành công vì một số lý do nào đó, một thông báo lỗi được xuất ra console. Khi thành công, một thông báo thành công được in ra để cho chúng tôi biết rằng chúng tôi đã kết nối và sẵn sàng để bắt đầu tương tác với các sự kiện của Slack.

Một vòng lặp vô hạn trong khi đó bắt đầu. Bên trong vòng lặp này, tôi gọi phương thức rtm_read của thư viện Slack Client.

Kết quả của cuộc gọi này được ghi nhận vào console. Sau khi điều này xảy ra, ứng dụng dừng một giây trước khi đọc sự kiện kế tiếp từ Slack. Dưới đây là một ví dụ nó trông như thế nào khi đọc các sự kiện theo kết nối đầu tiên:

Khi bot được kết nối, ba sự kiện được gửi từ Slack như đã thấy ở trên. Vì đây là vòng lặp while, khi không có sự kiện, nó nhận một mảng rỗng như đã thấy ở trên với các dấu ngoặc vuông rỗng [].

Giờ ta đã hiểu sơ bộ về việc gọi API và kết nối đến Real Time Messaging của Slack, giờ là lúc để xây dựng một Slack Bot đầy đủ chức năng.

Con Slack bot của tôi sẽ lắng nghe sự kiện bằng các dùnh hệ thống RT. Khi nó nhận một message event hướng thẳng đến con bo, ứng dụng của tôi đến người dùng vơii môt command nó được nhận.

Xây dựng Slack Bot

Để xây dựng một bot đầy đủ, nó đòi hỏi khá nhiều mã. Để giúp tổ chức và đơn giản hóa mã cuối cùng, tôi sẽ chia chức năng thành ba lớp khác nhau: Bot, Event và Command.. Những class này có thể mở rộng trong chính ủng dụng, cải thiện tinh năng của bot của bạn. Hãy khám phá mục đích của mỗi class này.

  1. Class Bot sẽ có trách nhiệm kết nối với Slack và sẽ bắt đầu vòng lặp để lắng nghe các sự kiện.
  2. Class Event có trách nhiệm đọc các sự kiện nhận được từ Slack, phân tách chúng ra để chỉ xử lý các sự kiện tin nhắn được nhằm trực tiếp đến bot của chúng tôi. Khi một thông báo được nhận, nó sẽ gọi class Command và gọi API với phản hồi từ class Command.
  3. Class Command sẽ nhận được văn bản từ event và cung cấp một thông báo tùy chỉnh dựa trên command nhận được. Thông báo này sau đó sẽ được gửi trở lại lớp Sự kiện Slack nguồn có nguồn gốc được gửi đến kênh gốc của tin nhắn.

Khởi tạo Slack Bot

Tôi đã đề cập trước đó rằng điểm khởi đầu ứng dụng Python của tôi được đặt trong file slackbot.py. Tập tin này là cái khung tối thiểu để có được ứng dụng hoạt động mà là để nhanh chóng lớp Bot sẽ xử lý phần còn lại của quá trình:

Tạo class Bot

Class Bot là tâm điểm của phần cấu hình và cài đặt Bot. Hãy xem toàn bộ class Bot tôi đặt trong file bot.py:

File bắt đầu bằng việc import những thư viện cần thiết: time, event và SlackClient. Thư viện event sẽ được tạo ra kế tiếp.

Với thư viện đã được import, class Bot được tạo ra. Constructor của class trong hàm __init__ thiết lập một vài biến số mới được sử dụng trong suốt phần còn lại của code. Nó gồm có slack_client, bot_namebot_id.

Tên của bot được dùng để tìm ID của bot. ID sẽ được dùng sau này để phân tích sự kiện dành trực tiếp cho bot. Nếu ứng dụng không thể tìm thấy bot, ứng dụng sẽ xuất hiện với một lỗi vì nó không thể tiến hành mà không có ID.

Class Event sau đó được khởi tạo để được sử dụng sau đó một chút sau đó trong class. Điều cuối cùng mà constructor thực hiện là gọi hàm listen, kết nối với hệ thống RTM và bắt đầu vòng lặp bất tận chờ các sự kiện mà bot sẽ xử lý.

Hàm tiếp theo, get_bot_id, khá giống với ví dụ đầu tiên chạy vòng lặp qua những user, lần này tìm ID của bot bằng cách tìm tên của nó trong danh sách người dùng và trả lại ID. Trong sự kiện không thể tìm thấy bot, None được trả về, điều này sẽ làm cho code trước dừng xử lý ra vì nó không thể tìm thấy bot.

Hàm cuối cùng trong class Bot là hàm listen đã nói ở trên. Hàm này trông rất giống với ví dụ thứ hai, nơi chúng tôi lần đầu tiên kết nối với hệ thống RTM của Slack. Sự khác biệt trong ví dụ này là nó gọi hàm wait_for_event sẽ được khám phá tiếp theo trong class Event.

Đã hoàn tất class Bot, nó đảm nhận việc tạo ra SlackClient và bắt đầu vòng lặp vô hạn để chờ sự kiện. Tuy nhiên nó không làm gì với những sự kiện đó, nó để trách nhiệm này cho class Event.

Class Event

Mục đich của class Event là đọc bất kỳ sự kiện nào trả về từ hệ thống RTM của Slack. Mỗi sự kiện được nhận sẽ được kiểm tra cho một thông điệp chứa tham chiếu đến ID của Bot. Sau đây là class Event mà tôi đã đặt bên trong file event.py:

Class này bắt đầu bằng việc import class sau cùng sẽ được khám phá, class Command. Constructor của class Event nhận một tham số: một tham chiếu đến Bot object. Đối tượng này được lưu trong một biến có thể truy xuất bởi những hàm khác trong class. Bên trong hàm __init__ môt biến số khác được tạo để khởi tạo class Command đã được import trước đó.

Hàm tiếp theo, wait_for_event, là hàm được gọi bởi hàm listen của Bot. Hàm này đọc bất kỳ sự kiện đã được nhận từ hệ thống RTM của Slack. Hàm rtm_read() trả về một mảng các sự kiện. Hàm wait_for_event kiểm tra nếu trong mảng có chứa bất kỳ sự kiện nào. Nếu có, các sự kiện sẽ được tuần hoàn thực hiện và gọi hàm cục bộ của Event parse_event.

Hàm parse_event nhận sự kiện làm dữ liệu đầu vào. Nó tiếp tục kiểm tra một thuộc tính trong sự kiện gọi là text. Nếu thuộc tính này tồn tại, nó sẽ kiểm tra thuộc tính text này có chưa một tham chiếu đến Bot ID của chúng ta. Khi điều kiện này là true, hàm này gọi hàm cuối cùng trong class này. hàm handle_event.

Trước khi gọi hàm handle_event, thuộc tính text sử dụng hàm split của Python. phân cách của chuỗi được đại diện bằng bot ID. Nó chuyển thuộc tính text sang thành một mảng. Thành phần đầu tiên của mảng là một chuỗi chứa nội dung với ID của bot. Thành thứ hai chứa lời nhắc nhở của thông điệp. Thành phần này được truyền đển hàm được đề cập ở phía trên handle_event như một câu lệnh.

Hàm sau cùng, handle_event, nhận 3 thuộc tính: user - người gửi thông điệp, command - thông điệp được gửi đi, và channel - kênh thông điệp được gửi vào.

Hàm handle_event bảo đảm rằng command và channel chứa những giá trị hợp lệ. Khi chúng hợp lệ, một thông điệp thân thiện được xuất ra trên console để chỉ ra lệnh đã được nhận, nó đã được gửi đến channel, và user đã gửi nó đi.

Sau thông tin thân thiện, hàm handle_event gọi hàm chính từ class Command đề cập trước đó. Kết quả của hàm này được sử dụng bởi hàm handle_event qua việc gọi API để đăng tải phản hồi từ hàm của class Command đến channel mà nó muốn khởi tạo sự kiện.

Hãy xem class Command để thấy cách nó phát sinh một phản hồi dựa trên lệnh đã nhận từ người dùng.

Class Command

Để hoàn tất con bot của chúng ta, giờ là lúc tạo ra class sau cùng, Command, trong một file có tên gọi command.py:

Tôi thực sự thích class này bởi vì nó cung cấp một nền tảng vững vàng có thể mở rộng để xử lý nhiều lệnh hơn tôi trình bày ở trên.

Constructor cho class Command tạo ra một từ điển các keys với một tên hàm đi kèm sẽ được thực hiện khi lệnh nhận được từ class Event. Trong ví dụ ngắn gọn trên, từ điển commands chưa hai lệnh: jump và help. Từ điển này có thể được mở rộng để chứa những lệnh khác bạn muốn để xử lý với bot của riêng bạn.

Hàm tiếp theo, handle_command, là hàm được gọi khi một sự kiện thành công, nó chưa một thông điệp trực tiếp đến con bot của chúng ta, được gọi từ class Event qua hàm handle_event.

Hàm handle_command nhận hai tham số: user - người gửi thông điệp và command. Hàm bắt đầu bằng việc xây dựng một chuỗi phản hồi sẽ gửi trực tiếp một thông điệp đến user - người đã gửi thông điệp tới. Sau đó hàm kiểm tra command nhận được là một command hợp lệ trong từ điển command được định nghĩa trong constructor.

Khi command này hợp lệ, hàm có tương tác với lệnh sẽ được gọi, gán chuỗi vào biến response được tạo ra trước đó.

Nếu lệnh không tồn tại, response sẽ đươc gán vào để thông báo command không hợp lệ. Nó cũng gọi hàm help của command để hướng dẫn user hiểu được command nào được bot hỗ trợ.

Những hàm còn lại, jumphelp, phát sinh một response tự biên tập, sẽ được gửi đến người dùng đã khởi phát lệnh này.

Như đã đề cập trong suốt constructor, từ điển commands có thể được mở rộng với một command mới. Để hoàn tất quá trình, một hàm đi kèm phải được tạo ra để tự động gọi bởi hàm handle_command.

Kiểm tra Slack Bot

Giờ tất cả phần code đã xong, đây là lúc kiểm tra bot của chúng ta. Để bắt đầu, chúng ta phải chạy script Python chính: slackbot.py: trong phần lệnh, xử lý script với Python, e.g: python slackbot.py

Điều này sẽ khởi chạy bot của chúng tôi và kết nối với hệ thống Real Time Messaging của Slack. Sau khi thành công, thông báo lỗi của chúng tôi sẽ được in vào bảng điều khiển cho thấy máy chủ Slack của chúng tôi đã sẵn sàng để nhận các lệnh.

Để xử lý một lệnh, bot của chúng tôi cần được mời vào một kênh public hoặc private. Một khi bot đã vào kênh, một user có thể giao tiếp nhờ bot giúp đỡ. Trường hợp của tôi sẽ là: @jamietest jump. Bot sẽ phản hồi: @endyourif: Kris Kross will make you jump jump.

Con bot không bị giới hạn trong một kênh. Bởi vì nó phân tích ra tên kênh trong thông tin của sự kiện. Nó có thể xử lý các lệnh từ nhiều kênh khác nhau.

Giờ đến lượt bạn trải nghiệm bot của bạn và hãy xem bạn có thể khiến nó làm gì!

Tổng kết

Con bot của tôi đã hoàn tất. Hy vọng tôi đã cho bạn thấy sức mạnh của việc tạo một con bot ra sao. Với những class (Bot, Event và Command) mỗi loại xử lý một vấn đề, class Command có thể được mở rộng để xử lý nhiều lệnh hơn.

Để xem toàn bộ mã nguồn, tôi đã tạo một Github Repository.

Hãy nhờ đừng e ngại khi tìm xem chúng tôi có những gì để bán và học được từ Envato Market, và đừng chần chừ cho bất kỳ câu hỏi nào và cung cấp những phản hồi có giá trị của bạn bằng cách sử dụng feed bên dưới.

Không có giới hạn nào trong việc mở rộng con bot này. Bên dưới là một danh sách ngắn những ý tưởng để mở rộng thiết lập ban đầu của các class:

  • Để bổ sung một lênh mới, bạn sẽ tạo ra một hàm mới dựa theo hình mẫu của hàm jumphelp bên trong class Command. Khi hàm được tạo ra, nó cần được bổ sung vào từ điển của các câu lệnh.
  • Một cách tốt khác để cải tiến hơn nữa con bot của bạn là mở rộng chức năng của hàm parse_event trong class Event. Hiện thời, hàm này đang tìm một thông điệp sự kiện có chứa Bot ID của chúng ta trong nội dung. Hàm này có thể mở rộng hơn để tìm các sự kiện khác, như là team_join. Sự kiện này có thể gọi một command mới (trong class Command) để cung cấp cho thành viên trong nhóm những chính sách và tài liệu nhập môn đào tạo của công ty của bạn.
  • Cuối cùng, nếu bạn hứng khởi với việc tạo một ứng dụng riêng hoặc mong muốn tạo những Slack Commands riêng cho bạn, bạn có thể khám phá việc xây dựng một ứng dụng riêng và bổ sung một bot user vào ứng dụng. Rất nhiều ví dụ code hoạt động phù hợp với từng loại bot.

Tôi hy vọng bạn đã tận hưởng bài viết này trong việc tạo một Slack Bot bằng Python. Hãy để bình luận ở bên dưới để các bạn đọc biết bạn đã mở rộng ví dụ trên để tạo một Slack Bot mạnh mẽ ra sao nhé!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.