チャットワークAPIの自動投稿に未読を付ける


最近、チャットワークの仕様が変わったらしく、「チャットワークAPI経由で投稿した投稿に未読がつかなくなる」という変更がありました。

この変更には正直ちょっと戸惑っており、以前書いた「自社のIRをGoogle Apps ScriptでChatWorkに通知する」や通知系のプログラムに自分で気づけなくなってしまいました。

対処方法

考えられる対処方法は2つあると思います。

  1. 通知専用の別のアカウントを作る
  2. APIで「未読」を付け直す

「1.」のほうがお手軽ですが、社用のチャットワークなので、新しいアカウントを勝手に作って部屋に入れるわけにはいきません。

というわけで後者の方法で私は対応しました。

プログラム

先ほどの記事のGoogle Apps Script(GAS)のプログラムのメッセージをポストする箇所を変更しました。

GASでチャットワークに投稿するアドオンはあるものの、unreadを追加するメソッドは実装されてなかったため、ひとまずモンキーパッチで対応しました。

/**
 * チャットワークにメッセージを送信する
 */
function postChatWork(message, room_id) {
  var client = ChatWorkClient.factory({token: TOKEN});
  var res = client.sendMessage({room_id: room_id, body: message});

  // 「未読をつける」メソッドを追加
  client.makeMessageUnread = function(room_id, message_id) {
    return this.put("/rooms/" + room_id + "/messages/unread", {"message_id": message_id});
  }

  // 投稿直後ではAPIが失敗することがあるので、6秒ごとに10回トライする
  var err;
  for (var i = 0; i < 10; i++) {
    try {
      client.makeMessageUnread(room_id, res['message_id']);
      return;
    } catch(e) {
      if (e["errors"] === "The messages is already marked as unread.") return;
      err = e;
      Utilities.sleep(6000);
      continue;
    }
  }
  throw err;
}