+4

Sử dụng gem Chatwork trong Rails

Lời mở đầu

Hiện nay chúng ta sử dụng chatwork rất nhiều trong công việc, có lúc bạn cần gửi tin nhắn hàng ngày một cách tự động với mục đích nào đó (thông báo thời gian quẹt thẻ hàng ngày, thông báo lỗi phát sinh từ hệ thống .vv..) Sử dụng gem Chatwork giúp bạn làm được điều đó. Dưới đây mình có làm demo gửi thông báo đến chatwork về thời gian quẹt thẻ của mọi người đến 1 nhóm chat cụ thể

Cài đặt

Chúng ta thêm vàm Gemfile

gem 'chatwork'

Sau đó chạy

bundle install

Như vậy gem chatwork đã được cài đặt Ta sử dụng nó bằng cách

require "chatwork"

# Tạo một message vào nhóm có id là 1234
ChatWork.api_key = "XXX"
ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")

Ta sẽ được kết quả: Để lấy được api key thì ta vào đây để đăng kí lấy api. Sau khoảng 1 tuần tài khoản chatwork của bạn sẽ xuất hiện 1 tab API trong Personal Settings. Nhập mật khẩu api key sẽ hiện ra. Lưu ý k được để lộ api key vì người khác có thể dùng api key đó mạo danh bạn.

Để lấy được id của nhóm chat thì ta vào nhóm đó rồi nhìn trên đường link. Các số sau chữ id là id của nhóm đó. Ví dụ đường link là: https://www.chatwork.com/#!rid51494898 thì id sẽ là 51494898 Thật dễ dàng để tạo tin nhắn phải không.

Get thông tin từ chatwork

  • Để lấy thông tin tất cả nhóm chat ta tham gia ta dùng câu lệnh ChatWork::Room.get. Kết quả sẽ trả về một mảng thông tin của các nhóm chat.
 [{"room_id"=>45269978,
  "name"=>"ABC developers ",
  "type"=>"group",
  "role"=>"member",
  "sticky"=>true,
  "unread_num"=>1,
  "mention_num"=>0,
  "mytask_num"=>0,
  "message_num"=>27674,
  "file_num"=>114,
  "task_num"=>0,
  "icon_path"=>"https://appdata.chatwork.com/icon/451/451074.rsz.gif",
  "last_update_time"=>1492995821},
 {"room_id"=>51494898,
  "name"=>"ABC Family",
  "type"=>"group",
  "role"=>"member",
  "sticky"=>true,
  "unread_num"=>0,
  "mention_num"=>0,
  "mytask_num"=>0,
  "message_num"=>31476,
  "file_num"=>463,
  "task_num"=>21,
  "icon_path"=>"https://appdata.chatwork.com/icon/511/511687.rsz.png",
  "last_update_time"=>1492995675},
 {"room_id"=>57145326,
  "name"=>"ABC Emoji Team",
  "type"=>"group",
  "role"=>"admin",
  "sticky"=>true,
  "unread_num"=>0,
  "mention_num"=>0,
  "mytask_num"=>0,
  "message_num"=>10083,
  "file_num"=>160,
  "task_num"=>0,
  "icon_path"=>"https://appdata.chatwork.com/icon/598/598720.rsz.jpg",
  "last_update_time"=>1492965230},
 {"room_id"=>64525173,
  "name"=>"Framgia Ruby all",
  "type"=>"group",
  "role"=>"member",
  "sticky"=>true,
  "unread_num"=>0,
  "mention_num"=>0,
  "mytask_num"=>0,
  "message_num"=>849,
  "file_num"=>6,
  "task_num"=>0,
  "icon_path"=>"https://appdata.chatwork.com/icon/680/680809.rsz.png",
  "last_update_time"=>1492948957}]
  • Để lấy thông tin cá nhân ta gọi ChatWork::Room.get.me
{"account_id"=>1616992,
 "room_id"=>41518211,
 "name"=>"Vu Thi Ngoc",
 "chatwork_id"=>"3010",
 "organization_id"=>764965,
 "organization_name"=>"Framgia Vietnam",
 "department"=>"Division 2",
 "title"=>"Ruby developer",
 "url"=>"",
 "introduction"=>"",
 "mail"=>"ngocvu123@gmai.com",
 "tel_organization"=>"",
 "tel_extension"=>"",
 "tel_mobile"=>"0988222333",
 "skype"=>"",
 "facebook"=>"ngocvu.uet94",
 "twitter"=>"",
 "avatar_image_url"=>"https://appdata.chatwork.com/avatar/1133/1133838.rsz.jpg"}
****
  • Lấy thông tin của người trong một nhóm chat ta dùng lệnh: ChatWork::Member.get(room_id: "51494898") Kết quả trả về là 1 mảng danh sách info của cả nhóm
[{"account_id"=>637911,
  "role"=>"admin",
  "name"=>"Nguyen Thi Ngoc",
  "chatwork_id"=>"",
  "organization_id"=>157080,
  "organization_name"=>"Framgia Vietnam",
  "department"=>"2",
  "avatar_image_url"=>"https://appdata.chatwork.com/avatar/186/186001.rsz.jpg"},
 {"account_id"=>950525,
  "role"=>"admin",
  "name"=>"Dinh Hoang Long",
  "chatwork_id"=>"dinhhoanglong91",
  "organization_id"=>69570,
  "organization_name"=>"Framgia Vietnam",
  "department"=>"System Development 2 / Section 1 / Group 2",
  "avatar_image_url"=>"https://appdata.chatwork.com/avatar/392/392371.rsz.jpg"},
 {"account_id"=>1039197,
  "role"=>"member",
  "name"=>"fksfkjsdkfdskj",
  "chatwork_id"=>"",
  "organization_id"=>381934,
  "organization_name"=>"Framgia Vietnam",
  "department"=>"New Business Development",
  "avatar_image_url"=>"https://appdata.chatwork.com/avatar/ico_default_red.png"},
 {"account_id"=>1072041,
  "role"=>"member",
  "name"=>"Nguyen Thi Hong Nhung",
  "chatwork_id"=>"",
  "organization_id"=>401444,
  "organization_name"=>"Framgia Việt Nam",
  "department"=>"Division 2/ QA sec 2",
  "avatar_image_url"=>"https://appdata.chatwork.com/avatar/558/558349.rsz.jpg"},
 {"account_id"=>1079357,
  "role"=>"admin",
  "name"=>"Nguyen Van Nam",
  "chatwork_id"=>"namnv609",
  "organization_id"=>69570,
  "organization_name"=>"Framgia",
  "department"=>"Division 2",
  "avatar_image_url"=>"https://appdata.chatwork.com/avatar/808/808027.rsz.jpg"}]

Giờ ta làm một demo mang tính thực tế có thể sử dụng được dùng gem chatwork

Demo gửi thông báo đến chatwork

Hằng ngày chúng ta phải kiểm tra thời gian check in check out, nếu có thể tự động nó bằng cách gửi tự động thông báo thời gian quẹt thẻ thì sẽ rất tiện lợi, tiết kiệm rất nhiều thời gian Bước 1: Cài đặt gem chatwork như trên Bước 2: Cài đặt gem google driver cho phép chúng ta có thể đọc file lấy nội dung từ spreadsheets bất kì. Bạn có thể tham khảo cách cài đặt tại Đây Đây là đoạn code mình sử dụng

class SendNotificationService
  require "chatwork"

  PERSONS = ["Vũ Thị Ngọc", "Mai Đình Phú", "Nguyễn Văn Nam", "Nguyễn Văn Trường",
    "Nguyễn Văn Hiển"]
  class << self
    def execute
     # Khai báo api key của chat work
      ChatWork.api_key = Settings.config.api_key
      # Khai báo đường link mà bạn muốn lấy thông tin
      sheet_url = Settings.config.sheet_url
      session = GoogleDrive::Session.from_config("config.json")
      # Lấy thông tin của sheet
      sheet = session.spreadsheet_by_url(sheet_url).worksheets[1]
      # Lấy ra tất cả các thông tin theo hàng trong sheet
      rows = sheet.rows
      # Khởi tạo mảng chứa tất cả các dữ liệu muốn lấy
      timesheets = []
      # Khởi tạo message để gửi đến chatwork
      messages = "[To:1079357] [To:1614638][To:1385456][To:1567299]
        [info][title]Timesheet at #{Time.now.to_date.to_s}[/title][code]"
      # Lấy dữ liệu
      rows.each do |row|
        if PERSONS.include? row[2]
          timesheets << row
        end
      end
      # Tạo message
      timesheets.each do |sheet|
        person_timesheet = sheet.from(2).take(42).reject(&:empty?).join(" |")
        messages += "#{person_timesheet}
          +-----+----------------+---------------------------+-------
          -------+------------+-----------+------------+-----------+"
      end
      messages += "[/code][/info]"
       # Gửi mesage đến chatwork
      ChatWork::Message.create(room_id: 41518211, body: messages)
    end
  end
end

Gọi

SendNotificationService.execute

Ta sẽ được kết quả

Để gửi thông báo một cách tự động ta dùng gem whenever. Bạn có thể tìm hiểu qua docs

Hi vọng bài viết có thể giúp ích cho bạn! :p Source code: https://github.com/ngocvu3010/demo_send_notification_chatwork


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí