こんにちは、入社1年目SEの佐藤です。
今回はChatWorkの投稿を定期的にSlackへ投稿するbotを作成したことについて書きたいと思います。
最近、全社のチャットツールとしてChatWorkが導入されました。
しかし、エンジニア側ではChatWorkの導入前からSlackを使っていて、私自身もSlackのほうが使い慣れています。
二つのチャットツールを見るのはめんどくさい!Slackでメッセージを確認したい!
ということで、ChatWork側で投稿があればSlackに通知して、返信したいときだけChatWorkを使えばいいのではと思い、実際にやってみました。
ChatWork APIの申請
ChatWork APIを利用するにはチャットワークAPIの申請 から利用申請をします。会社のアカウントなど自分が管理者ではない場合は、ChatWorkの管理者に申請をおこなってもらってください。
ChatWork APIトークンの取得
申請が完了後、Chatwork APIドキュメントのページを参考にトークンを取得してください。取得したトークンはbot作成の際に使用するのでメモっておいてください。
Slack APIトークンの取得
Slack APIのページからSlack APIのトークンを取得してください。
Slack APIのトークンもChatWork同様にbot作成の際に使用するのでメモっておいてください。
以下の画像ではすでに発行されているのですが、新規の場合は「Create token」を押せば発行されます。
Google Apps Scriptの作成
今回はGoogle Apps Scriptで書いていきます。 GoogleDriveの新規からGoogle Apps Scriptを選択します。項目がない場合は、「アプリを追加」でGoogle Apps Scriptを検索して追加すると表示されるようになります。
これが最初に表示される画面です。このファイルにjavascriptでコードを記述していきます。
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が起動するようにします。
これでChatWorkに新規メッセージが来ると以下のようにSlackに表示されます。
できました!以上で作成完了です。
まとめ
今回、11月は週ごとに新卒が記事を投稿するということで書かせていただきました。
ブログのネタがなかった私は最後の週にしてもらいましたが、、、それでもなかなかブログのネタが思いつかない!!
同期にも相談してどうにかこうにかひねり出したネタのひとつが今回のbotでした。
今回は簡単なbotしか作れなくて、改良点もいっぱいありますが、今後はChatWork API、Slack APIの使い方を学んだのでバンバン業務を効率化、または便利なbotを量産していきたいと思います。