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

Xây dựng một Slack Bot bằng Node.js

by
Length:LongLanguages:

Vietnamese (Tiếng Việt) translation by Na Dang (you can also view the original English article)

Slack sẽ nhanh chóng trở thành tiêu chuẩn mới cho ngành công nghiệp cho đội nhóm giao tiếp với nhau. Thực tế, Slack rất phổ biến đến mức khi tôi gõ slack vào Google, như tôi mong đợi, kết quả đầu tiên là định nghĩa của từ này trong từ điển. Theo sau kết quả này là website của Slack!

Điều này dường như bao giờ có trong số các từ thông dung nhất của từ điển Tiếng Anh. Thông thường, định nghĩa từ Google sẽ theo sau các website chuyên về từ điển.

Slack là gì?

Một cách cơ bản nhất, Slack là một hệ thống truyền/nhắn tin. Nó cho phép truyền tin trực tiếp để các thành viên trong nhóm và tạo các channel (kênh thông tin) cho phép giao tiếp và hợp tác đội nhóm dễ dàng theo thời gian thực. Để có nhiều thông tin hơn, bạn có thể xem các tính năng của Slack.

Vào thời điểm này, bạn sẽ tự hỏi khi nào Node.js sẽ xuất hiện. Như tôi đã đề cập, cơ bản, Slack là một hệ thống truyền thông tin; tuy nhiên, nó có thể được mở rộng và tuỳ chỉnh không giới hạn. Slack cung cấp một hệ thống cực kỳ linh hoạt để cải tạo phần tích hợp cho đội nhóm, gồm có:

  • Tạo ra những thông điệp chào đón tuỳ ý.
  • Tạo ra những emojis tuỳ ý.
  • Cài đặty những ứng dụng của bên thứ ba
  • Tạo ra ứng dụng của riêng bạn
  • Tạo ra những Slack bot tuỳ ý

Trong bài viết này, tôi sẽ trình bày cách tạo ra một Slack bot với Node.js mà có thể bổ sung vào của cấu hình Slack cho đội nhóm của bạn.

Các Slack Bot đã được xác định

Công việc của một Slack Bot là nhận các sự kiện từ Slack và xử lý chúng. Có rất nhiều sự kiện sẽ được gửi đến Slack Bot, và đây là lúc Node.js ra tay. Chúng ta không chỉ quyết định sự kiện nào cần được giải quyết, mà còn là cách giải quyết từng sự kiện như thế nào.

Ví dụ, một vài sự kiện thông dụng một Bot phải xử lý như:

  • member_joined_channel - thành viên gia nhập kênh
  • member_left_channel - thành viên rời kênh
  • message - thông điệp

Trong bài này, tôi sẽ tạo ra một ứng dụng Node.js và một Slack Bot có thể bổ sung vào nhóm dự án của bạn để thực hiện những nhiệm vụ cụ thể dựa trên sự kiện Bot nhận được.

Để bắt đầu, tôi cần tạo ra một con Bot trên Slack.

  • Một con Bot tự xây dựng
  • Tạo một ứng dụng và thêm mới một người dùng bot

Bài viết này sẽ tạo một con Bot bởi vì một người dùng ứng dụng bot sẽ phù hợp hơn nếu bạn dự tính viết và xuất bản một ứng dụng trên Slack. Tôi cân nhắc rằng con bot này chỉ cho team tôi dùng, nên một con bot tự xây dựng sẽ đủ đáp ứng.

Tạo ra một con Slack Bot

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

Hành động này sẽ đưa bạn đến một trang mới, bạn sẽ được yêu cầu cung cấp username cho bot của bạn. Gõ tên username vào, hãy chắc rằng bạn tuân theo hướng dẫn đặt tên của Slack. Khi bạn đã chọn một tên bot name ưng ý, nhấn Add bot configuration.

Sau khi tạo bot thành công, Slack điều hướng bạn đến trang cho phép điều chỉnh nhiều hơn con bot của bạn. Tôi sẽ để cho bạn thoã ý sáng tạo ở phần này. Điều duy nhất cần thiết từ trang này là API Token bắt đầu với xoxb-. Tôi sẽ copy token này vào một nơi an toàn để dùng sau này, hoặc giả sẽ để nguyên trang này cho đến khi chúng ta cần token của ứng dụng Node.js

Cấu hình

Trước khi chuyển sang phần code, cần cấu hình thêm 2 phần cho Slack:

  1. Tạo mới hoặc chọn một channel có sẵn cho bot tương tác. Trong khi tôi đang kiểm tra con bot mới, thì tôi đã tạo ra một channel mới. Hãy nhớ tên channel vì bạn sẽ cần nó bên trong ứng dụng sau đó.
  2. Thêm/Mời bot của bạn vào channel để bạn có thể tương tác với nó.

Bây giờ tôi đã cấu hình xong con Slack Bot của tôi. Đây là lúc tiếp tục với ứng dụng Node.js. Nếu bạn đã cài đặt Node.js rồi, bạn có thể thực hiện bước kế tiếp. Nếu bạn chưa cài Node.js, tôi đề nghị bạn đến trang download của Node.js và chọn bộ cài đặt cho hệ thống của bạn.

Với Slack Bot, tôi sẽ tạo ra một ứng dụng Node.js mới bằng lệnh npm init. Với một lệnh nhanh, được thiết lập đến nơi bạn muốn ứng dụng của bạn được cài đặt, bạn có thể dùng lệnh dưới đây:

Nếu chưa quen thuộc với npm init, lệnh này chạy một tiện ích để giúp bạn cấu hình cho dự án mới của bạn. Điều đầu tiên được hỏi là name. Mặc định là tên của tôi dùng cho slack bot, tôi thấy thoải mái với điều này. Nếu bạn muốn thay đổi tên ứng dụng của bạn, hãy đổi lúc này, còn nếu không, thì nhấn Enter để sang bước cấu hình tiếp theo. Lựa chọn tiếp theo là phiên bản và phần mô tả. Tôi để mặc định và tiếp tục nhấn Enter cho hai chọn lựa này.

Entry Points

Phần tiếp theo là entry point. Mặc định là index.js; tuy nhiên, nhiều người thích để app.js. Tôi không mong muốn tham gia cuộc tranh luận này, và ứng dụng của tôi sẽ không yêu cầu một cấu trúc chuyên sâu, tôi sẽ để theo mặc định là index.js

Sau khi bạn đã trở lại sau cuộc tranh luận, có thể là mãnh liệt như tabs so với spaces, thì hãy tiếp tục phần cấu hình, hỏi thêm vài câu hỏi khác:

  • test command
  • git repository
  • keywords - các từ khoá
  • author - tác giả
  • license - bản quyền

Với mục đích của bài viết này, tôi để các chọn lựa theo mặc định, Sau cùng, khi tất cả cấu hình hoàn thành, một xác nhận của package.json hiển thị để chắc bạn muốn tạo nó. Nhấn Enter để hoàn tất phần cấu hình.

Enter the SDK

Để tương tác với Slack dễ dàng hơn, tôi cũng sẽ cài đặt Slack Developer Kit Packacge như bên dưới:

Bạn đã sẵn sàng cho phần code chưa? Để bắt đầu, tôi dự định sẽ dùng code ví dụ từ trang wen của Slack Developer Kit, nó đưa một thông tin của slack bằng Real-time Message API (RTM) với vài điều chỉnh.

Với Entry point tôi đã chọn là index.js, đây là thời điểm tạo ra file này. Ví dụ từ Slack Developer Kit website có gần 20 dòng code. Tôi sẽ chia nhỏ vài dòng, chỉ để cho việc giải thích những dòng này rõ hơn. Nhưng chú ý rằng tất cả những dòng này nên nằm trong file index.js của bạn.

Đoạn code bắt đầu bằng 2 modules trong Slack Developer Kit:

RtmClient, khi được khởi tạo, sẽ là đối tượng bot của chúng ta, nó tham chiếu đến RTM API. CLIENT_EVENTS là các event mà bot sẽ lắng nghe.

Một khi những module được đính kèm, là lúc để khởi tạo và bắt đầu con Bot:

Hãy chắc rằng thay thế API Token với giá trị bạn có được khi tạo ra con Bot.

Gọi hàm start ở trên RtmClient của tôi sẽ khởi tạo session của bot. Điều này sẽ cố gắng xác thực bot của tôi. Khi bot của tôi đã hoàn tất kết nối với Slack, các sự kiện được gửi cho phép ứng dụng của tôi tiếp cận. Những sự kiện này sẽ được hiển thị ngay sau đây.

Với client đã khởi tạo, một biến channel được tạo ra để đặt vào trong một các sự kiện của CLIENT_EVENTS.

Biến channel sẽ được dùng để thực hiện các hoạt động cụ thể, như là gửi một thông điệp đến một channel mà con bot kết nối tới.

Khi RTM Session được khởi động (rtm.start();) và bot đã có một API Token hợp lệ, một thông điệp RTM.AUTHENTICATED sẽ được gửi đi. Những dòng kế tiếp lắng nghe sự kiện này:

Khi sự kiện RTM.AUTHENTICATED được nhận, đoạn code trước đó sẽ chạy cho vòng lặp qua danh sách các channel của Slack. Trong tình huống của tôi, tôi cụ thể tìm kiếm jamiestestchannel và chắc chắn rằng bot của tôi là một thành viên của channel đó. Khi gặp điều kiện đó, thì ID của channel được lưu trong biến channel.

Debugging

Để hỗ trợ debugging, một message console được ghi lại để hiển thị một thông điệp mô tả rằng con bot đã được xác thực thành công bằng cách hiển thị tên của nó (${rtmStartData.self,name}) và tên nhóm (${rtmStartData.team.name}) nó thuộc về.

Sau khi bot đã được xác thực, một sự kiện khác được kích hoạt (RTM.RTM_CONNECTION_OPENED) đã ra hiệu cho con bot được kết nối đầy đủ và có thể bắt đầu tương tác với slack. Các dòng code kế tiếp tạo ra bộ lắng nghe sự kiện; khi thành công, một thông điệp Hello! được gửi đến channel (trong tình huống của tôi, jamiestestchannel).

Lúc này, tôi có thể chạy ứng dụng Node và nhìn con bot của tôi tự động gửi một thông điệp mới cho channel của tôi.

Kết quả của việc chạy lệnh này (khi thành công) là gấp đôi:

  1. Tôi nhận được thông điệp báo lỗi xác định rằng con bot của tôi đã đăng nhập thành công. Điều này bắt nguồn từ RTM.AUTHENTICATED được kích hoạt sau khi khởi động RTM Client.
  2. Tôi nhận được một thông điệp Hello! trong channel Slack của mình. Điều này xảy ra khi RTM.RTM_CONNECTION_OPENED thông điệp event được nhận và xử lý bởi ứng dụng.

Trước khi đi đến bước tiếp theo và cải thiện ứng dụng của tôi, giờ là lúc để tổng kết lại tôi đã làm được gì cho đến lúc này:

  1. Đã tạo ra một con Bot Slack.
  2. Đã tạo ra một channel của Slack và mời con bot của tôi vào.
  3. Đã tạo ra một ứng dụng Node.js application gọi là slackbot.
  4. Đã cài đặt Slack Developer Kit package cho ứng dụng của tôi.
  5. Đã tạo file index.js; nó tạo ra RtmClient sử dụng API Token từ con bo slack của tôi.
  6. Đã tạo ra một phần lắng nghe sự kiện RTM.RTM_CONNECTION_OPENED, nó tìm Channel Slack, đó nơi mà con Slack Bot thuộc về.
  7. Đã tạo ra một event listener cho RTM.RTM_CONNECTION_OPENED, gửi một thông điệp Hello đến cho channel Slack của tôi.
  8. Đã gọi phương thức RTM Start Session để bắt đầu quá trình xác thực, được xử lý bởi những event listener mới của chúng tôi.

Xây dựng con Bot

Giờ là lúc cuộc vui thực sự bắt đầu. Slack cung cấp (tôi đã không đếm) ít nhất là 50 sự kiện khác nhau có sẵn cho con bot nghe và tuỳ ý xử lý. Bạn có thế từ danh sách các sự kiện của Slack, một vài sự kiện thường thấy ở RTM API (cái chúng ta đang sử dụng), trong khi những sự kiện khác thường có ở Events API. Ở thời điểm viết bài này, tôi nghĩ rằng Node.js SDK chỉ hỗ trợ RTM.

Để hoàn tất con bot, tôi sẽ xử lý phần event message, dĩ nhiên, đây là một trong số các event phức tạp nhất vì nó hỗ trợ một số lượng lớn sub-types, tôi sẽ khai thác chung ngay sau đây.

Đây là một ví dụ của một event message cơ bản trông thế nào từ Slack:

Trong object cơ bản, ba điều quan trong nhất tôi quan tâm là:

  1. Channel. Tôi sẽ muốn chắc rằng thông điệp này thuộc về channel mà con bot của tôi là một phần của nó.
  2. User. Điều này cho phép tôi tương tác trực tiếp với người dùng hoặc thực hiện một hành động cụ thể dựa người dùng là ai.
  3. Text. Đây có thể là một phần quan trong nhất khi nó chứa nội dung của thông điệp. Con bot của tôi sẽ chỉ muốn hồi đáp đến vài types nhất định của thông điệp.

Vài thông điệp phức tạp. Chúng có thể chứa rất nhiều thuộc tính phụ (sub-properties) như:

  • edited: Một object con mô tả người nào đã chỉnh sửa thông điệp và điều này xảy ra vào lúc nào.
  • subtype: Một String định nghĩ một trong những loại hình khác nhau, như là channel_join. channel_leave, ..v.v
  • is_starred: Một boolean cho biết một thông đệp đã được đánh sao (starred) hay chưa.
  • pinned_to: Một array (mảng) các channel mà thông điệp này được pin (đưa lên nhóm ưu tiên ~ ghim bài).
  • reactions: Một mảng các đôi tượng phản ứng, chúng xác định phản ứng nào xảy ra (ví dụ như facepalm - mặt thất vọng), nó xảy ra bao nhiêu lần, và một mảng người dùng có phản ứng theo cách đó với thông điệp.

Tôi dự định mở rộng file index.js đã tạo trước đó để nghe các sự kiện khác của thông điệp. Để giảm thiểu code thừa, ví dụ sau đây sẽ gồm có chỉ những phần code liên quan đến phần cải thiện cho message event.

Điều đầu tiên cần được thực hiện là kèm thêm một module mới cho RTM_EVENTS, tôi sẽ lắng nghe sự kiện này. Tôi đã để nó nằm bên dưới hai module trước đó:

Code để xử lý message event tôi sẽ để dưới cùng của file. Để kiểm tra phần message event hoạt động đúng, tôi đã tạo một event listener mới, nó sẽ ghi lại các message object vào console như sau đây:

Giờ tôi có thể chạy ứng dụng Node của mình (node index.js). Khi tôi gõ vào một thông điệp vào trong channel, những điều sau đây được ghi lại trong console của tôi:

Đến lúc này thì mọi chuyện vẫn ổn. Con bot của tôi đã nhận thông điệp rất thành công. Phần cải tiến tiếp theo là chắc chắn rằng thông điệp sẽ thuộc về channel của tôi:

Và khi tôi chạy ứng dụng của tôi, tôi chỉ thấy thông điệp debugging nếu message event dành cho channel có con bot của tôi hiện hữu.

Giờ tôi dự định mở rộng ứng dụng để gửi một thông điệp đến cho channel để chứng minh cách người dùng có thể được tag trong một thông điệp thế nào:

Bây giờ, khi bất cứ ai gõ một thông điệp trong channel, con bot gửi thông điệp của nó, trông như thế này: "Dừng lại, mọi người chú ý, @endyourif có điều muốn nói!"

Ok, không thực sự hữu dụng. Thay vào đó, tôi sẽ kết thúc con bot của mình bằng cách cải thiện event listener cho message để hồi đáp cho các lệnh cụ thể. Điều này sẽ được thực hiện bằng cách làm điều sau đây:

  1. Chia nhỏ text của một thông điệp thành một mảng dựa trên các khoảng trắng.
  2. Kiểm tra nếu index đầu tiên phù hợp với tên username của con bot.
  3. Nếu phù hợp, tôi sẽ xét tiếp index thứ hai (nếu nó tồn tại) và xem nó như một lệnh mà con bot phải thực hiện.

Để phát hiện dễ dàng việc này nếu con bot được đề cập, thì tôi cần tạo một biến mới sẽ lưu ID user của con bot. Bên dưới là phần cập nhật trong phần code mà trước đó tôi đã thiết lập biến channel. Giờ nó cũng lưu user ID của con bot trong một biến gọi là bot.

Với biến bot đã thiết lập, tôi đã hoàn tất con bot của mình bằng cách phát triển đầy đủ phần message event listener cho được tao ra trước đó thành như sau:

Đoạn code dưới đây chia nhỏ property của text của message object thành một mảng - chia cách bằng space (khoảng trắng). Tiếp theo tôi chắc chắn rằng tôi có ít nhất hai phần tử trong mảng, rất lý tưởng cho con bot và việc câu lệnh được thực hiện.

Khi phần tử đầu tiên trong mảng phù hợp với con bot, tôi thực hiện đoạn switch trên phần tử thứ hai trong mảng: phần command (câu lệnh). Các câu lệnh hiện hành được hỗ trợ là jumphelp. Khi một thông điệp được gửi đi đến channel trông như vậy "@jamiestest jump", con bot của tôi sẽ hồi đáp với một thông điệp đặc biệt cho người dùng đã phát thông điệp đó.

Nếu câu lệnh không được nhận ra, thì sẽ nó sẽ rơi vào trường hợp mặc định để tôi chuyển qua và hồi đáp với một câu lệnh chung giống như thế này: @endyourif, xin lỗi tôi không hiểu lệnh "hi". Để xem danh sách các lệnh được hỗ trợ, gõ @jamietest help".

Tổng kết

Lúc này, con Bot của tôi đã xong! Nếu bạn hứng thú với việc nâng cấp hơn cho con bot của bạn, đây là một danh sách ý tưởng:

  • Xử lý một thành viên mới gia nhập team bằng cách lắng nghe sự kiện team_join. Khi một thành viên mới tham gia, đây là một ý tưởng tuyệt vời để gửi cho họ một lượng thông tin hoặc các tài liệu đón chào họ đến với đội của bạn.
  • Cải thiện danh sách của những lệnh được hỗ trợ mà tôi đã bắt đầu.
  • Làm cho các command tương tác bằng cách tìm kiếm cơ sở dữ liệu, Google, YouTube,..v.v
  • Tạo một user bot trên một ứng dụng và tạo slash command của riêng bạn.
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.