ChatWork APIを使って定期投稿を自動化する

はじめに

弊社では主なコミュニケーションツールとしてChatWorkを利用しています。業務連絡ももちろん、部活動(弊社にはフットサル部やランニング部、雪山部、自転車部などがあります!)や、待ち合わせ連絡、タスク管理など、様々な用途で使っています。

その中には、必ず定期的に投稿する内容があります。例えば以下のようなものです。

  • 毎週末のオフィスクリーンの開始時刻
  • 週次定例会の開始時刻
  • 毎週水曜日のランニング部の部活動開始予告
  • 月末の経費精算手続きの進捗確認

こんな内容をわざわざ手動で投稿するのはアホらしいので、チャットワークAPIを使って自動化することにしました。

注意

チャットワークAPIドキュメントサイトにも書いてある通り、現時点ではプレビュー公開となっていますので、利用する際には申請が必要です。

やってみる

APIトークンの取得

APIトークンの取得はChatWorkの動作設定から行います。「API発行」タブで、アカウントのパスワードを入力して[表示]ボタンをクリックします。

cw01

するとAPIトークンが表示されますので、この文字列をメモしておきます。

cw02

チャットワークAPIを使うポイント2つ

チャットワークAPIを使うポイントは以下の2つです。

  1. エンドポイントへの接続はHTTPSで行うこと。
  2. APIトークンはX-ChatWorkTokenというHTTPリクエストヘッダにセットすること。

あとは普通のHTTP通信と変わり有りません。

ルームIDを確認する

チャットワークAPIを使って特定のルームに投稿するためには、ルームIDが必要になります。まずはルームIDの一覧を取得してみます。

require 'rss'
require 'net/https'
require 'json'

CW_API_TOKEN = "edit_your_api_token_strings"

def get_room
  uri = URI('https://api.chatwork.com/v1/rooms')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  header = { "X-ChatWorkToken" => CW_API_TOKEN }
  body = nil

  res = http.get(uri, header)
  puts JSON.parse(res.body)
end

get_room

実施結果は以下のようになります。

{"room_id"=>1234567, "name"=>"AWSコンサルティング部", "type"=>"group", "role"=>"admin", "sticky"=>true, "unread_num"=>0, "mention_num"=>0, "mytask_num"=>0, "message_num"=>1234, "file_num"=>1, "task_num"=>2, "icon_path"=>"", "last_update_time"=>1409895998}
{"room_id"=>12345678, "name"=>"アプリケーションサービス部", "type"=>"group", "role"=>"admin", "sticky"=>true, "unread_num"=>0, "mention_num"=>0, "mytask_num"=>0, "message_num"=>1234, "file_num"=>0, "task_num"=>6, "icon_path"=>"", "last_update_time"=>1409895524}
{"room_id"=>123456789, "name"=>"管理部", "type"=>"group", "role"=>"admin", "sticky"=>false, "unread_num"=>1, "mention_num"=>0, "mytask_num"=>0, "message_num"=>1234, "file_num"=>0, "task_num"=>3, "icon_path"=>"", "last_update_time"=>1409896246}

これでルームIDが確認出来ました。

ルームにメッセージを投稿する

次に、ルームIDを指定して特定のルームにメッセージを投稿してみます。

require 'rss'
require 'net/https'
require 'json'

CW_API_TOKEN = "edit_your_api_token_strings"
ROOM_ID = "1234567"

def post_cw(data)
  uri = URI('https://api.chatwork.com/v1/rooms/' + ROOM_ID + '/messages')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  header = { "X-ChatWorkToken" => CW_API_TOKEN }
  body = "body=" + URI.encode(data)

  res = http.post(uri, body, header)
  puts JSON.parse(res.body)
end

post_cw(ARGV[0])

で、引数で投稿したい内容を付与して実行します。戻り値はこんな感じで、メッセージIDが返ってきます。

$ ruby ./cw.rb テスト
{"message_id"=>0987654321}

そしてルームを確認すると、ちゃんと投稿されています!

_1_KDDI_ChatWork_-_札幌オフィス

あとはcronで回すだけです!

まとめ

これでみんなちゃんと遅れずに経費精算出来ますね!