GASでチャットワークAPIからメッセージを取得する方法!チャット履歴のバックアップに便利
チャットワークにはChatworkAPIが用意されており、API経由でメッセージを投稿したり、チャットメッセージを取得することができます。
Google Apps Script(GAS)とチャットワークAPIを組み合わせて、グループチャットからメッセージを取得する方法を解説します。
チャットワークAPIでメッセージ取得
チャットワークAPIを使えば、通常ブラウザで操作する作業をAPI経由で実現できます。
その中でもニーズが高いのが、チャットワークに投稿されたメッセージをAPIを叩いて取得することです。
チャットワークは2022年10月6日より利用規約が変更され、無料プランで閲覧できるメッセージ数が制限されました。
過去40日以内または最新5000件までのメッセージしか閲覧できなくなり、それ以前のメッセージは非表示になります。
そうした点からチャットワークAPIでメッセージ取得ができれば、スプレッドシートに書き出すなどして保管しておくことができ便利です。
GASライブラリChatWorkClientからメッセージ取得不可
通常Google Apps Script(GAS)でチャットワークAPIを操作する場合、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は以下です。
エンドポイントの中で取得したいチャットのルームID{room_id}を指定します。
URLパラメータとしてforceパラメータがあり、0または1を指定することができます。
0の場合は過去APIリクエストで取得済みのメッセージは取らず、1の場合は毎回最新メッセージを100件取るようになります。
※パラメータを指定しない場合は「?force=0」として処理されます。
チャットワークAPIのメッセージ取得のエンドポイントを1回実行すると、100件を上限にメッセージが取得できます。
チャットワークAPIからメッセージ取得するGASサンプルコード
実際にチャットワークAPIからルームIDを指定して特定のチャットに投稿されたメッセージを取得する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());
//取得したチャットワークのメッセージ情報をログ出力
console.log(response);
}
チャットワークAPIからメッセージ取得する際は、ChatWorkClientライブラリは使用しないので、ライブラリの追加作業は不要です。
まずチャットワークAPIのトークンを定義(3行目)し、続いてメッセージを取得したいチャットのルームIDを定義します(5行目)。
続いてメッセージ取得するためのチャットワークAPIのエンドポイントに先ほど定義したルームIDをセットします。
最後にチャットワークAPIのメッセージ取得用エンドポイントをUrlfetchApp.fetchメソッドでリクエストしてログ出力します。
実行ログにメッセージに関する情報が出力することができました。
チャットワークAPIリクエストでJSONエラーが
前述したGoogle Apps Script(GAS)でチャットワークAPI経由でメッセージを取得するサンプルコードを実行すると、エラーが生じることがあります。
SyntaxErrorの原因は、サンプルコードを複数回実行し、ChatworkAPIで取得できるメッセージがないためです。
チャットワークのメッセージを取得する「/messages」エンドポイントは、forceパラメータがあり未設定だと「force=0」がデフォルト設定されます。
force=0の場合、過去APIで取得したメッセージは取得対象から除外され、取得できるメッセージがなくなるため、APIリクエストが失敗します。
その場合はAPIのURLパラメータとして「?force=1」をエンドポイントに付与します。
これでチャットワークAPIリクエストのエラーは解消されます。
テストのため何度もチャットワークAPIをリクエストする場合はforce=1をURLパラメータとしてHTTPリクエストに付与しておきましょう。
チャットメッセージをスプレッドに出力
前述したGoogle Apps Script(GAS)のサンプルコードはチャットワークAPIを叩いて、チャットワークのメッセージ取得し、ログ出力しました。
チャットワークからAPI経由でメッセージを取得したら、スプレッドシートに保管したいニーズがあります。
そこで、先ほどのGASサンプルコードを改良し、チャットワークAPI経由で取得したメッセージをスプレッドシートに書き込んでみます。
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次元配列に出力します。
- 投稿時間
- 投稿ユーザー名
- 投稿メッセージ
上記の投稿メッセージの情報をスプレッドシートに書き込むようにしています。
改良版サンプルコードを実行することで、スプレッドシートに投稿履歴データを出力することができます。
サンプルコードを定期的に実行することで、チャットワークの投稿メッセージがスプレッドシートに蓄積され、過去40日以前のチャットも参照可能です。
まとめ・終わりに
今回、Google Apps Script(GAS)でチャットワークAPIにリクエストして、特定チャットのメッセージを取得する方法を紹介しました。
通常、GASでチャットワークAPIを利用する場合は、ChatWorkClientライブラリを使用しますが、投稿メッセージの取得に対応していません。
チャットワークのメッセージをGASで取得するには、チャットワークAPIのメッセージ取得用エンドポイントをUrlfetchApp.fetchメソッドでリクエストする必要があります。
チャットに投稿されたメッセージを取得できれば、チャットワークの過去メッセージを保管するツールなどもスプレッドシートで作成できます。
仕事でチャットワークを活用していて、メッセージを保存したい場合はGASとチャットワークAPIを組み合わせましょう。
ディスカッション
コメント一覧
ありがとうございます。
とても参考になりました。
実際にスプレッドシートへの取得もできました。
ちなみに過去100件の情報を取得できましたが、さらに過去にさかのぼって取得することも可能でしょうか?
>細川様
コメントありがとうございます。
無事スプレッドシートにChatworkのメッセージ出力もできてよかったです。
ご質問いただいた点ですが、過去100件より前はAPI仕様上取得できません。
必要な場合は手動での退避対応(その場合も過去40日以内のメッセージのみ)になります。
回答ありがとうございます!