Web Development

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

1. Bài toán

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.

2. Cách thức hoạt động

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

3. Cài đặt

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)\nMessage in #{room_name}:\n#{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 \nMessage in #{room_name}:\n#{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ò 😂😂


ChatWork::Message.create room_id: destination_room_id, body: body

sẽ tiến hành gửi tin nhắn

Deploy app lên Heroku

Cái này chắc ai cũng biết rồi, mình không nói lại nữa. Sau khi deploy chúng ta sẽ có đường dẫn của app

Cài đặt các biến môi trường

Để cho đỡ phải tạo ra cơ sở dữ liệu thì mình dùng biến môi trường, bởi 1 app này chỉ nên 1 người dùng, không nên lưu lại các token vào cơ sở dữ liệu làm gì, rất nguy hiểm

Ta lần lựot cài đặt các biến môi trường bằng lệnh heroku config:set TÊN_BIẾN=[giá trị biến]

Tên biến là tên biến môi trường mà ta muốn cài đặt, ta lần lựot cài đặt các biến token của tài khoản chính, phụ, room id của 2 tài khoản

Cài đặt webhook

Tại trang API setting ban nãy, ta chọn Webhook ở bên trái. Document của webhook ta có thể đọc tại đây Docs của Webhook có nói rằng, khi có event thì một request POST sẽ được gửi đến link webhook. Ở rails app ta đã cài đặt một PostController /cws (cws#create), vì vậy ta điền vào webhook như sau: với app_url là đường dẫn app mà bạn đã deploy lên heroku, event là account event, mention to you, tức là ta sẽ chỉ nhận được tin nhắn khi có người mention đến mình (to, to all, reply,...)

Cài đặt pindom để nó ping đến app

Các bạn vào pingdom.com, tạo tài khoản, sau đó tìm phần Uptime check, tạo 1 check đến trang web của mình là xong. Khá là đơn giản

4. Chạy thử app nào

Mình đã cài đặt xong app. 3 tài khoản là tài khoản chính, phụ và bot. Tài khoản chính đã full box, tài khoản phụ đang tham gia 1 số box, và con bot kết bạn với tài khoản chính. Thử gửi 1 tin nhắn đến tài khoản phụ (chat riêng hoặc chat trong room đều đựoc): Và ở tài khoản chính đã nhận được tin nhắn :v Thật tuyệt vời phải không các bạn

5. Kết

Trên đây là cách mình cài đặt một ứng dụng giúp forward tin nhắn dành cho người... nghèo, tuy chạy được nhưng cách giải quyết bài toán có phần tù tội, rất vui lòng nhận góp í của mọi người. (bow) Source code: https://github.com/itssomething/chatwork-rails

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration