ChatWorkのメッセージをSlackに通知するBotを作ってみた

こんにちは、入社1年目SEの佐藤です。

今回はChatWorkの投稿を定期的にSlackへ投稿するbotを作成したことについて書きたいと思います。

f:id:AdwaysEngineerBlog:20161125162837p:plain

最近、全社のチャットツールとしてChatWorkが導入されました。
しかし、エンジニア側ではChatWorkの導入前からSlackを使っていて、私自身もSlackのほうが使い慣れています。

二つのチャットツールを見るのはめんどくさい!Slackでメッセージを確認したい!

ということで、ChatWork側で投稿があればSlackに通知して、返信したいときだけChatWorkを使えばいいのではと思い、実際にやってみました。

ChatWork APIの申請

ChatWork APIを利用するにはチャットワークAPIの申請 から利用申請をします。会社のアカウントなど自分が管理者ではない場合は、ChatWorkの管理者に申請をおこなってもらってください。

ChatWork APIトークンの取得

申請が完了後、Chatwork APIドキュメントのページを参考にトークンを取得してください。取得したトークンはbot作成の際に使用するのでメモっておいてください。

f:id:AdwaysEngineerBlog:20161125162621p:plain

Slack APIトークンの取得

Slack APIのページからSlack APIのトークンを取得してください。
Slack APIのトークンもChatWork同様にbot作成の際に使用するのでメモっておいてください。
以下の画像ではすでに発行されているのですが、新規の場合は「Create token」を押せば発行されます。

f:id:AdwaysEngineerBlog:20161125162633p:plain

Google Apps Scriptの作成

今回はGoogle Apps Scriptで書いていきます。 GoogleDriveの新規からGoogle Apps Scriptを選択します。項目がない場合は、「アプリを追加」でGoogle Apps Scriptを検索して追加すると表示されるようになります。

f:id:AdwaysEngineerBlog:20161125162641p:plain

これが最初に表示される画面です。このファイルにjavascriptでコードを記述していきます。

f:id:AdwaysEngineerBlog:20161125162704p:plain

ChatWorkから新規メッセージの取得

まず、ChatWorkからメッセージを取得する処理を書きました。

function getMessage(){
  var params = {
    headers : {"X-ChatWorkToken" : '自分のChatWork APIトークンを記述'},
    method : "get"
  };
  var room_id = 'ルームID';
  var url = "https://api.chatwork.com/v1/rooms/" + room_id + "/messages?force=0"; //チャットからメッセージを取得
  var strRespons = UrlFetchApp.fetch(url, params); //Chatwork APIエンドポイントからレスポンスを取得
 
  if(strRespons == "") return;
  
  var json = JSON.parse(strRespons.getContentText()); //APIからの結果をjson形式にパース
 
  return json;
}

ルームIDとはChatWorkのチャットごとに設定されているIDです。APIで取得できますが、URLからも確認可能です。

例えば

https://www.chatwork.com/#!rid12345678

の場合、ルームIDは「12345678」です。

Slackへのメッセージの投稿

次にSlackにメッセージを投稿する処理を書きました。

function postMessage(message) {
  var url        = 'https://slack.com/api/chat.postMessage';
  var token      = "自分のSlack APIトークンを記述";
  var channel    = "投稿するチャンネル名";
  var username   = "botの名前"; 
  var parse      = 'full';
  var icon_emoji = ':robot_face:'; //表示するアイコン
 var method     = 'post';
 
  var payload = {
      'token'      : token,     
      'channel'    : channel,   
      'text'       : message,   
      'username'   : username,  
      'parse'      : parse,     
      'icon_emoji' : icon_emoji 
  };
 
  var params = {
      'method' : method,
      'payload' : payload
  };
 
  var response = UrlFetchApp.fetch(url, params); //slackに投稿
}  

ChatWorkからSlackへメッセージを投稿

ChatWorkからメッセージの取得、Slackへのメッセージの投稿ができるようになったので、これらを組み合わせてChatWorkからSlackへ新規メッセージを投稿するbotを作成します。

var CHATWORK_TOKEN ='ChatWork APIのトークン';
var SLACK_TOKEN = 'Slack APIのトークン';

function chatworkBot() {
  var json = getMessage();
  
  if(json == "") return;
  
  var message = '';
  for(var i in json){
    message = message + json[i].account.name + "\n```" + json[i].body + "```\n";
    postMessage(message);
  }
}

function getMessage(){
  var params = {
    headers : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    method : "get"
  };
  var room_id = 'ルームID';
  var url = "https://api.chatwork.com/v1/rooms/" + room_id + "/messages?force=0"; //チャットからメッセージを取得
  var strRespons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得
 
  if(strRespons == "") return;
  
  var json = JSON.parse(strRespons.getContentText()); ///APIからの結果をjson形式にパース
 
  return json;
}


function postMessage(message) {
  var url        = 'https://slack.com/api/chat.postMessage';
  var token      = SLACK_TOKEN;
  var channel    = "投稿するチャンネル名";
  var username   = "botの名前"; 
  var parse      = 'full';
  var icon_emoji = ':robot_face:'; //表示するアイコン
 var method     = 'post';
 
  var payload = {
      'token'      : token,
      'channel'    : channel,
      'text'       : message,
      'username'   : username,
      'parse'      : parse,
      'icon_emoji' : icon_emoji
  };
 
  var params = {
      'method' : method,
      'payload' : payload
  };
 
  //slackにポスト
  var response = UrlFetchApp.fetch(url, params);
}  

これで処理の記述は完了です。簡単に作成できてしまいました。

トリガーの設定

最後に定期的に新規メッセージを取得するためにトリガーを設定します。今回は5分後ごとにbotが起動するようにします。

f:id:AdwaysEngineerBlog:20161125162733p:plain

これでChatWorkに新規メッセージが来ると以下のようにSlackに表示されます。

f:id:AdwaysEngineerBlog:20161125162739p:plain

できました!以上で作成完了です。

まとめ

今回、11月は週ごとに新卒が記事を投稿するということで書かせていただきました。
ブログのネタがなかった私は最後の週にしてもらいましたが、、、それでもなかなかブログのネタが思いつかない!!
同期にも相談してどうにかこうにかひねり出したネタのひとつが今回のbotでした。
今回は簡単なbotしか作れなくて、改良点もいっぱいありますが、今後はChatWork API、Slack APIの使い方を学んだのでバンバン業務を効率化、または便利なbotを量産していきたいと思います。