share facebook facebook2 twitter menu hatena pocket slack

2015.07.06 MON

【cloudpack 大阪 BLOG】MSPのシステム化について chatworkからslackへのメッセージ転送

比企 宏之

WRITTEN BY比企 宏之

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のドキュメントは

エンドポイント – チャットワーク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へのメッセージの返信が
かぶらないように。

こういうのをやりすぎると酸素欠乏症になったアムロの親父みたいな扱いに
なりかねないので、きちんとニーズがあるかを確認して
色々とやっていきたいと思います(現状からのニーズと最適化は別ものなので
声を聞いているだけでも駄目なんですが汗)。

元記事はこちら

Check! Amazon EC2 Container Service で Docker を学びたい!(準備編)

比企 宏之

比企 宏之

The latest Tweets from Universal Ocellaris (@UniOce). そろそろ自身が得意とするエリア(IoT)に世の中が近づいてきて虎視眈々と決起のタイミングを狙っている開発では無敗の元モバイル端末開発&WEBアプリ開発者で、今はクラウド業界にダイブして、cloudpackのMSPのリーダーの一人