Sử dụng gem google_drive và chatwork để làm demo gửi notification

Dạo gần đây mình có tìm hiểu về gem google-drivechatwork api và làm một demo nho nhỏ về việc đọc timesheet(google spreadsheet) và gửi notification lên chatwork qua chatwork api, sau đây mình xin chia sẻ với mọi người về các bước cần làm để có thể hoàn thành demo này.

1.Gem google_drive

Setting.

Để có thể sử dụng gem này, bạn cần add gem vào Gemfile và chạy bundle

gem 'google_drive', '~> 2.1.2'

ở đây, hãy nhớ chỉ định version cho gem, nếu như để mặc định như hướng dẫn ở trong doc, chúng ta sẽ cài được version cũ hơn và có nhiều function còn thiếu. Đây là trang mọi người có thể follow để có thể cài đặt và sử dụng gem.

  • Trước tiên chúng ta cần tạo client_idclient_secret theo hướng dẫn tại đây

  • Với 2 thông tin client_idclient_secret vừa lấy được ở trên, ta tạo file config.json để lưu 2 thông tin ấy như sau:

{
  "client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
  "client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx"
}

Tạo một session object bằng lệnh:

session = GoogleDrive::Session.from_config("config.json")

Trong lần đầu tiên chạy lệnh trên, nó sẽ tạo cho ta thông tin xác thực và lưu vào file config.json .Từ lần thứ 2 trở đi, thông tin này sẽ được đem ra để sử dụng lại.Nó sẽ trông như thế này:

{
  "client_id": "xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
  "client_secret": "xxxxxxxxxxxxxxxxxxxxxxxx",
  "scope": [
    "https://www.googleapis.com/auth/drive",
    "https://spreadsheets.google.com/feeds/"
  ],
  "refresh_token": "1/12bsNUgIk-vXBeoc5eutsOYoQeO4zlOddTN64HyMwghHdoBU"
}

Google spreadsheet.

Bạn có thể tham khảo doccument của GoogleDrive::SessionGoogleDrive::Spreadsheet tại ĐâyĐây

Để đọc được file spreadsheet, tất nhiên là ta cần 1 file spreadsheet có quyền đọc, ta tạo 1 session object bằng lệnh sau:

session = GoogleDrive::Session.from_config("config.json")

Get sheet mong muốn:

sheet = session.spreadsheet_by_url(sheet_url).worksheets[1]

Ở đây, mình dùng spreadsheet_by_url để get list worksheets, ngoài ra, còn có thể dùng spreadsheet_by_key hoặc spreadsheet_by_title để làm việc ấy.

Sau khi get được worksheet mong muốn, ta có thể follow theo doc sau để dùng những hàm có thể thao tác với worksheet, Đối với thao tác chỉ đọc file, thì có 2 hàm mình dùng là

#num_rows : Row number of the bottom-most non-empty row.

#num_cols : Column number of the right-most non-empty column.

2.Gem chatwork

Get Chatwork API

Đầu tiên ta vào link này để đăng ký sử dụng api chatwork. Sau 1 khoảng thời gian ngắn thì ta có thể get api chatwork trong phần Chatwork/Personal Settings

  • Điền password vào khung trên ta sẽ nhận được API để sử dụng để gửi message.

Gửi message.

Add vào Gemfile

gem 'chatwork'

và chạy

Bundle

để cài đặt gem. Với API đã có được ở trên thì việc sử dụng gem để gửi message hết sức đơn giản như sau: require "chatwork" trong file muốn sử dụng.

require "chatwork"

Khởi tạo:

ChatWork.api_key = "XXX"

và gửi message bằng lệnh sau:

ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")

Cụ thể, để có thể lấy được room_id hay một số hàm khác của gem thì bản có thể đọc bài viết sau

Dưới đây là đoạn code mình dùng để thực hiện đọc spreadsheet và gửi message lên chatwork:

class ReadSpreadSheetService
  require "chatwork"
  DEFAULT_COLUM = 2

  class << self
    def read_file
      ChatWork.api_key = Settings.chatwork.api
      session = GoogleDrive::Session.from_config("config.json")
      sheet_url = Settings.drive.sheet_url
      sheet = session.spreadsheet_by_url(sheet_url).worksheets[1]
      num_rows = sheet.num_rows
      (3..num_rows).map do |row|
        mapping_hash.each do |key, value|
          if sheet[row, DEFAULT_COLUM] == key.to_s
            message = "[TO:#{value}]\n#{sheet.rows[row-1].join(', ')}\n\n"
            ChatWork::Message.create(room_id: 57145326, body: message)
          end
        end
      end.compact
    end

    private
    def mapping_hash
      chatwork_hash = {
        "B120184": "1079357",
        "B120485": "1614638",
        "B120484": "1616992",
        "B120288": "1385456"
      }
    end
  end
end

Tham Khảo

  1. https://github.com/gimite/google-drive-ruby
  2. https://github.com/asonas/chatwork-ruby