GASでチャットワークAPIからメッセージを取得する方法!チャット履歴のバックアップに便利

2022年10月6日

チャットワークにはChatworkAPIが用意されており、API経由でメッセージを投稿したり、チャットメッセージを取得することができます。

Google Apps Script(GAS)とチャットワークAPIを組み合わせて、グループチャットからメッセージを取得する方法を解説します。

チャットワークAPIでメッセージ取得

チャットワークAPIを使えば、通常ブラウザで操作する作業をAPI経由で実現できます。

その中でもニーズが高いのが、チャットワークに投稿されたメッセージをAPIを叩いて取得することです。

チャットワーク(Chatwork)は日本国産のチャットツールでフリーランスで利用ユーザーが多いサービス

チャットワークは2022年10月6日より利用規約が変更され、無料プランで閲覧できるメッセージ数が制限されました。

過去40日以内または最新5000件までのメッセージしか閲覧できなくなり、それ以前のメッセージは非表示になります。

そうした点からチャットワークAPIでメッセージ取得ができれば、スプレッドシートに書き出すなどして保管しておくことができ便利です。

GASライブラリChatWorkClientからメッセージ取得不可

通常Google Apps Script(GAS)でチャットワークAPIを操作する場合、ChatWorkClientライブラリを利用します。

Google Apps Script(GAS)のライブラリ画面でChatWorkClientが表示されるので、追加ボタンをクリック

ChatWorkClientを利用すれば、GASからチャットワークAPIへのリクエストが簡単に実行できるからです。

しかし、ChatWorkClientライブラリはチャットワークAPIで可能な操作が全てサポートされていません。

メッセージの投稿やルームID・タスクの取得はChatWorkClientからできます。

けれども、チャットワークに投稿されたメッセージを取得するメソッドはGASのライブラリであるChatWorkClientには存在していません。

GASでチャットワーク上で投稿されたメッセージを取得するには、ChatWorkClientを使わずにチャットワークAPIを直接リクエストする必要があります。

チャットワークAPIをGASで直接叩くには?

Google Apps Script(GAS)でチャットワークAPIを直接叩くには、UrlfetchAppオブジェクトのfetchメソッドを使用します。

GASのhttpリクエストの方法は下記の記事で解説しています。

チャットワークAPIには操作したい内容に応じたエンドポイントが用意されています。

エンドポイントとなるURLと、APIトークンを含んだヘッダー情報をUrlfetchApp.fetchメソッドの引数に指定して実行します。

実行結果はJSON形式で返ってくるので、JSON.parseメソッドでオブジェクトに変換することで、GASで処理可能になります。

チャットワークAPIでメッセージ取得するエンドポイント

チャットワークAPIからメッセージを取得するエンドポイントのURLは以下です。

https://api.chatwork.com/v2/rooms/{room_id}/messages

エンドポイントの中で取得したいチャットのルームID{room_id}を指定します。

URLパラメータとしてforceパラメータがあり、0または1を指定することができます。

0の場合は過去APIリクエストで取得済みのメッセージは取らず、1の場合は毎回最新メッセージを100件取るようになります。

※パラメータを指定しない場合は「?force=0」として処理されます。

チャットワークAPIのメッセージ取得のエンドポイントを1回実行すると、100件を上限にメッセージが取得できます。

チャットワークAPIからメッセージ取得するGASサンプルコード

実際にチャットワークAPIからルームIDを指定して特定のチャットに投稿されたメッセージを取得するGoogle Apps Script(GAS)のサンプルコードを解説します。

ChatWorkClientライブラリを利用せずに、Google Apps Script(GAS)でチャットワークAPIにUrlfetchApp.fetcchメソッドでHTTPリクエストしてメッセージを取得するサンプルコード
function getChatWorkMessage(){
  //Chatwork API Tokenを定数として定義
  const token = '********************************';
  //メッセージを取得したいルームIDを定数として定義
  const room_id ='+++++++++';
  //メッセージを取得するチャットワークAPIのエンドポイント定義
  let messageUrl = 'https://api.chatwork.com/v2/rooms/' + room_id + '/messages?force=1';
  //APIリクエスト時に必要なAPIトークンをJSON形式で指定
  let json = {
    'x-chatworktoken': token
  };
  //HTTP GETを行うためのメソッドと、パラメータを設定
  let options = {
    'method': 'get',
    'headers' : json,
  };
  //チャットワークAPIへリクエストし、ルームIDのメッセージを取得
  let response = JSON.parse(UrlFetchApp.fetch(messageUrl,options).getContentText());
  //取得したチャットワークのメッセージ情報をログ出力
  console.log(response);
}

チャットワークAPIからメッセージ取得する際は、ChatWorkClientライブラリは使用しないので、ライブラリの追加作業は不要です。

まずチャットワークAPIのトークンを定義(3行目)し、続いてメッセージを取得したいチャットのルームIDを定義します(5行目)。

続いてメッセージ取得するためのチャットワークAPIのエンドポイントに先ほど定義したルームIDをセットします。

最後にチャットワークAPIのメッセージ取得用エンドポイントをUrlfetchApp.fetchメソッドでリクエストしてログ出力します。

Google Apps Script(GAS)でチャットワークAPIにUrlfetchApp.fetcchメソッドで直接HTTPリクエストしてメッセージを取得するサンプルコードを実行した結果、メッセージ情報がログ出力

実行ログにメッセージに関する情報が出力することができました。

チャットワークAPIリクエストでJSONエラーが

前述したGoogle Apps Script(GAS)でチャットワークAPI経由でメッセージを取得するサンプルコードを実行すると、エラーが生じることがあります。

Google Apps Script(GAS)でチャットワークAPIにUrlfetchApp.fetcchメソッドで直接HTTPリクエストしてメッセージを取得するサンプルコードを実行した結果、Syntax Errorで「Unexpected end of JSON input」が出力

SyntaxErrorの原因は、サンプルコードを複数回実行し、ChatworkAPIで取得できるメッセージがないためです。

チャットワークのメッセージを取得する「/messages」エンドポイントは、forceパラメータがあり未設定だと「force=0」がデフォルト設定されます。

force=0の場合、過去APIで取得したメッセージは取得対象から除外され、取得できるメッセージがなくなるため、APIリクエストが失敗します。

その場合はAPIのURLパラメータとして「?force=1」をエンドポイントに付与します。

チャットワークAPIでメッセージを取得するエンドポイントでパラメータのforceに1を設定

これでチャットワークAPIリクエストのエラーは解消されます。

テストのため何度もチャットワークAPIをリクエストする場合はforce=1をURLパラメータとしてHTTPリクエストに付与しておきましょう。

チャットメッセージをスプレッドに出力

前述したGoogle Apps Script(GAS)のサンプルコードはチャットワークAPIを叩いて、チャットワークのメッセージ取得し、ログ出力しました。

チャットワークからAPI経由でメッセージを取得したら、スプレッドシートに保管したいニーズがあります。

そこで、先ほどのGASサンプルコードを改良し、チャットワークAPI経由で取得したメッセージをスプレッドシートに書き込んでみます。

チャットワークAPIをGoogle Apps Script(GAS)でリクエストして、チャットに投稿されたメッセージをスプレッドシートに書き込むサンプルコード
function getChatWorkMessage(){
  //Chatwork API Tokenを定数として定義
  const token = '********************************';
  //メッセージを取得したいルームIDを定数として定義
  const room_id ='+++++++++';
  //メッセージを取得するチャットワークAPIのエンドポイント定義
  let messageUrl = 'https://api.chatwork.com/v2/rooms/' + room_id + '/messages?force=1';
  //APIリクエスト時に必要なAPIトークンをJSON形式で指定
  let json = {
    'x-chatworktoken': token
  };
  //HTTP GETを行うためのメソッドと、パラメータを設定
  let options = {
    'method': 'get',
    'headers' : json,
  };
  //チャットワークAPIへリクエストし、ルームIDのメッセージを取得
  let response = JSON.parse(UrlFetchApp.fetch(messageUrl,options).getContentText());
  //取得したチャットワークのメッセージ情報をスプレッドシート出力できるよう整形
  for(let i=0;i<response.length;i++){
    response[i] = [response[i].send_time, response[i].account.name, response[i].body];
  }
  //アクティブなスプレットシートのシート読み込み
  const ss = SpreadsheetApp.getActiveSheet();
  //スプレッドシートに投稿日時、投稿者、投稿メッセージを出力
  ss.getRange(2,1,response.length,response[0].length).setValues(response);
}

UrlfetchApp.fetchメソッドでチャットワークAPIのメッセージ取得用エンドポイントをリクエストして得たレスポンスのうち、以下3つを2次元配列に出力します。

  1. 投稿時間
  2. 投稿ユーザー名
  3. 投稿メッセージ

上記の投稿メッセージの情報をスプレッドシートに書き込むようにしています。

チャットワークAPIをGoogle Apps Script(GAS)でリクエストして、チャットに投稿されたメッセージをスプレッドシートに書き込むサンプルコードを実行した結果、スプレッドシートにメッセージが

改良版サンプルコードを実行することで、スプレッドシートに投稿履歴データを出力することができます。

サンプルコードを定期的に実行することで、チャットワークの投稿メッセージがスプレッドシートに蓄積され、過去40日以前のチャットも参照可能です。

まとめ・終わりに

今回、Google Apps Script(GAS)でチャットワークAPIにリクエストして、特定チャットのメッセージを取得する方法を紹介しました。

通常、GASでチャットワークAPIを利用する場合は、ChatWorkClientライブラリを使用しますが、投稿メッセージの取得に対応していません。

チャットワークのメッセージをGASで取得するには、チャットワークAPIのメッセージ取得用エンドポイントをUrlfetchApp.fetchメソッドでリクエストする必要があります。

チャットに投稿されたメッセージを取得できれば、チャットワークの過去メッセージを保管するツールなどもスプレッドシートで作成できます。

仕事でチャットワークを活用していて、メッセージを保存したい場合はGASとチャットワークAPIを組み合わせましょう。