読者です 読者をやめる 読者になる 読者になる

slackのログをGoogle Driveに保存

Slackを無料アカウントで利用すると、
10,000発言しか残らないらしい。

でも、一括でエクスポートするAPIが提供されているので、
こまめに保存しておけばOK。

GoogleDriveに保存してみた。

GASはじめて触ったけど、クーロン実行もぽちぽちするだけでとっても便利でした。

//*********************************************************************/
//   Slackのログを一括保存
//-------------------------------------------------
//   
//*********************************************************************/
function excSaveLog() {
  //   定数 
  var SLACK_BASE_URL   = "https://slack.com/api";
  var SLACK_API_TOKEN  = "YourSlackAPI Token";
  var LOG_SAVE_FOLDER  = "YourSave Folder";
  var SAVE_PERIOD_HOR  = 2;
  
  //処理開始
  Logger.log("=====   START   =====")
  
  //
  var CHANNEL_LIST_URL = SLACK_BASE_URL + "/channels.list?token=" + SLACK_API_TOKEN;
  var CHANNEL_HIST_URL = SLACK_BASE_URL + "/channels.history?token=" + SLACK_API_TOKEN;
  var datNow           = Utilities.formatDate(new Date() , 'Asia/Tokyo' , 'yyyy_MM_dd_HH_mm_ss');  
  
  //チャンネルリスト取得
  var objChListJson = getJson(CHANNEL_LIST_URL);
  //保存
  saveAsText("ChannelList_" + datNow + ".json"
             ,objChListJson
             ,LOG_SAVE_FOLDER);
  //チャンネルループ
  for(var idxCh = 0; idxCh < objChListJson.channels.length; idxCh++){
    Logger.log(objChListJson.channels[idxCh].name);
    var objChHistJson = getJson(
                           getChannelHistroyURL(CHANNEL_HIST_URL,
                                                objChListJson.channels[idxCh].id,
                                                SAVE_PERIOD_HOR)
                        );
    //保存
    saveAsText( objChListJson.channels[idxCh].name + "_" + getTimePeriodString(SAVE_PERIOD_HOR) + ".json"
               ,objChHistJson
               ,LOG_SAVE_FOLDER);
  }
  
  //処理終了
  Logger.log("=====   END   =====")
}

//*************************************************/
// JSON取得
//--------------------------------------------
// return Json or false
//*************************************************/
function getJson(JSON_URL){
  var Response = UrlFetchApp.fetch(JSON_URL);
  var JsonStr  = Response.getContentText(); 
  if (JsonStr.length > 0){
    return JSON.parse(JsonStr);
  } else {
    return false;
  };
}
//**************************************************/
//   JsonObjectをテキストファイルに保存
//**************************************************/
function saveAsText(FileName,
                    JsonObject,
                    SaveFolderName){
  var txtfile = DriveApp.createFile(FileName, JSON.stringify(JsonObject), MimeType.PLAIN_TEXT);
  var folders = DriveApp.getFoldersByName(SaveFolderName);
  var file    = DriveApp.getFileById(txtfile.getId());
  if(folders.hasNext()){
    var folder = folders.next();
    var newfile = file.makeCopy(folder);
    newfile.setName(FileName);
    DriveApp.removeFile(file);
  }
}
//**************************************************/
//   履歴取得URL
//**************************************************/
function getChannelHistroyURL(BaseUrl,
                              ChannelId,
                              PeriodHour){
  //LatestTime算出
  var latTime = Math.floor( new Date().getTime() / 1000 );
  latTime = latTime - (3600 * PeriodHour);
  latTime = Math.round(latTime / (3600 * PeriodHour)) * (3600 * PeriodHour);
  
  //OldestTime
  var OldTime = latTime - (3600 * PeriodHour);
  
  var retUrl = BaseUrl;
  retUrl = retUrl + "&channel=" + ChannelId;
  retUrl = retUrl + "&latest="  + latTime;
  retUrl = retUrl + "&oldest="  + OldTime;
  
  return retUrl;
}
//**************************************************/
//   期間表示用文字列取得
//**************************************************/
function getTimePeriodString(PeriodHour){
  //LatestTime算出
  var latTime = Math.floor( new Date().getTime() / 1000 );
  latTime = latTime - (3600 * PeriodHour);
  latTime = Math.round(latTime / (3600 * PeriodHour)) * (3600 * PeriodHour);
  
  //OldestTime
  var OldTime = latTime - (3600 * PeriodHour);
  
  var retStr = "";
  retStr = retStr + Utilities.formatDate(new Date(OldTime * 1000) , 'Asia/Tokyo' , 'yyyy_MM_dd_HHmm');
  retStr = retStr + "to"
  retStr = retStr + Utilities.formatDate(new Date(latTime * 1000) , 'Asia/Tokyo' , 'HHmm');
  
  return retStr;
}