Skip to content

Instantly share code, notes, and snippets.

@AWtnb
Last active February 25, 2019 13:51
Show Gist options
  • Select an option

  • Save AWtnb/5b1d4d70c59dd3935ea79c179f8dbc94 to your computer and use it in GitHub Desktop.

Select an option

Save AWtnb/5b1d4d70c59dd3935ea79c179f8dbc94 to your computer and use it in GitHub Desktop.
delete old file of slack
/*
slack の特定チャンネルで古くなったファイルを自動的に削除する
http://lyncs.hateblo.jp/entry/2017/06/04/191421 を参考に見よう見まねで実装中
*/
// スクリプトのプロパティからトークンの値をグローバル変数として取得
var SLACK_ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("TOKEN_PERSONAL");
// チャンネルIDを取得する関数
// mode : public(パブリックチャンネル) or private (プライベートチャンネル)
function getID(mode,name) {
if (mode == "public") {
var URL = 'https://slack.com/api/channels.list?token=';
}
else if (mode =="private") {
var URL = 'https://slack.com/api/groups.list?token=';
}
var res = UrlFetchApp.fetch(URL + SLACK_ACCESS_TOKEN);
var list = JSON.parse(res.getContentText());
if (mode == "public") {
var isFound = list.channels;
}
else if (mode == "private") {
var isFound = list.groups;
}
// チャンネル名でIDを探す
var foundId = '';
isFound.some(function(channels){
if (channels.name.match(name)){
foundId = channels.id;
return true;
}
});
return foundId;
}
// 指定条件に合致するファイル一覧を取得する関数
function filesList(data){
var params = {
'token' : SLACK_ACCESS_TOKEN,
'channel': data.channel,
'ts_to' : data.ts_to,
'count' : data.count
}
var options = {
'method' : 'POST',
'payload': params
}
var res = UrlFetchApp.fetch('https://slack.com/api/files.list',options);
return JSON.parse(res.getContentText());
}
// ファイルを削除する関数
function filesDelete(id){
var params = {
'token': SLACK_ACCESS_TOKEN,
'file' : id
}
var options = {
'method' : 'POST',
'payload': params
}
var res = UrlFetchApp.fetch('https://slack.com/api/files.delete',options);
return JSON.parse(res.getContentText());
}
// 日数をUNIX時間に変換する関数
function daysToUnixTime(days){
var date = new Date();
var now = Math.floor(date.getTime()/ 1000); // unixtime[sec]
return now - 8.64e4 * days + '' // 8.64e4[sec] = 1[day] 文字列じゃないと動かないので型変換している
}
// 指定チャンネル内で特定日数より以前にアップロードされたファイルを削除する関数
function deleteOldFile(channelName) {
// スクリプトのプロパティからログ送信用のアドレスを取得しておく
var LOG_ADDRESS = PropertiesService.getScriptProperties().getProperty("MAIL");
// 遡る日数
const days = 14;
// ID取得(trueが返ったほうが代入される)
var channelId = getID("public", channelName) || getID("private",channelName);
if(!channelId){
return -1; //見つからなければ終了
}
// 条件にマッチするファイルのリストを取得して削除
var options = {
channel: channelId,
ts_to : daysToUnixTime(days),
count : 1000
}
filesList(options).files.forEach(function(val){
var data = filesDelete(val.id);
if (data.error) {
MailApp.sendEmail(LOG_ADDRESS, 'delete error log', 'Failed to delete file ' + val.name + ' Error: ' + data.error);
}
else {
MailApp.sendEmail(LOG_ADDRESS, 'deletelog', 'Deleted file "' + val.name + '"(' + val.id + ')');
}
});
}
// スクリプトのプロパティからチャンネル・グループの名称を検索して古いファイルを削除する関数
function oldFileCleaner(){
const targetChannels = PropertiesService.getScriptProperties().getProperty("TARGET_PERSONAL").split(",");
targetChannels.forEach(deleteOldFile);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment