ChatworkのメッセージをSlackに流す

chatworkのメッセージを自分の個人で使っているslackのワークスペースに転送します。

# 目的
chatworkのメッセージ・画像をslackに流す。
リアルタイムだと嬉しいが、chatwork apiのリクエスト制限があり、GASのトリガーもあまり短くするとバグが出るので、トリガーはいまのところ5分で設定している。
画像URLは30分で使用不可になるので、slack上の画像も30分で見られなくなる。

# 結果
![スクリーンショット 2019-11-15 17.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131949/54aa6202-ba9a-6861-8a75-0b6b8138b503.png)


# 必要なもの
- chatworkAPIトークン
- chatworkID
- slackWebhookのURL

# コード

```javascript
var CHATWORK_TOKEN ='********************************';//chatworkAPIトークン
var MY_ID = '*******'; // chatworkID
var SLACK_WEBHOOK = 'https://hooks.slack.com/services/*********/******/********************'; //slackWebhook

// トリガーを設定するメインスクリプト
function getChatWork(){
  var ROOM_ID = getChatWorkRoomsId();
  var params = {
    headers : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    method : "get"
  };
  for (var i = 0; i < ROOM_ID.length; i ++) {    
    var url = "https://api.chatwork.com/v2/rooms/" + ROOM_ID[i] + "/messages?force=0";
    var strRespons = UrlFetchApp.fetch(url, params);
    if (strRespons != "") {      
      var json = JSON.parse(strRespons.getContentText());
      if(json == "") return;
      shapeMessage(json,ROOM_ID[i]);
    }
  } 
}

// 自分のルームIDをすべて取得するスクリプト
// 特定のルームだけでいい場合は、IDを調べて、ここを配列で返す形にする
function getChatWorkRoomsId(){
  var params = {
    headers : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    method : "get"
  };    
  var url = "https://api.chatwork.com/v2/rooms/";
  var strRespons = UrlFetchApp.fetch(url, params);
  var ids = [];
  if (strRespons != "") {      
    var json = JSON.parse(strRespons.getContentText());
    if(json == "") return;
    for each(var obj in json){
      ids.push(obj.room_id.toString());
    }
  }
  return ids;
}

// slackに送るメッセージを整形する
function shapeMessage(json,room_id){
  var message = '';
  for(var i in json){
    Logger.log(json);
    var image_id = '';
    try {
      image_id = json[i].body.match(/download:([0-9]*)/)[1];
    }
    catch (e) {
      Logger.log(json);
    }
    var image_url = ''
    if (image_id != "") {
      image_url = getImage(room_id, image_id);
    }
    var data = {
      "channel" : "********", // 任意のチャンネル名
      "username" : "Chatwork",
      "attachments": [
        {
          "color": "#F03747", // メッセージの左の色
          "author_name": json[i].account.name,
          "author_icon": json[i].account.avatar_image_url,
          "text" : json[i].body,
          "image_url": image_url
        }
      ]
    };
    sendToSlack(data);
  }
}

// ファイルが送られた場合、URLを取得する
function getImage(room_id, file_id){
  var params = {
    headers : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    method : "get"
  };    
  var url = "https://api.chatwork.com/v2/rooms/"+room_id+"/files/"+file_id+"?create_download_url=1";
  var strRespons = UrlFetchApp.fetch(url, params);
  if (strRespons != "") {      
    var json = JSON.parse(strRespons.getContentText());
    if(json == "") return;
    return json.download_url;
  }
}

// slackに送る
function sendToSlack(shapeData) {
  var url = SLACK_WEBHOOK;
  var data = shapeData;
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  var response = UrlFetchApp.fetch(url, options);
}
```

# 参考
[【ChatWork】ChatWorkのメッセージをSlackへ転送する方法](https://www.cg-method.com/entry/2017/03/06/080000/)
[Slack API attachmentsチートシート](https://qiita.com/daikiojm/items/759ea40c00f9b539a4c8)