12/08/2018, 16:55

Giới thiệu về gem "Slack Ruby Client"

Slack là một công cụ tuyệt vời cho việc trao đổi thông tin (chat/call), nó hỗ trợ nhiều nên tảng từ web, moblie và cả desktop cho người dùng có thể sử dụng tiện lợi bất cứ ở nơi đâu. Hiện tại khá nhiều người dùng/doanh nghiệp sử dụng slack là công cụ chính để trao đổi trong công việc, ngoài những ...

Slack là một công cụ tuyệt vời cho việc trao đổi thông tin (chat/call), nó hỗ trợ nhiều nên tảng từ web, moblie và cả desktop cho người dùng có thể sử dụng tiện lợi bất cứ ở nơi đâu. Hiện tại khá nhiều người dùng/doanh nghiệp sử dụng slack là công cụ chính để trao đổi trong công việc, ngoài những tính năng vượt trội thì Slack còn cung cấp khá đầy đủ các bộ Api/Web interface cho các nhà phát triển.

Mình xin giới thiệu tới mọi người về gem "Slack Ruby Client". Tác giả đã xây dựng gem dựa trên bộ api mà slack cung cấp, nhằm chuyển đổi cấu trúc api về đối tượng trong ruby để cho mọi người thao tác một cách dễ dàng hơn. Chủ đề này bao gồm 2 phần chính là "Slack Ruby Client" cho web api và Realtime messaging, nhưng ở bài viết này tôi chỉ giới thiệu chính về "Slack Ruby Client".

Gem này có thể giúp gì cho chúng ta

  • Chúng ta có thể gửi tin nhắn đến hệ thống slack thông qua web api và gửi nhận tin nhắn qua realtime api.
  • Nếu bạn đang muốn giảm tối đa lượng code và mục đích chỉ cần 1 dứng dụng cơ bản thì sử dụng gem này là tương đôi tốt (ngắn gọn, dễ hiểu)
  • Nếu bạn đang muốn xây dựng một ứng dụng đầy đủ bao gồm cả BOT và tích hợp button Slack thì hãy đọc và sử dụng kèm theo slack-ruby-bot và slack-ruby-bot-server

Cài đặt

Thêm đến Gemfile => gem 'slack-ruby-client' sau đó chạy bundle install

Sử dụng

Tạo Bot

Để sử dụng các api trong Slack chúng ta phải tạo 1 con Bot đại diện như là một người dùng. Link tạo bot tại đây Nhập username sau đó click button Add bot integration để hoàn thành. Tiếp khi tạo xong bot là màn hình có đầy đủ các thông tin như api_key, username, Icon và ngoài api-token thì các thông tin khác có thể customize bình thường. Chú ý đến api-token vì đây là key để xác thực truy cập vào slack từ Ruby.

Sử dụng API Token

Để sử dụng Thư viện Slack này trong ruby chúng ta phải khởi tạo thông tin của nó trong initializers như token, logger...

Slack.configure do |config|
  config.token = ENV['SLACK_API_TOKEN']
end

Đoạn code bên trên là cấu hình api-token để xác thực, chúng ta có thể lấy api-token trong con bot vừa tạo để cấu hình cho biến môi trường ENV['SLACK_API_TOKEN']

Web client

Slack Web Api cho phép chúng ta xây dựng ứng dụng để tương tác với nó.

  1. Test Auth(Kiểm tra xác thực)
    client = Slack::Web::Client.new
    client.auth_test
    
    #Token là đúng sẽ có kết quả như dưới:
    [2] pry(main)> client.auth_test
    => {"ok"=>true, "url"=>"https://framgiaworld.slack.com/", "team"=>"FRAMGIA", "user"=>"anhkhang2304", "team_id"=>"T7W7DF45P", "user_id"=>"U8YE62Z9T"}
    
  2. Gửi tin nhắn Gửi tin nhắn với method chat_PostMessage.
    [3] pry(main)> client.chat_postMessage(channel: '#kpro', text: 'Hello framgia', as_user: true)
    => {"ok"=>true, "channel"=>"C8YASUEUS", "ts"=>"1517023480.000018",  "message"=>{"type"=>"message", "user"=>"U8YE62Z9T", "text"=>"Hello framgia", "bot_id"=>"B8YE62YTF", "ts"=>"1517023480.000018"}}
    
    Sau khi gửi thành công chúng ta có thể kiểm tra kết quả như hình bên dưới.
  3. Kiểm tra danh sách channel Sử dụng method channels_list
    channels = client.channels_list.channels
    # Tìm channel có tên 'general' trong danh sách `channels` vừa list ở trên.
    general_channel = channels.detect { |c| c.name == 'general' }
    
  4. Upload File Sử dụng method files_upload
    client.files_upload(
      channels: '#general',
      as_user: true,
      file: Faraday::UploadIO.new('/path/to/avatar.jpg', 'image/jpeg'),
      title: 'My Avatar',
      filename: 'avatar.jpg',
      initial_comment: 'Attached a selfie.'
    )
    
  5. Lấy thông tin của channel Bạn có thể sử dụng ID của channel hoặc name với prefixed(Ký tự #).
    client.channels_info(channel: 'C04KB5X4D') #or
    client.channels_info(channel: '#general')
    
  6. Lấy thông tin của người dùng Giống như mục #5 bạn có thể dử dụng user_id hoặc prefixed(Nhưng với tìm kiểm user thì ta sẽ dử dụng prefixed với ký tự @)
    client.users_info(user: 'U092BDCLV') # or
    client.users_info(user: '@dblock') 
    
  7. Tìm kiếm người dùng Để xử dụng được tính năng này chúng ta cần add them gemfile picky
    client.users_search(user: 'anhkhang2304')
    
  • Chú ý: Có thể tham khảo thêm rất nhiều các api khác tại đây

  • Web Client Options: Ngoài config như ban đầu là token mình sẽ list thêm một số thuộc tính mà Slack hỗ trợ.

    Column 1 Column 2
    user_agent User-agent, default to Slack Ruby Client/version.
    proxy Optional HTTP proxy.
    ca_path Optional SSL certificates path.
    ca_file Optional SSL certificates file.
    endpoint Slack endpoint, default is https://slack.com/api.
    logger Optional Logger instance that logs HTTP requests.
    timeout Optional open/read timeout in seconds.
    open_timeout Optional connection open timeout in seconds.
    default_page_size Optional page size for paginated requests, default is 100.
    default_max_retries Optional number of retries for paginated requests, default is 100.

    Ví dụ:

    Slack::Web::Client.config do |config|
      config.user_agent = 'Slack Ruby Client/1.0'
    end
    client = Slack::Web::Client.new(user_agent: 'Slack Ruby Client/1.0')
    

    Ngoài cách khai báo khi initializer thì chúng ta cũng có thể chèn trực tiếp khi gọi các function qua đối tượng request.

    client.channels_list(request: { timeout: 180 })
    

Kết Luận

Bài viết trên đã giới thiệu cho mọi người về những api cơ bản trong slack và cách áp dụng nó trong ruby với gem. Trong phần tiếp theo mình rất hy vọng sẽ đi tiếp về giới thiệu các thuộc tính khác cần thiết hơn và kết hợp với RealTime Client.

Đây là bài mà mình đã học/dịch và làm ví dụ từ page chính thức của gem 'Slack Ruby Client'. Bài viết có thể chưa được hoàn chỉnh hoặc chưa rõ ý nên mình mong mọi người sẽ thông cảm và góp ý để bài viết thêm hoàn chỉnh hơn. Thanks!

0