13/01/2019, 00:29

Giải pháp hết box ChatWork dành cho người... nghèo

Những ai đang dùng ChatWork (mà không phải premium) đều sẽ gặp phải 1 vấn đề: Bạn chỉ được phép tham gia tối đa 14 chat box. Ngày xưa, khi full box, chúng ta có thể thoát 1 box để tham gia box khác. Tuy nhiên với sự thay đổi gần đây thì việc thoát box sẽ không làm giảm số lượng box chat đã ...

Những ai đang dùng ChatWork (mà không phải premium) đều sẽ gặp phải 1 vấn đề: Bạn chỉ được phép tham gia tối đa 14 chat box. Ngày xưa, khi full box, chúng ta có thể thoát 1 box để tham gia box khác. Tuy nhiên với sự thay đổi gần đây thì việc thoát box sẽ không làm giảm số lượng box chat đã tham gia của bạn, khiến cho những người dùng tài khoản free rất chi là đau khổ khi đã lỡ join nhiều box. Một giải pháp được đưa ra đó là lập 1 tài khoản khác để có thể tiếp tục sử dụng, nhưng nhưa thế sẽ phải check tin nhắn ở 2 tài khoản. Bài viết này sẽ giúp bạn set up 1 con bot đơn giản, forward các tin nhắn từ 1 tài khoản sang tài khoản còn lại.

Tech stack

  • Ruby on Rails - framwork web
  • gem chatwork - gem này cung cấp các phuơng thức để thao tác với ChatWork, nhưng chúng ta cũng chỉ cần phuơng thức gửi tin nhắn đi thôi, bạn có thể đọc docs tại đây
  • ChatWork API - api_token ta dùng để cài đặt khi sử dụng gem chatwork
  • ChatWork Webhook - sẽ gửi một request đến 1 đường dẫn đã cài đặt khi có một event xảy ra
  • Heroku - đuơng nhiên dùng để deploy app lên rồi ✌️
  • Pingdom - chắc hẳn ai cũng biết app heroku freee sau một thời gian không hoạt động thì sẽ được sleep, sẽ hoạt động lại khi có request đến app đó. Pingdom sẽ liên tục "ping" đến app heroku của chúng ta, ngăn nó vào trạng thái sleep :v

Mô tả cách hoạt động

2.2. Hướng dẫn

Tạo app Ruby on Rails

Cái này thì đơn giản rồi, ai cũng biết, ta chạy lệnh sau:

rails new cw-rails -T
cd cw-rails

Thêm vào Gemfile gem "chatwork" và chạy bundle install

Lấy API token

Tại phần profile (góc trên cùng bên phải), ta chọn API Setting

Trang API Setting hiện ra, ta nhập mật khẩu và nhấn Display để có đc API Token, ta lưu chuỗi này lại (để lần sau đỡ phải mở lại trang này ✌️ )

Và ta phải làm quá trình này 2 lần, mỗi lần cho 1 tài khoản

Tạo controller

Ta tiến hành tạo 1 controller rails g controller cws

Tại controller Cws, ta cài đặt như sau:

class CwsController < ApplicationController skip_before_action :verify_authenticity_token

def index render html: "index page" end

  def create
    # set up token
    ChatWork.api_key = ENV["FRAMGIA_ACCOUNT_TOKEN"]
    
    # get room id and body of the message
    room_id = params[:webhook_event][:room_id]
    body = params[:webhook_event][:body]

    # find room
    c = ChatWork::Room.find room_id: room_id
    room_name = c.name

    # set up some params
    destination_room_id = ENV["DESTINATION_ROOM_ID"]
    body = "[To:3056978] Vu Duc Manh (private)
Message in #{room_name}:
#{body}"

    # change token to bot's token
    ChatWork.api_key = ENV["BOT_TOKEN"]

    # create message from bot
    ChatWork::Message.create room_id: destination_room_id, body: body
    render status: 200
  end
end

Thêm vào routes.rb của app:

resources :cws

Giải thích 1 chút:

ChatWork.api_key

Sẽ cài đặt api_key cho ứng dụng, api key này cho phép chúng ta có quyền để thao tác với tài khoản chatwork có api key đó.

ChatWork.api_key = ENV["FRAMGIA_ACCOUNT_TOKEN"]

Sẽ cài đặt api key thành api token của tài khoản phụ

room_id = params[:webhook_event][:room_id]
body = params[:webhook_event][:body]

để lấy id của box chat mà bạn muốn lấy tin nhắn và nội dung tin nhắn

c = ChatWork::Room.find room_id: room_id
room_name = c.name

để lấy tên của room (box chat)

destination_room_id = ENV["DESTINATION_ROOM_ID"]
body = "[To:123456] Vu Duc Manh 
Message in #{room_name}:
#{body}"

đây sẽ xác định room mà tài khoản phụ gửi tin nhắn đến (chính là room private của acc chính và acc phụ) và nội dung của tin nhắn gửi về cho tài khoản chính. Dãy số sau To là id của người nhận, để người đó nhận được thông báo

ChatWork.api_key = ENV["BOT_TOKEN"]

cập nhật token thành token của tài khoản bot để ta có thể gửi tin nhắn từ tài khoản này

Thực ra đoạn này không cần thiết lắm, nếu bạn muốn tài khoản phụ gửi tin nhắn trực tiếp cho tài khoản chính, nhưng mình sẽ dùng 1 tài khoản thứ 3 để gửi, đặt tên nó là con bot cho xịn sò

0