GASとチャットワークAPIでファイルを取得してGoogleドライブに保存する方法

チャットワークAPIを使うと、チャットワークのチャットに添付されたファイルの情報を参照することができます。

Google Apps Script(GAS)でチャットワークAPIからファイルのダウンロードURLを取得し、ファイルをダウンロードしてGoogleドライブ保存する方法を解説します。

チャットワークAPIでファイル投稿・取得も可能

国産チャットツールである「チャットワーク」には、Slackなどと同様にAPIが提供されています。

チャットワークAPIはチャットワークの管理画面から手軽にAPIトークンを発行し、利用することができます。

チャットワークAPIを使えばAPI経由でメッセージを投稿することや、メッセージを取得することがプログラミングで実現可能です。

さらに、チャットワークAPIはメッセージ以外にもファイル操作も対応しています。

API経由でファイル情報からダウンロードURLを取得すれば、添付されたファイルをダウンロードすることもできます。

逆にファイルデータを添付してチャットワークAPIにHTTP POSTすれば、プログラムからファイル投稿も可能です。

GASでGoogleドライブにチャットワークのファイルを保存

チャットワークAPIのファイル操作と相性のよいのが、Google Apps Script(GAS)です。

GASはGoogleのクラウドストレージサービスであるグーグルドライブを手軽に利用することができます。

  1. チャットワークAPIからダウンロードURLを取得し、Googleドライブにファイル保存
  2. GoogleドライブにあるファイルをチャットワークAPI経由で特定チャットに投稿

このようなチャットワークのファイル操作の自動化がGASで実現可能です。

特にチャットワークのファイルをGoogleドライブに保存するプログラムがあれば、フリープラン利用者にとても便利です。

無料版チャットワークは40日経過したメッセージ・ファイルは参照できなくなります。

しかし、GASで定期的にチャットワークAPIからファイルを取得し、Googleドライブに保存しておけば、バックアップになります。

GASのChatWorkClientライブラリはファイル操作不可

Google Apps Script(GAS)でチャットワークAPIを利用する際には、ChatWorkClientライブラリがよく利用されます。

Google Apps Script(GAS)でチャットワークAPIを操作したいときに便利なライブラリChatWorkClient

ChatWorkClientはチャットワークAPIをGASで手軽に扱えるようにしたライブラリです。

しかし、ChatWorkClientライブラリはチャットワークAPIが用意したエンドポイントの一部しか対応していません。

チャットワークAPIからファイルを操作するために、以下の3つのエンドポイントが用意されています。

  1. チャットのファイル一覧を取得する(GET https://api.chatwork.com/v2/rooms/{room_id}/files)
  2. チャットのファイル情報を取得する(GET https://api.chatwork.com/v2/rooms/{room_id}/files/{file_id})
  3. チャットにファイルをアップロードする(POST https://api.chatwork.com/v2/rooms/{room_id}/files)

これらファイル一覧取得、ファイル情報取得、ファイルアップロードのいずれもChatWorkClientライブラリは非対応です。

そのため、GASでチャットワークのファイルを取得・投稿したい場合は、チャットワークAPIを直接リクエストする必要があります。

ダウンロードURLは時間制限ありなので注意

なお、チャットワークAPIを利用して、ファイルのダウンロードURLを取得し、ファイルをダウンロードする場合には注意点があります。

ダウンロードURLは時間制限が設けられており、30秒しかリンクが有効でない点です。

ダウンロードURLを取得したら、すぐにUrlfetchApp.fetchメソッドなどでHTTP通信でファイルをダウンロードする必要があります。

そのため、Google Apps Script(GAS)でチャットワークAPIのファイルをGoogleドライブに保存する場合は以下の流れで実施します。

  1. ルーム(チャット)単位でファイル一覧を取得
  2. ファイルIDからダウンロードURLを取得
  3. ダウンロードURLからblob形式でファイルを取得
  4. Googleドライブにblob形式のファイルを保存

1はスプレッドシートにファイル一覧を書き出す処理とし、2~4を一連の処理としてGASコードを書くのがおすすめです。

GASでチャットワークに投稿されたファイル情報を取得

Google Apps Script(GAS)でチャットワークAPIからファイル情報を取得するサンプルコードを解説します。

チャットワークに投稿された画像やドキュメントのファイルはチャットワークAPIで取得可能

上記のような画像ファイルやドキュメントファイルがグループチャットに投稿されているので、ファイルIDや投稿者、ファイル名をGASでチャットワークAPIを叩いて取得します。

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

チャットワークAPIのトークンとファイルを取得したいチャット(今回はグループチャット)のルームIDを用意します。

ルームIDはチャットワークAPIのエンドポイントに組み込み、APIトークンはHTTPリクエスト時のヘッダー情報としてパラメータ設定します。

チャットのファイル一覧を取得するAPIのエンドポイントをリクエストし、取得した結果をスプレッドシートに書き出せるように2次元配列に整形し、スプレッドシートに出力します。

Google Apps Script(GAS)でチャットワークAPIからファイル一覧の情報を取得してスプレッドシートに出力するサンプルコードを実行した結果、ファイル一覧がスプレッドシートに書き込み

このようにファイルの投稿ユーザーやファイル名、ファイルサイズなどの情報を取得できました。

※投稿時間はUNIX時間になっているため、必要に応じてUNIX時間を変換する必要があります。

その中からファイルIDを後段の処理でダウンロードURLを取得のために利用します。

APIからダウンロードURLを取得しGoogleドライブに保存

チャットワークの特定チャットに添付されたファイル一覧情報が取得できたところで、ファイルIDを使ってダウンロードURLを取得し、Googleドライブにファイルを保存します。

Google Apps Script(GAS)でチャットワークのファイルのダウンロードURLをUrlfetchAppでリクエストしてファイルを取得し、Googleドライブに保存するサンプルコード
function downloadFile() {
  //Chatwork API Tokenを定数として定義
  const token = '********************************';
  //メッセージを取得したいルームIDを定数として定義
  const room_id ='+++++++++';
  //アクティブなスプレットシートのシート読み込み
  const ss = SpreadsheetApp.getActiveSheet();
  //スプレッドシートからチャットワークのファイル情報を2次元配列として取得
  let fileData = ss.getRange(2, 1, ss.getLastRow() - 1, ss.getLastColumn()).getValues();
  //ファイル情報に応じてforループで処理を実行
  for (let i = 0; i < fileData.length; i++) {
    //ファイル取得のチャットワークAPIのエンドポイントにルームIDとファイルID、パラメータをセット
    let fileListUrl = 'https://api.chatwork.com/v2/rooms/' + room_id + '/files/' + fileData[i][2] + '?create_download_url=1';
    //APIリクエスト時に必要なAPIトークンをJSON形式で指定
    let json = {
      'x-chatworktoken': token
    };
    //HTTP GETを行うためのメソッドと、パラメータを設定
    let options = {
      'method': 'get',
      'headers': json,
    };
    //チャットワークAPIへリクエストし、ファイルのダウンロードURLを取得
    let response = JSON.parse(UrlFetchApp.fetch(fileListUrl, options).getContentText());
    //取得したダウンロードURLにリクエストしてblob形式でファイルを取得し、名前を設定
    const file = UrlFetchApp.fetch(response.download_url).getBlob().setName(fileData[i][3]);
    //取得したファイルをGoogleドライブにcreateFileで保存
    fileData[i][5] = '済';
    fileData[i][6] = DriveApp.createFile(file).getUrl();
  }
  ss.getRange(2,1,fileData.length,fileData[0].length).setValues(fileData);
}

ダウンロードURLを取得するには、ファイルの情報を取得するエンドポイントのURLパラメータとして「?create_download_url=1」が必須です。

APIから返却されたオブジェクトの「download_url」に30秒のみ有効なダウンロードURLが格納されているので、再びUrlfetchApp.fetchメソッドでリクエストし、blob形式で取得します。

取得時にはファイル名が変わっているため、ファイル一覧で取得したファイル名に書き換え、

DriveApp.createFileメソッドでblob形式のファイルを引数に指定して、Googleドライブに保存します。

Google Apps Script(GAS)でチャットワークのファイルのダウンロードURLをUrlfetchAppでリクエストしてファイルを取得し、Googleドライブに保存するサンプルコードを実行した結果、チャットワークの投稿ファイルがGoogleドライブに保存

Googleドライブに保存されたファイルの保存先URLをスプレッドシートに書き出せば、スプレッドシートからファイルにアクセス可能です。

Google Apps Script(GAS)でチャットワークのファイルのダウンロードURLをUrlfetchAppでリクエストしてファイルを取得し、Googleドライブに保存するサンプルコードを実行した結果、チャットワークの投稿ファイルをGoogleドライブに保存した格納先URLをスプレッドシートに出力

まとめ・終わりに

今回、Google Apps Script(GAS)でチャットワークAPIからファイル情報を取得し、ダウンロードURLからファイルを取得してGoogleドライブにファイル保存する方法を紹介しました。

GASのChatWorkClientライブラリでは実行できませんが、チャットワークAPIのファイル取得系のエンドポイントをUrlfetchApp.fetchメソッドでリクエストすることファイル情報を取得できます。

さらにファイルのダウンロードURLを生成し、再びUrlfetchAppでリクエストすればファイルを取得し、Googleドライブに保存することも可能です。

チャットワークのフリープラン(無料版)は過去40日以前のメッセージやファイルが2022年10月から参照できなくなりました。

チャットワークAPIをGASでうまく利用すれば、チャットワークのメッセージに加え、ファイルもGoogleドライブにバックアップできます。

チャットワークのファイルをバックアップしたい場合は、チャットワークAPIとGASを組み合わせて活用してみてください。