PowerShell から slack の古いファイルを一括で削除する
無料版 slack の容量が逼迫してきたので、 api 経由で特定チャンネル内の一定日時以前のファイルを一括削除してみました。PowerShell で実装している情報が見つからなかったこともあり、備忘録を兼ねた初投稿です。
slack 側の準備(アプリの設定)
slack API にアクセスして新規にアプリを作成します。
まずは OAuth & Permissions のセクションに行き、アプリが操作できる範囲(スコープ)を設定します。今回はファイルの読み書きなので files:read
と files:write
を指定。User Token Scopes は何も指定しなくても動作しました(いまだに2種類のスコープの違いがよくわかっていません…)。
スコープを設定するとアプリをワークスペースにインストールするようにメッセージが表示されるので、それに従うと slack 側でもアプリが表示されるようになります。
ファイルを削除したいチャンネルの「チャンネル詳細」からアプリを追加しましょう。
最後に、チャンネルIDと削除対象のファイルをアップロードしたユーザーのIDを取得します。
- チャンネルID: サイドバーから対象チャンネルを右クリックして「リンクをコピー」→コピーされた URL の最後の英数9桁がIDです。
- ユーザーID: メンバーディレクトリからプロフィールを表示し、「その他」のメニューからコピーできます。
以上で準備は完了です。
PowerShell 側のコード
function getOldFiles {
[int]$timestamp_to = ((Get-Date "2019/12/31") - [datetime]::new(1970,1,1,9,0,0,0)).ToTalseconds
$params = @{
token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; <# OAuth Access Token #>
channel = "XXXXXXXXX"; <# チャンネルID #>
ts_to = $timestamp_to;
count = 1000; <# 最大件数 #>
user = "XXXXXXXXX"; <# ユーザーID #>
}
Invoke-RestMethod -Body $params -Method Post "https://slack.com/api/files.list"
}
function removeFile ([string]$id) {
$params = @{
token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; <# OAuth Access Token #>
file = $id;
}
Invoke-RestMethod -Body $params -Method Post "https://slack.com/api/files.delete"
}
(getOldFiles).files | ForEach-Object {
"REMOVED: {0}" -f $_.name
removeFile($_.id) > $null
} | Out-File result.txt
この例では2019年12月31日以前のファイルを一括削除しています。
PowerShell では 現在のUNIX時間を直に取得できないようです。1970年1月1日からの秒数を計算することで対処しました。
token
にはアプリの OAuth Tokens & Redirect URLs で確認できる OAuth Access Token
を指定します。最初、下の Bot User OAuth Access Token をしていたためにエラーが出てハマりました。
最後の部分では削除したファイル名をテキストファイルに出力するようにしています。ファイルは削除してしまうと復元できないようですのでご注意ください。
環境:
> $PSVersionTable
Name Value
---- -----
PSVersion 7.1.0
PSEdition Core
GitCommitId 7.1.0
OS Microsoft Windows 10.0.18363
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
Discussion