api
GoogleAppsScript
chatwork
スプレットシート
ChatworkAPI

Google Apps ScriptでChatworkのメッセージを取得する方法は?

こんにちは!
エイチーム引越し侍のエンジニア@kekiです。

Google Apps ScriptからChatworkのAPIを使って、「メッセージを送る」方法はググるとたくさん情報が出てきますが、逆に「Chatworkに流れているメッセージを取得する方法」はあまり知られてないです。
そこで今回は、Google Apps ScriptでChatworkのメッセージを取得する方法について記事にしたいと思います。

やりたいこと

  1. 特定のroomに発言したメッセージを取得
  2. 特定のメンションがついたメッセージのみ取得

例えば「質問部屋」みたいなroomを作って、
質問ある人は○○さんにメンション付けてメッセージ送ってねーという運用ルールを作って、
このプログラムを動かすことで、スプレッドシート上に質問リストを自動で出力する。
みたいなことが出来ます。

Chatwork APIの仕様

以下のURLでリクエストを飛ばすと、結果をjsonで返してくれる。以上(笑)。それだけです。
コーディング時間は1時間もあれば出来ると思います。

https://api.chatwork.com/v2/rooms/[room_id]/messages?force=0

  • [room_id] : 取得したいroomのIDを指定します。
  • forceパラメータ
    • 0 : 前回実行時からの差分のみを取得
    • 1 : すべて取得

コード

function getMessage() {

  // 取得するルームのIDを設定
  var roomID = "[ルームID]";

  // APIトークンを設定
  var apiToken = "[APIトークン]";

  // api url
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0";

  // apiに渡すパラメータを設定
  var params = {
    headers : {"X-ChatWorkToken" : apiToken},
    method : "GET"
  };

  // 実行
  var res = UrlFetchApp.fetch(url, params);

  // 結果が存在した場合、json形式で取得した結果をpurseする
  if (res != "") {
    var dataArr = JSON.parse(res.getContentText()); 
  }

  // 出力
  for each(var data in dataArr) {
    Logger.log(data.body);
  }
}

取得したいルームのIDと、APIトークンの部分のみ書き換えれば使えるはずです。
APIトークンの取得についてはこちらをご参照ください。
https://help.chatwork.com/hc/ja/articles/115000172402-API-Token%E3%82%92%E7%99%BA%E8%A1%8C%E3%81%99%E3%82%8B

ソースコードをわかりやすくするためにLogger.logで出力していますが、
ここをスプレッドシートに出力する処理を書けば、一覧化することができます。

結果

[18-01-27 21:48:08:734 JST] [deleted]
[18-01-27 21:48:08:735 JST] こんにちは
[18-01-27 21:48:08:735 JST] わたしのなまえは
[18-01-27 21:48:08:736 JST] @keki
[18-01-27 21:48:08:737 JST] [To:0123456] ひっこしば(侍bot)さん
あなたのなまえはなんですか?

特定のメンションがついた情報のみ取得

少し作り変えて、特定のメンションがついたメッセージのみを取得するようにします。
今回は、引越し侍で使っているbot「ひっこしば」にTOを付けたメッセージのみを取得しています。

function getMessage(){
  // 取得するルームのIDを設定
  var roomID = "[ルームID]";

  // APIトークンを設定
  var apiToken = "[APIトークン]";

  // ひっこしば(引越し侍で使っているbot)のメンション文字列
  var shibaReg = /[To:0123456]/;

  // api url
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0";

  // apiに渡すパラメータを設定
  var params = {
    headers : {"X-ChatWorkToken" : apiToken},
    method : "GET"
  };

  // 実行
  var res = UrlFetchApp.fetch(url, params);

  // 結果が存在した場合、json形式で取得した結果をpurseする
  if (res != "") {
    var dataArr = JSON.parse(res.getContentText()); 
  }

  // ひっこしばにメンションを付けたメッセージのみ出力
  for each(var data in dataArr) {
    if (data.body.match(shibaReg)) {
      Logger.log(data.body);
    }
  }
}

取得した文字列に「[To:0123456]」が含まれた場合のみ出力する形に変えました。

結果

[18-01-27 21:48:08:737 JST] [To:0123456] ひっこしば(侍bot)さん
あなたのなまえはなんですか?

シンプルな改修ですが、正常に動いてますね。
これで、特定のユーザーにメンションが付いたメッセージのみが出力されるようになりました。

注意点

  1. トークンを取得したユーザーは必ずroomに入れる
    APIトークンを取得したユーザーをroomに入れないと情報の取得ができません。

  2. forceパラメータを0にすると、resが空になることがある
    forceパラメータを0にすると、前回取得した時からの差分を取得するので、
    何も発言されていない場合は空が返ってきます。
    その際の処理も意識しましょう。

  3. 削除されたメッセージは[deleted]で返ってくる

まとめ

いかがでしたでしょうか?
大量に流れてくるChatworkメッセージをスプレッドシートで一覧化できるというだけでもそれなりに役に立つのではないでしょうか。

ちなみに開発にかけた時間は15分です。(この記事を書いてる時間の方が長かったですw)

追伸

株式会社エイチーム引越し侍では、一緒にサイト改善をしてくれるWebエンジニアを募集しています。エイチームグループのエンジニアとして働きたい!という方は是非、以下のリンクから応募してください。
皆様からのご応募、お待ちしております!!

エイチームグループ採用サイト(Web開発エンジニア職)