チャネル内のすべてのメッセージ(〜8K)をスラッククリーンします


85

現在、最大8Kのメッセージを含むSlackチャネルがあり、すべてJenkins統合からのものです。そのチャネルからすべてのメッセージを削除するプログラム的な方法はありますか?Webインターフェースは、一度に100個のメッセージしか削除できません。

回答:


71

私はすぐに誰かがすでにヘルパーを作っていることに気づきました:これのためのスラッククリーナー

そして私にとってそれはただです:

slack-cleaner --token=<TOKEN> --message --channel jenkins --user "*" --perform


別のオプションはnpmから来ていますが、まだ試していません。
ハン2015

1
トークンとチャンネルはどこにありますか?
kk78626 2016年

6
--user "*"それを機能させるためにも必要です。また、実際に削除タスクを実行する場合は、を追加する必要があり--performます。
Shayan Salehian 2017

7
github.com/sgratzl/slack-cleanerのフォークはより活性である等の特徴含ま--quietSTDOUTに削除されるすべてのメッセージを表示しないようにします。
困惑

24

パブリック/プライベートチャネルおよびチャットからメッセージを削除するための簡単なノードスクリプトを作成しました。変更して使用することができます。

https://gist.github.com/firatkucuk/ee898bc919021da621689f5e47e7abac

まず、スクリプト構成セクションでトークンを変更してから、スクリプトを実行します。

node ./delete-slack-messages CHANNEL_ID

OAuthトークンを取得します。

  1. https://api.slack.com/appsにアクセスます
  2. [新しいアプリの作成]をクリックして、(一時的な)アプリに名前を付けます。
  3. サイドナビゲーションで、[Oauthとアクセス許可]に移動します
  4. そのページで、「スコープ」セクションを見つけます。[OAuthスコープの追加]をクリックし、[channels:history]と[chat:write]を追加します。(スコープを参照)
  5. ページの上部にある[アプリをワークスペースにインストール]をクリックします。確認し、ページの再読み込み時に、OAuthアクセストークンをコピーします。

チャネルIDを見つける

また、ブラウザでSlackを開くと、ブラウザのURLにチャネルIDが表示されます。例えば

https://mycompany.slack.com/messages/MY_CHANNEL_ID/

または

https://app.slack.com/client/WORKSPACE_ID/MY_CHANNEL_ID

2
それをありがとう。私が気づいたことの1つは、いくつかのメッセージが削除された後、速度が低下することです。
Bertl 2018年

3
一般的に、レート制限があります。そのため、一定期間が経過すると、削除操作が停止または遅くなります。
FıratKÜÇÜK

2
チャームのように機能します!これをありがとう!
brianrhea

1
それを使って、簡単で、甘い。上記の回答は現在、サポートされなくなったレガシートークンを使用することを示していますが、Firatはすでにその情報で要点自体を更新しており、必要なOAuthスコープのリストを提供していることに注意してください。だった驚くスコープ-私はトーキン100秒のリストを取得するOAuthのトークンに必要なスラックアプリを作成して追加するには、クイック・簡単N。
ダリン

23

デフォルトのcleanコマンドが機能せず、次のエラーが発生しました。

$ slack-cleaner --token=<TOKEN> --message --channel <CHANNEL>

Running slack-cleaner v0.2.4
Channel, direct message or private group not found

しかし、以下はボットメッセージをクリーンアップするために問題なく機能しました

slack-cleaner --token <TOKEN> --message --group <CHANNEL> --bot --perform --rate 1 

または

slack-cleaner --token <TOKEN> --message --group <CHANNEL> --user "*" --perform --rate 1 

すべてのメッセージをクリーンアップします。

HTTP 429 Too Many RequestsAPIレート制限が緩いためにエラーが発生しないように、1秒のレート制限を使用します。どちらの場合も、チャネル名は#記号なしで指定されました


11

!!更新!!

@ niels-van-reijmersdalがコメントで述べたように。

この機能は削除されました。詳細については、このスレッドを参照してください:twitter.com/slackhq/status/467182697979588608?lang = en

!!更新終了!!

これはツイッターのSlackHQからの良い答えであり、サードパーティのものがなくても機能します。 https://twitter.com/slackhq/status/467182697979588608?lang=en

特定のチャネルのアーカイブ(http://my.slack.com/archives)ページから一括削除できます。メニューで[メッセージの削除]を探します


1
ただそれをそこに出すと、これはチャンネルに対してのみ機能し、ダイレクトメッセージに対しては機能しません。
TheRodeo 2017

1
これにより、その時点で最後の10個のメッセージのみが削除されます
MatPag 2017年

1
いいえ、以前はこの方法で多くのメッセージを削除していました。100くらいでした。
ブラゲ2017年

1
使っただけです。最初は10しか表示されなかったが、削除すると残りが表示された(チャネルのメッセージ数は合計で100未満だったため、100に制限される可能性があります)。
アルビン2017年

6
これは私にはうまくいかないようです。それはにリダイレクトします。http:// <TEAMNAME> .slack.com /メッセージ/ <メッセージID>(が表示されますが、私が見る最後のチャネルであることを)
悪魔の支持者

10

プログラムでそれを行う必要がない他の人のために、ここに簡単な方法があります:

(おそらく有料ユーザーのみ)

  1. Webまたはデスクトップアプリでチャネルを開き、歯車(右上)をクリックします。
  2. 「追加オプション...」を選択して、アーカイブメニューを表示します。ノート
  3. 「チャネルメッセージ保持ポリシーを設定する」を選択します。
  4. 「特定の日数の間、すべてのメッセージを保持する」を設定します。
  5. この時間より古いメッセージはすべて完全に削除されます!

私は通常、このオプションを「1日」に設定して、何らかのコンテキストでチャンネルを終了します。次に、上記の設定に戻り、保持ポリシーを「デフォルト」戻して、今後も保存を続けます

注:
ルークは指摘します:オプションが非表示の場合:グローバルワークスペースの管理設定、メッセージの保持と削除に移動し、[ワークスペースのメンバーにこれらの設定を上書きさせる]をオンにする必要があります


2
実際には隠されているだけです。表示するには、グローバルワークスペースの管理設定、メッセージの保持と削除に移動し、[ワークスペースメンバーにこれらの設定を上書きさせる]をオンにする必要があります。
ルーク

おかげで、私はあなたのコメントを含めるために更新しました。また、遡及的に削除するための開発時間に対してSlackに支払うことも提案しましたが、エンタープライズ版以外では不可能であるとのことでした(データを保存する環境が異なるため)。
Hicsy

@Hicsyが述べたように、「メッセージの保持と削除」オプションは「有料機能」です
Phil

4

オプション11日後にメッセージを自動的に削除するようにSlackチャネルを設定できますが、少し隠されています。まず、Slackワークスペースの設定、メッセージの保持と削除に移動し、[ワークスペースのメンバーにこれらの設定を上書きさせる]をオンにする必要があります。その後、Slackクライアントでチャネルを開き、歯車をクリックして、[メッセージの保持を編集...]をクリックします。

オプション2他の人が言及したslack-cleanerコマンドラインツール。

オプション3以下は、プライベートチャネルをクリアするために使用する小さなPythonスクリプトです。削除をよりプログラムで制御したい場合は、出発点として適しています。残念ながら、Slackには一括削除APIがなく、個々の削除のレートが1分あたり50に制限されているため、やむを得ず長い時間がかかります。

# -*- coding: utf-8 -*-
"""
Requirement: pip install slackclient
"""
import multiprocessing.dummy, ctypes, time, traceback, datetime
from slackclient import SlackClient
legacy_token = raw_input("Enter token of an admin user. Get it from https://api.slack.com/custom-integrations/legacy-tokens >> ")
slack_client = SlackClient(legacy_token)


name_to_id = dict()
res = slack_client.api_call(
  "groups.list", # groups are private channels, conversations are public channels. Different API.
  exclude_members=True, 
  )
print ("Private channels:")
for c in res['groups']:
    print(c['name'])
    name_to_id[c['name']] = c['id']

channel = raw_input("Enter channel name to clear >> ").strip("#")
channel_id = name_to_id[channel]

pool=multiprocessing.dummy.Pool(4) #slack rate-limits the API, so not much benefit to more threads.
count = multiprocessing.dummy.Value(ctypes.c_int,0)
def _delete_message(message):
    try:
        success = False
        while not success:
            res= slack_client.api_call(
                  "chat.delete",
                  channel=channel_id,
                  ts=message['ts']
                )
            success = res['ok']
            if not success:
                if res.get('error')=='ratelimited':
#                    print res
                    time.sleep(float(res['headers']['Retry-After']))
                else:
                    raise Exception("got error: %s"%(str(res.get('error'))))
        count.value += 1
        if count.value % 50==0:
            print(count.value)
    except:
        traceback.print_exc()

retries = 3
hours_in_past = int(raw_input("How many hours in the past should messages be kept? Enter 0 to delete them all. >> "))
latest_timestamp = ((datetime.datetime.utcnow()-datetime.timedelta(hours=hours_in_past)) - datetime.datetime(1970,1,1)).total_seconds()
print("deleting messages...")
while retries > 0:
    #see https://api.slack.com/methods/conversations.history
    res = slack_client.api_call(
      "groups.history",
      channel=channel_id,
      count=1000,
      latest=latest_timestamp,)#important to do paging. Otherwise Slack returns a lot of already-deleted messages.
    if res['messages']:
        latest_timestamp = min(float(m['ts']) for m in res['messages'])
    print datetime.datetime.utcfromtimestamp(float(latest_timestamp)).strftime("%r %d-%b-%Y")

    pool.map(_delete_message, res['messages'])
    if not res["has_more"]: #Slack API seems to lie about this sometimes
        print ("No data. Sleeping...")
        time.sleep(1.0)
        retries -= 1
    else:
        retries=10

print("Done.")

パブリックチャネルを一覧表示およびクリアするには、スクリプトを変更する必要があることに注意してください。それらのAPIメソッドは、グループではなくチャネル*です。*



1

他の回答がほのめかしているように、Slackのレート制限はこれをトリッキーにします-レート制限は彼らのchat.delete APIに対して比較的低く、1分あたり最大50リクエストです。

レート制限を尊重する最善の戦略は、クリアするチャネルからメッセージを取得してから、1分間隔で実行される50未満のバッチでメッセージを削除することです。

Autocodeで簡単にフォークしてデプロイできるこのバッチ処理の例を含むプロジェクトを構築しました-スラッシュコマンドを使用してチャネルをクリアできます(もちろん、コマンドへのアクセスを特定のユーザーのみに制限できます!)。/cmd clearチャネルで実行すると、そのチャネルにクリアのマークが付けられ、チャネル内のすべてのメッセージが削除されるまで、毎分次のコードが実行されます。

console.log(`About to clear ${messages.length} messages from #${channel.name}...`);

let deletionResults = await async.mapLimit(messages, 2, async (message) => {
  try {
    await lib.slack.messages['@0.6.1'].destroy({
      id: clearedChannelId,
      ts: message.ts,
      as_user: true
    });
    return {
      successful: true
    };
  } catch (e) {
    return {
      successful: false,
      retryable: e.message && e.message.indexOf('ratelimited') !== -1
    };
  }
});

完全なコードと独自のバージョンをデプロイするためのガイドは、https//autocode.com/src/jacoblee/slack-clear-messages/で確認できます


0

Pythonが好きで、Slack APIからレガシーAPIトークンを取得している場合は、次の方法でユーザーに送信したすべてのプライベートメッセージを削除できます。

import requests
import sys
import time
from json import loads

# config - replace the bit between quotes with your "token"
token = 'xoxp-854385385283-5438342854238520-513620305190-505dbc3e1c83b6729e198b52f128ad69'

# replace 'Carl' with name of the person you were messaging
dm_name = 'Carl'

# helper methods
api = 'https://slack.com/api/'
suffix = 'token={0}&pretty=1'.format(token)

def fetch(route, args=''):
  '''Make a GET request for data at `url` and return formatted JSON'''
  url = api + route + '?' + suffix + '&' + args
  return loads(requests.get(url).text)

# find the user whose dm messages should be removed
target_user = [i for i in fetch('users.list')['members'] if dm_name in i['real_name']]
if not target_user:
  print(' ! your target user could not be found')
  sys.exit()

# find the channel with messages to the target user
channel = [i for i in fetch('im.list')['ims'] if i['user'] == target_user[0]['id']]
if not channel:
  print(' ! your target channel could not be found')
  sys.exit()

# fetch and delete all messages
print(' * querying for channel', channel[0]['id'], 'with target user', target_user[0]['id'])
args = 'channel=' + channel[0]['id'] + '&limit=100'
result = fetch('conversations.history', args=args)
messages = result['messages']
print(' * has more:', result['has_more'], result.get('response_metadata', {}).get('next_cursor', ''))
while result['has_more']:
  cursor = result['response_metadata']['next_cursor']
  result = fetch('conversations.history', args=args + '&cursor=' + cursor)
  messages += result['messages']
  print(' * next page has more:', result['has_more'])

for idx, i in enumerate(messages):
  # tier 3 method rate limit: https://api.slack.com/methods/chat.delete
  # all rate limits: https://api.slack.com/docs/rate-limits#tiers
  time.sleep(1.05)
  result = fetch('chat.delete', args='channel={0}&ts={1}'.format(channel[0]['id'], i['ts']))
  print(' * deleted', idx+1, 'of', len(messages), 'messages', i['text'])
  if result.get('error', '') == 'ratelimited':
    print('\n ! sorry there have been too many requests. Please wait a little bit and try again.')
    sys.exit()


-2

これは、Slackチャネル/グループ/ IMメッセージを一括削除するための優れたChrome拡張機能です-https://slackext.com/deleter、スター、時間範囲、またはユーザーでメッセージをフィルタリングできます。ところで、最近のバージョンではすべてのメッセージの読み込みもサポートしているので、必要に応じて最大8kのメッセージを読み込むことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.