hatworkからslackへのメッセージ転送・・・普通やりませんよね汗
ただどっちも使ってるけどslackの方がメインなのでって狭いニーズもあるのでやってみました。
ちなみにこのブログを書いている時点でまだ社内でもこのプログラムの存在は出していません。
とりあえず説明(コードはgoogle apps scriptです)。
下部に記載されているコードを下記のようなサンプルコードで
chatworkでAPIが前回呼び出したチャットのメッセージの差分をslackに通知します。
sendFunction("①slackでgetしたwebhookurl","②chatwork apiで取得したキー","チャットワークのルームID","slackのチャンネル");
<①slackでgetしたwebhookurl>の情報の取得に関しては
https://my.slack.com/services/new/incoming-webhook
でチャンネルを選択し
”Add Incoming WebHooks Integration”ボタンを押下すると
下記のような感じのWebhook URL
https://hooks.slack.com/services/hogehoge/hogehoge/hogehoge
が作成されます。
<②chatwork apiで取得したキー>の情報の取得に関しては
ChatWorkの動作設定の「API発行」タブから取得します。
ちなみにchatworkのAPIのドキュメントは
にありますので、他の実装する時の参考にしてください。
あとは下記のような感じで(エラー処理等は自身で記載願います)
//転送用関数 function sendFunction(slackkey,chartworkapikey,room,slackchannel){ var result = getMessageToRoom(chartworkapikey,room); if(result.getContentText().length > 0){ var eventSearchResult = JSON.parse(result.getContentText()); for each(var obj in eventSearchResult){ sendToSlack(slackkey,slackchannel,obj.account.name+"さんのchatwokからの通知",obj.body); } } }
//chatworkのルームからメッセージを取得 function getMessageToRoom(token, roomId) { var params = { headers : { "X-ChatWorkToken" : token }, method : "get" }; var url = "https://api.chatwork.com/v1/rooms/" + roomId + "/messages?force=0"; return UrlFetchApp.fetch(url, params); }
//slackへ通知 function sendToSlack(url,channel,username,body) { var data = {"channel": channel, "username": username, "text": body, "icon_emoji": ":ghost:"}; var payload = JSON.stringify(data); var headers = {"Accept":"application/json", "Content-Type":"application/json", "Authorization":"Basic _authcode_" }; var options = { "method" : "POST", "contentType" : "application/json", "headers" : headers, "payload" : payload }; var response = UrlFetchApp.fetch(url, options); }
なお実際に使うのはメッセージの加工なども少し行いますので
単に転送だけではないですが最低限必要な部分を抜き出しました。
あとPagerDutyでメッセージをある程度の単位で管理したい(ニーズがあれば)。
誰が見てそのメッセージの内容を対応するのか?24365で複数人が
チャットを見て対応するので、作業着手やchatworkへのメッセージの返信が
かぶらないように。
こういうのをやりすぎると酸素欠乏症になったアムロの親父みたいな扱いに
なりかねないので、きちんとニーズがあるかを確認して
色々とやっていきたいと思います(現状からのニーズと最適化は別ものなので
声を聞いているだけでも駄目なんですが汗)。