Chatwork から来た社内メンバーへの通知をメンションありで Slack に通知する

※過去ブログの転記


作った経緯

  • 基本社内・社外含めコミュニケーションツールは Slack だけど Chatwork を使っているプロジェクトも存在する
  • Chatwork をブラウザタブで常時開いていないため通知に気づかない

流れ

ネットで調べると出てくる部分は省略しました。

  1. Google アカウントの作成(省略)
  2. Slack bot の作成(省略)
  3. Google App Script の作成方法(省略)
  4. Google App Script へのライブラリ追加方法(省略)
    (2020/12/26 時点で新しいUIでの GAS ではライブラリの追加ができなかったので古いUIに切り替えて追加しました)
  5. Google App Script に処理を書く(ここがメイン)
  6. Chatwork でのサービス連携(省略)

省略した部分に関しては以下の記事がわかりやすいと思います

もっとこうした方がいいなどご意見ございましたらご指摘ください!(特に正規表現は雰囲気で書いている。)

const SLACK_TOKEN = 'xoxb-...'; // Slack bot の token を設定
// https://api.slack.com/methods/chat.postMessage のArguments を指定する
const OPTIONS = {
  username: 'Chatwork',
  link_name: true,
  icon_emoji: ":chatwork:"
};
// Slack に存在する社内ユーザーの ChatworkID と SlackユーザーID の定義
// どれが誰か分からなくなるので日本語でコメント文を書いておく
const MENTIONS = {
  '1234567': 'SLACKUSERID1', // ユーザー1
  '890123': 'SLACKUSERID2', // ユーザー2
}
// Chatwork ルームID => Slack チャンネル名
const CHANNELS = {
  '123456789': 'channel-A',
  '12345678': 'channel-B'
}

/**
 * webhook から呼び出される処理
 * ACCOUNTS に対象ユーザーがないメッセージは送らない
 */
function doPost(e) {
  // リクエストからJSONデータを取得してパース
  const obj = JSON.parse(e.postData.contents);
  // Chatwork から受け取ったメッセージ
  const body = obj.webhook_event.body;
  // body に含まれる対象ユーザーを複数検索(ex. 「[To:1234567]ユーザー1さん [To:890123]ユーザー2 さん」 という文字列)
  const toUsers = body.match(/\[To:([\s\S]*?)\]/g);
  var mention = '';
  if (toUsers != null) {
      toUsers.forEach(function (user) {
          const toUser = user.match(/\[To:([\s\S]*?)\]/);
          if (toUser[1] in MENTIONS) {
              mention += "<@"+ MENTIONS[toUser[1]]  +"> さん ";
          }
      });
  }

  // 返信元に ChatworkID が含まれている場合にもメンションに追加する (ex. [rp aid=1234567 to=123456789-xxxx] という文字列)
  const reply = body.match(/\[rp\ aid\=([\s\S]*?)\ to\=/);
  if (reply && reply[1] in MENTIONS) {
    mention += "<@"+ MENTIONS[reply[1]]  +"> さん ";
  }

  // 全員宛の場合はメンションに @channel をつける
  const isAll = body.match(/toall/);
  if (isAll) {
      mention += " <!channel> ";
  }
  
  // メンションが空であれば return
  if (mention === '') {
    return;
  }
  // メンションの設定
  let message = mention + "宛てにチャットワークより連絡がありました。\n";
  // Chatwork のメッセージに飛ぶためのリンク設定
  message += "https://www.chatwork.com/#!rid" + obj.webhook_event.room_id + "-" + obj.webhook_event.message_id + "\n";
  // 本文の表示
  message += body;

  // SlackApp を使用して Slack に message を投げる
  const slackApp = SlackApp.create(SLACK_TOKEN);
  slackApp.postMessage('#' + CHANNELS[obj.webhook_event.room_id], message, OPTIONS);
}

あとは Chatwork 側のWebhookの設定とSlack側のチャンネルたちにSlask Botのアプリを追加してあげる。

というか Chatwork の Webhook の上限が5件までっぽい。有料プランは上限上げてほしい。

コミュニケーションツールはSlack一択にしたいな〜〜〜〜〜〜〜


参考にしたサイト

www.whizz-tech.co.jp github.com help.receptionist.jp https://help.chatwork.com/hc/ja/articles/360000142962-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88ID%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8Bhelp.chatwork.com