slackでgeneralの投稿を全削除する

最近slackも日本語化して、海外との槍とも多いことからchatworkからslackへ移行しています。
slackは概ね満足なのですが、1点不満を言うとすれば、ワークスペースという一旦大きなくくりを作らないといけないので、LINEのグループみたいなものを作る点がやや億劫です。
ですが、その点を除けば、概ね機能性は他のサービスの上位互換な気がしています。。。

Slackを仕事で暫く使用しているとると困ったことが発生しました。
それは、generalというデフォルトのチャネルに関してで、全メンバー公開のこのチャネルに色々投稿していたのですが、プロジェクトの途中に権限レベルの異なるメンバーが参加し、そのメンバには見せられない情報をgeneralに投稿してしまっていたからで、当初はgeneralにアクセス制限かければと考えたのですがどうにもそれはできない仕様になっており別の対策をする必要が発生しました。

ということで、今回は以下の対応を取りました。

1. generalの内容をエクスポート
2. generalの内容を別のプライベートチャネルにインポート
3. generalの内容を全削除


1と2はslackの機能で対応可能です。
3は対応できなかったのでPythonで削除することにしました(もちろん手動で一つ一つ削除することは可能です)

なお、以下の手順は実行者がオーナーの場合を想定しています。
権限が無ければエクスポート等できない操作があります。


1.generalの内容をエクスポート
以下にアクセスして「エクスポートを開始」をクリックします。
データのエクスポート

※ 事前にワークスペースにログインしておく必要があります。

そのまま準備が完了するまで待ちます。
適当なタイミングで画面リフレッシュ(F5)すると「ダウンロード可能」の文言が現れますのでこれをクリックするとエクスポートファイルをダウンロードできます。

(参考)
ワークスペースの管理


2.generalの内容を別のプライベートチャネルにインポート
以下にアクセスして「Slack」行の「インポート」ボタンをクリックします。
データのインポート

「ファイルを選択」ボタンをクリックして先ほどエクスポートしたファイルを選択し、
「インポートを開始する」をクリックします。

そのまま準備が完了するまで待ちます。
適当なタイミングで画面リフレッシュ(F5)すると「必要な情報」の文言が現れますのでこれをクリックします。


ユーザーとチャネルについてどのようなインポートを実施するか聞かれますので、
ユーザーについては「ユーザーをスキップし、そのメッセージをインポートしない」を選択します。



チャネルについては「general」を別のプライベートチャネルに移したいので「新しいプライベートチャンネルを作成」を選択します。
それ以外は「チャンネルをスキップする(インポートしない)」を選択します。



設定が終わったら「変更を保存する」ボタンをクリックします。


次の画面で「はい、このインポートを続行します」ボタンをクリックします。


これでインポートが実行されgeneral2というプライベートチャネルにgeneralの内容がインポートされます。


3.generalの内容を全削除

ココはpythonプログラムを書きます。
pythonを知っていることが前提になるので分からない場合は手で削除するしかないと思われます(もっとスマートな方法があるのかもしれませんが私は見つけられず。。。)。
尚、Python3.5前提です。

先ずはトークンを入手します。
(ここは説明しているWebサイトが多いので簡単に)
以下ページにアクセスして「Create token」ボタンをクリックすれば入手できます。
Legacy tokens
※ ワークスペースにオーナー等の権限を持つユーザでログインしておく必要があります

次にpyhotn1プログラムを作成実行します。
slack api利用のためのパッケージslackclientをインストールします。
> pip install slackclient

以下のプログラムを実行します。
<トークン>の部分には先ほど取得したトークンを記載します。

------
import time
from slackclient import SlackClient
slack_client = SlackClient('<トークン>')
target_channel ="general"

def list_channels():
    channels_call = slack_client.api_call("channels.list")
    if channels_call.get('ok'):
        return channels_call['channels']
    return None

def channel_info(channel_id):
    channel_info = slack_client.api_call("channels.info", channel=channel_id)
    if channel_info:
        return channel_info['channel']
    return None

if __name__ == '__main__':
    channels = list_channels()
    if channels:
        for channel in channels:
            print(channel['name'])
            if channel['name'] != target_channel:
                continue            while True:
                detailed_info = channel_info(channel['id'])
                if not detailed_info['latest']:
                    break                message_ts = detailed_info['latest']['ts']
                slack_client.api_call("chat.delete", channel=channel['id'], ts=message_ts)
                time.sleep(1)
    else:
        print("Unable to authenticate.")

これで1秒ごとにメッセージが削除されていきます。


コメント

このブログの人気の投稿

Python SQLite スレッド間でコネクションの使いまわしは出来ない

Google location history(JSON形式)をCSVファイルにする