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-drive và chatwork 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 ...
Dạo gần đây mình có tìm hiểu về gem google-drive và chatwork 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_id và client_secret theo hướng dẫn tại đây
-
Với 2 thông tin client_id và client_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::Session và GoogleDrive::Spreadsheet tại Đây và Đâ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.
và
#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}] #{sheet.rows[row-1].join(', ')} " 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
- https://github.com/gimite/google-drive-ruby
- https://github.com/asonas/chatwork-ruby