読者です 読者をやめる 読者になる 読者になる

CGメソッド

CG制作に関してのヒント

MENU

【ChatWork】ChatWorkのメッセージをSlackへ転送する方法

Web Service Web Service-ChatWork Web Service-Slack Google Google-Google Apps Script

follow us in feedly

インテグレーション機能を使ってみたくてSlackを使い始めました。

ただ英語メニューしかないので、仕事では使えず(導入するのも大変、説明が)

やりとりは結局、日本語メニューのあるChatWorkとか Skypeとかになるのですが、

色々ソフト立ち上げているとたまに自分宛てのメッセージを見逃してしまうので、

Slackにすべて転送出来ないか計画中です。

まずはチェットワークからスラックに通知を転送

仕様

  • ①通知だけでなく、メッセージの内容も転送する

  • ②自分宛ての通知のみ転送

  • ③すべてのルームの自分宛ての通知を転送したい

  • ④他のサービス(zapierとかAWS Lambdaとか)はできれば使わず、Google Apps Scriptだけでなんとかしたい

ネットで公開されているものをいくつか試したのですが、理想のものは見つからず。

  • Toが既読されるまで、メッセージが投稿され続けたり

  • すべてのメッセージがGmailに大量に転送されたり(かつ同じメッセージを取得し続けたり)

  • 通知がありましたのみ表示されたり

納得いかなかったので、一番、理想に近かったこちらのコードを参考に

特定のルームに自分宛ての通知のみ、メッセージ内容も込みで転送させてみました。

ChatWorkのメッセージをSlackに通知するBotを作ってみた - AdwaysEngineersBlog - Adwaysエンジニアブログ

やり方

  1. チャットワークAPIの取得(+自分のIDと取得したいルームIDも調べておく)

※通知を何分間隔でスクリプトを実行するかの設定も下記の記事を参照

min.hatenablog.jp

  1. Slack APIのトークン こちらから取得

api.slack.com

  1. Google Apps Scriptに下記のコードをコピペ。★部分を入力して実行(myFunction)
var CHATWORK_TOKEN = 'hoge';//★ChatWork APIのトークン
var MY_ID = 'hoge';//★自分のチャットワークID
var ROOM_ID = ["11111111","22222222","33333333"];//★チャットワークのルームID
var SLACK_TOKEN = 'hoge';//★Slack APIのトークン


function myFunction(){

  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;
    
      for each(var obj in json){
        if(obj.body.indexOf(MY_ID) != -1){
          var message = '';
          for(var i in json){
            message = message + json[i].account.name + "\n```" + json[i].body + "```\n";
            postMessage(message);
          }
        }
      }
    }
  } 
}

function postMessage(message) {
  var url        = 'https://slack.com/api/chat.postMessage';
  var token      = SLACK_TOKEN;
  var channel    = "#general";
  var username   = "ChatWork"; 
  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);
}

まとめ

f:id:min0124:20170304143648p:plain

①②④の条件を満たして、うまくいきました。

③に関しては、取得したいルームIDを配列へ入れてやります。

テストするときは、マイチャットで自分のIDを入れると、自分に対してTOで通知できて便利でした。