見出し画像

【Slack, API】slack-cleanerでSlackのメッセージを一括削除/特定の日付以前を一括削除する

※ 旧ブログ、Frontend Life in DEのリライト記事。
※ 新ブログは Aiki x Developerhttps://aiki-developer.com)へ。

どうもー、ドイツでフリーランスのフロントエンドエンジニアをしています、Arisaです。

さて、最近は技術系記事にはまっていまして、お仕事で取り組んだSlack APIの内容です。

実は以前、Slackで古いチャット自動お掃除botを作成したのですが、(その時の記事はこちら)チャット数の多いコミュニティのSlackでは、機能の稼働時間が5分以上となってしまい、タイムアウトするという5分の壁にぶち当たっていました。

チャット数の少ないコミュニティなら使えるというのでは、現実世界のアクティブなコミュニティでは使い物にならないですね。

これを回避するGASのスクリプトを書くこともできますが、近日中に改善する必要があったので、スクリプトのデバッグよりも時短で、確実にさっと実装できるものを探していました。

ということで、同じAPIを使って、コマンドラインとslack-cleanerで、指定した日にちよりも以前のチャットを一括削除することで対応をした、という備忘録 & チュートリアルです。

おまけで、コマンドラインからAPIを利用してチャットをポストするカスタマイズも書いていますので、参考になれば嬉しいです。

指定の日付より以前のSlackチャンネル上のチャットは削除

pipをインストール

$ sudo easy_install pip

上記コマンドでpipをインストール。

pipとは、Pythonで書かれたパッケージシステムだそう。

Pythonを書かないので、 -v でバージョンチェックをしようとしたら、大文字にする必要があったらしく、Pythonコードの編集になって発狂したのは、どこの誰だったか…笑

pipのアップグレードが必要であれば行う

$ sudo -H pip install --upgrade pip

稀にですが、slack-cleanerのインストールをすると、pipのバージョンが古いからアップデートしなさいと怒られますが、怒られた文面で勧められる $sudo install --upgrade pip は、同じエラー文が出て怒られるだけなので、上記でトライするとうまくいきます。

slack-cleanerのインストール

$ sudo pip install -e git+https://github.com/sgratzl/slack-cleaner.git#egg=slack-cleaner

これも、通常の $ pip install slack-cleaner だとエラーが出て怒られます。

開発者の人が上記が最新だよ、とGithubのフォーラムでも言っているのを見かけたので、上記でインストールすると最近はうまくいくようです。

開発者のGithubにも上記がオススメとアップデートされていますね。

持っているSlackアカウントのtokenを取得

Slack APIの基本中の基本ですが、該当のSlackアカウントのトークンを以下のURLで取得します。

ログインした状態でアクセスすると取得可能。

https://api.slack.com/custom-integrations/legacy-tokens

ただし、トークンは日をまたぐと変化するので、気をつけましょう。

dry-run

#generalのチャンネルのチャットで、2018年9月1日以前のチャットを全て消したい場合は、以下のサンプルのようになります。

YOUR TOKENを先ほど取得したトークンに書き換えます。

$ slack-cleaner --token YOUR TOKEN --message --channel general --user "*" --before 20180901

これが例えば特定チャンネルのチャットを全て消したいということであれば、

$ slack-cleaner --token YOUR TOKEN --message --channel CHANNEL NAME --user "*"

です。

そのほかのオプションの一覧は、Githubに一覧がありますので、そちらを参考にしてください。

個人的には、DM削除がうまくいかなかったのがちょっとスッキリせず…

これは、Message Retension PolicyをSlackのダッシュボードから充てれば済むのかもしれないけど、できればコマンドラインで片付けたい。

それはさておき、この時点では削除対象のテキストの取得をしただけで、実際に削除を実行はしていないので --perform を使って実行。

– – performで実行

$ slack-cleaner --token YOUR TOKEN --message --channel general --user "*" --before 20180901 --perform

先ほどの2018年9月1日以前のチャットを全て消すコマンドの後ろに --perform とつけるだけ。

とっても簡単。

この後にうまくいったよーとログが出て、Slackでもリアルタイムで該当のチャットだけが指定チャンネルの指定日より以前のもの全てが削除されていることが確認ができます。

トラブルシューティング 1

Failed to delete (cant_delete_message)-> のエラー文が出る時

と、うまく上記のようにすんなりいくこともあるのですが、自分で作ったテスト環境でやるとうまくいき、実際の依頼されたSlackで実装するとこんなエラーが出ます。

Failed to delete (cant_delete_message)->

その後にザーッと長いログがあり、チャットが削除されなかったログも出ます。

この原因を考えた時に、テスト環境では 自分がadmin で、adminのユーザーとしてログインしてトークンを発行し、それからコマンドを叩いたんですね。

これは実際に依頼されたSlack、つまり本番環境では自分はadminではなく、一般の何の権限も与えられていないユーザーとしてトークンを発行して実行したので、うまくいかなかったのかもしれない、と思い、権限を Owner(Workspace Owner) に、Slackアカウントの持ち主(adminの人)に変更してもらいました。

権限をWorkspace Ownerにしてもらうと、自分だけではなく、どのユーザーのチャットもDM以外は削除できる権限も与えられるからです。

ステータスをOwnerに変更する手順(adminしかできません)

この状態で上記コマンドを叩くとどうでしょうか?

他のメンバーのチャットも、DM以外は消すことが可能になる権限なので、Workspace Ownerの権限であれば、上記エラー文も吐き出されず、きちんとうまくいきます。

自分で作ったテスト環境で大抵の場合先にテストをしますが、Slackの場合、自分がPrimary Owner(admin)、もしくは開発者向けのWorkspace Ownerでない限りは、Slackからの制限で上記のエラー文が出ます。

クライアントからの依頼である場合は、まずはこの設定をadminにしてもらってから実行するのがおすすめです。

細かいエラーですが、一括削除するチャット数が多いと、実行した後にリクエストが多過ぎ、と怒られて、いくつかのチャットが消せないままということも起こりますが、これは全部消えるまで dry-runと --perform を繰り返せば問題なく消せます。

複数人のDMチャンネルの削除方法

何人かのメンバーに、まとめてLINEのグループチャットのような感じでDMを送ることがSlackでもできます。

こういった複数人がDMを1つの共通チャンネルで送ることができるチャンネルも、Slack APIとslack-clearnerを利用して一括でチャット削除することができます。

ここで少し私がハマったのは、公式Githubにもググっても出てくる usernames が、Slackでの @ユーザー名 なのかがはっきりした情報がなく、トライした結果これではうまくいかなかったこと。

結論から先に言うと、Slack APIで用意されている users.list メソッドを使い、該当Slackに登録しているメンバー全員のリストを取得した後に、 name プロパティの値に格納されている表示ユーザー名ではない、本来の登録ユーザー名を使用する必要がありました。

これですね ↓ 当然ですが、実在するメンバーではなく、Slack APIのドキュメントからお借りしています。

users.list メソッドは、以下のURLから該当Slackのアカウントにログインした状態でアクセスし、

https://api.slack.com/methods/users.list

以下のようにテスタータブに切り替えて、トークンの箇所にログインしたSlackアカウント名が表示されていればOK。

Test methods のボタンを押すとそのSlackに参加しているメンバー全員(退会メンバー含む)の情報リストが画面下で取得できます。

これで登録ユーザー名がわかったところで、グループチャンネルに参加しているユーザー名を文字検索で探したら、以下のコマンドに含めます。

$ slack-cleaner --token YOUR TOKEN --message --mpdirect spengler,james,johndoe --user "*"

ここで大切なのは、必ず自分の登録ユーザー名も含めること。

つまり、自分が参加していないグループチャンネルは、この方法ではチャットメッセージ一括削除が有効ではないと言うことでもありますね。

個人間のDMチャットを消す方法

個人間のDMチャットも、もちろん削除可能です。

ここでも上記の users.list メソッドで登録ユーザー名を取得。

ただし気をつけるべきこととして、必ず自分の登録ユーザー名は後ろに書くことで、エラーを防ぐことができます。

こんな感じのコードです。

$ slack-cleaner --token YOUR TOKEN --message --direct sherry --user YOUR USER NAME

あと、DMチャットメッセージでは、特定の日付指定より以前のチャットのみ削除できなかったため、必然的に選択肢としては全削除になります。

そしてなぜだか自分のチャットだけは消せて、相手のチャットが消せないのはモヤっとします…

でも、この件に関しては、今後slack-cleanerの方で改善してくれることを願って、Message Retension PolicyでSlackの設定画面から、特定の期間を過ぎたDMは自動削除する設定をすることでも対処できますしね。

ただし、Message Retension Policyの上記設定は、有料プランしか使えないので、裏技としては、adminが30日間のメンバー全員適応の有料プランお試し無料体験を以下のURLページから申し込むと、適応されている期間中に、設定しておけばいいかな、と思います。

https://get.slack.help/hc/en-us/articles/202878523-Try-a-paid-plan-for-free

アップグレードしなければ、そのまま無料枠に戻れるので、設定もこの説明を見る限りでは、Message Retension Policyの設定に関しては、そのまま保持できそうです。

(※ Message Retension Policyの設定方法は、Slack上でクリックと選択だけで完結するのと、すでにたくさん方法を書いている記事があるので割愛します。)

ここまで、通常チャンネルの指定日時より以前のチャット削除方法、複数人のグループチャンネルのチャット削除方法、DMのチャット削除方法を紹介しましたが、プライベートチャンネルやそのほかオプションも、もちろん上記同様簡単に削除できます。

そのほかオプションについては、公式のslack-cleaner作成者がリリースしているGithubドキュメントを確認することを勧めます。

トラブルシューティング 2

上記で様々なチャンネルのチャット削除方法を紹介しましたが、実は大きなコミュニティのSlackだと以下のようなことが起こります。

すでに有料プラン切り替え催促のポップアップ表示が出ている場合、ポップアップより以前のチャットを取得できない… !


要するに、Slackでは10,000以上チャット数を超えた場合には、有料プラン切り替えのポップアップがチャンネルチャット画面上部に出て、そのポップアップより以下に最新の10,000チャットしか表示されなくなるのです。

slack-cleanerとSlack APIでポップアップよりも以前のメッセージにアクセスできるかな?と思って実行したところ、できない…!

現在表示されているチャットを頑張ってたくさん消しても、やっぱり過去のチャットをモリモリ消さないと有料プランに切り替えろと催促するポップアップが消えるまでに到達は難しそう…

と言うことでポップアップ以前のチャットにアクセスできない仕組みを調べたところ、こういうことでした。

Slack APIの channels.history メソッドを以下のURLで確認すると、こんなことが書いてありますね。

is_limited と言うおそらくリストの中にあるプロパティが true の値を保持していると、あの有料プラン催促のポップアップが頑固に立ちはだかるようです。

上記URLから、該当チャンネルのIDを、チャンネルのページを開いた状態のURL(全て大文字の後半数桁箇所です)から取得して、テスターで実行すると、やっぱりあります。

こんな感じです。

これはSlack APIのドキュメントなので、有料プランという前提で is_limited の記載がありませんが、矢印の箇所に無料枠だと "is_limited": true と表示が確認できます。

(ご自分で参加、もしくはお持ちのSlackアカウントでサインインした状態で上記URLで実行すると、上記URLのテスト結果が画面下に表示され、確認できます。)

流石にこれをfalseに値を変えたり、この項目を上記のように消すにはSlack APIからではアクセス & 書き換えできないので、(できたら誰でもAPI操作で有料枠を無料で使えてしまいますね 笑)上記項目の「個人間のDMチャットを消す方法」で紹介した、有料プラン無料お試し30日間体験の申請をして、その隙にポップアップが消えている間に古いチャットを削除するとスッキリしました。

どんだけ無料枠にしがみついたいんだと、思われた人もいますよね。

でも払いたくないんです 笑

コミュニティの数が100人以上のSlackであれば、スタンダードプランでも月額$6.25を参加メンバーが全員それぞれ負担しないといけないので、$6.25 x 100人は、単純に考えて月額結構な金額だと思います。

メンバーの中からも、「今まで無料だったから参加してたけど、有料になるならもういいや」と、離脱する可能性も非常に高いです。

自分のコミュニティならまだしも、オンラインサロンなどを運営されていてSlackを利用している方であれば、なるべく参加メンバーの負担を減らしたいのが本音だと思います。

かつ、Slackお掃除しようかな、と思い始めるのは、この有料プラン催促ポップアップが出てから大体思うのです。

ポップアップが出る直前にできればまだいいのですが、そうとも限らないことも多いですし、ポップアップが出てから依頼されることだってあるわけです。

なので30日間余裕がある中で、ポップアップより以前のチャットにアクセスできるようにし、その間にチャットをごっそりslack-cleanerとAPIで掃除したり、DMチャットを一定期間が過ぎたら削除するMessage Retension Policyの設定をしたり、無料体験の有料プランでできることを設定できればいいかなと、私は思います。

curlでSlackチャンネルにメッセージを遠隔から投稿

さて、ここからはおまけですが、遠隔でコマンドラインからチャットをポストすることもできるので、簡単にその方法も紹介します。

administration -> manage apps

curl のコマンドライを使う前に、いくつかSlackで設定をしておきたいことがあります。

まずはSlackにログインした画面で、画面左上のツールメニューから administration -> manage apps を選択します。

Brouse the app directory

次に、 Apps を選択したら、検索箇所に Incoming WebHooks と記入して、該当アプリを選択します。

add configuration

以下の Add Configuration を選択。

投稿するチャンネル選択

メッセージを投稿するチャンネルを選択。

表示されるURLをコピー & Example箇所のコマンドを叩く

画面上部にURLが表示されるので、それをカスタマイズに合わせて使っていきます。

画面下の Example の項目箇所にコマンドがあるので、取得したURLと組み合わせて、以下のようなコマンドを打ちます。

$curl -X POST -H 'Content-type: application/json' --data '{"text":"ここにテキストを書くと#generalのチャット画面に表示されます。"}' YOUR_WEBHOOK_URL

レスポンスがコマンドライン上で ok と返って来ればうまくいっています。

もちろん #general のチャンネル上でも確認できます。

おまけなので超ざっくりの説明でしたが、コマンドラインとAPIだけでメッセージが一括削除

できたり、投稿できたりするのは非常に便利ですね。

Slackを利用しているコミュニティの活発な活動を促進するためにも、この情報がお役に立てれば幸いです。

では、ちゅーす

この記事が気に入ったらサポートをしてみませんか?