Bereinigen Sie alle Nachrichten (~ 8K) in einem Kanal

82

Wir haben derzeit einen Slack-Kanal mit ~ 8K-Nachrichten, die alle aus der Jenkins-Integration stammen. Gibt es eine programmatische Möglichkeit, alle Nachrichten von diesem Kanal zu löschen? Die Weboberfläche kann jeweils nur 100 Nachrichten löschen.

Hann
quelle

Antworten:

71

Ich fand schnell heraus, dass jemand bereits einen Helfer gemacht hat: Slack-Cleaner dafür.

Und für mich ist es nur:

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

Hann
quelle
Eine andere Option kommt von npm , habe es aber noch nicht ausprobiert.
Hann
1
Wo finde ich meinen Token und Kanal?
kk78626
6
--user "*"ist auch notwendig, damit es funktioniert. Auch wenn Sie die Entfernungsaufgabe tatsächlich ausführen möchten, sollten Sie hinzufügen --perform.
Shayan Salehian
6
Die Gabel github.com/sgratzl/slack-cleaner ist aktiver und enthält Funktionen, --quietmit denen nicht jede Nachricht angezeigt wird, die auf stdout gelöscht wird.
Verwirrung
23

Ich habe ein einfaches Knotenskript zum Löschen von Nachrichten aus öffentlichen / privaten Kanälen und Chats geschrieben. Sie können es ändern und verwenden.

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

Ändern Sie zuerst Ihr Token im Abschnitt zur Skriptkonfiguration und führen Sie dann das Skript aus:

node ./delete-slack-messages CHANNEL_ID

Sie können Ihr Token unter der folgenden URL lernen:

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

Außerdem wird die Kanal-ID in die URL-Leiste des Browsers geschrieben.

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

Fırat KÜÇÜK
quelle
2
Dank dafür. Eine Sache, die mir auffällt, ist, dass es langsamer wird, nachdem einige Nachrichten gelöscht wurden.
Bertl
3
Im Allgemeinen gibt es eine Ratenbegrenzung. Aus diesem Grund werden Löschvorgänge nach einer gewissen Zeit zum Stillstand kommen oder langsamer.
Fırat KÜÇÜK
2
Klappt wunderbar! Danke dafür!
Brianrhea
21

Der Standardbefehl clean funktionierte bei mir nicht und gab folgenden Fehler aus:

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

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

Das Folgende funktionierte jedoch ohne Probleme, um die Bot-Nachrichten zu bereinigen

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

oder

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

um alle Nachrichten zu bereinigen.

Ich verwende ein Ratenlimit von 1 Sekunde, um HTTP 429 Too Many RequestsFehler aufgrund des Limits der Slack-API-Rate zu vermeiden . In beiden Fällen wurde der Kanalname ohne #Vorzeichen angegeben

Samir
quelle
12

!!AKTUALISIEREN!!

als @ niels-van-reijmersdal im Kommentar metased.

Diese Funktion wurde entfernt. Weitere Informationen finden Sie in diesem Thread: twitter.com/slackhq/status/467182697979588608?lang=de

!! END UPDATE !!

Hier ist eine nette Antwort von SlackHQ auf Twitter, die ohne Inhalte von Drittanbietern funktioniert. https://twitter.com/slackhq/status/467182697979588608?lang=de

Sie können Massenlöschungen über die Archivseite ( http://my.slack.com/archives ) für einen bestimmten Kanal durchführen: Suchen Sie im Menü nach "Nachrichten löschen"

Braggae
quelle
1
Dies funktioniert nur für Kanäle und nicht für Direktnachrichten.
TheRodeo
1
Dies löscht nur die letzten 10 Nachrichten gleichzeitig
MatPag
1
Nein, ich habe mit dieser Methode viele Nachrichten gelöscht. Es war ungefähr 100 oder so.
Braggae
1
Ich habe es gerade benutzt. Wenn zuerst nur 10 angezeigt wurden, aber nachdem ich sie gelöscht hatte, wurde der Rest angezeigt (der Kanal hatte insgesamt weniger als 100 Nachrichten, sodass er immer noch auf 100 begrenzt sein konnte).
Albin
5
Das scheint bei mir nicht zu funktionieren. Es leitet zu http: // <Teamname> .slack.com / messages / <messageid> weiter (scheint der letzte Kanal zu sein, den ich angesehen habe)
Devil's Advocate
10

Für alle anderen, die es nicht programmatisch ausführen müssen, gibt es hier einen schnellen Weg :

(wahrscheinlich nur für bezahlte Benutzer)

  1. Öffnen Sie den Kanal im Web oder in der Desktop-App und klicken Sie auf das Zahnrad (oben rechts).
  2. Wählen Sie "Zusätzliche Optionen ...", um das Archivierungsmenü aufzurufen. Anmerkungen
  3. Wählen Sie "Richtlinie zum Aufbewahren von Kanalnachrichten festlegen".
  4. Stellen Sie "Alle Nachrichten für eine bestimmte Anzahl von Tagen aufbewahren" ein.
  5. Alle Nachrichten, die älter als diese Zeit sind, werden dauerhaft gelöscht!

Normalerweise setze ich diese Option auf "1 Tag", um den Kanal mit einem bestimmten Kontext zu verlassen. Dann gehe ich zurück zu den obigen Einstellungen und setze die Aufbewahrungsrichtlinie wieder auf "Standard". , um sie von nun an weiter zu speichern.

Anmerkungen:
Luke weist darauf hin: Wenn die Option ausgeblendet ist: Sie müssen zu den globalen Administratoreinstellungen für den Arbeitsbereich, zum Speichern und Löschen von Nachrichten gehen und das Kontrollkästchen "Arbeitsbereichsmitglieder diese Einstellungen überschreiben lassen" aktivieren.

Hicsy
quelle
2
Eigentlich ist es nur versteckt. Um es anzuzeigen, müssen Sie zu den globalen Administratoreinstellungen für den Arbeitsbereich, zum Speichern und Löschen von Nachrichten gehen und das Kontrollkästchen "Arbeitsbereichsmitglieder diese Einstellungen überschreiben lassen" aktivieren.
Luke
Vielen Dank, ich habe aktualisiert, um Ihren Kommentar aufzunehmen. Bitte beachten Sie auch, dass wir Slack sogar angeboten haben, für die nachträgliche Löschung der Entwicklungszeit zu zahlen. Sie sagten jedoch, dass dies nur aufgrund der Enterprise Edition (aufgrund der unterschiedlichen Umgebung zum Speichern von Daten) einfach nicht möglich sei.
Hicsy
4

Option 1 Sie können einen Slack-Kanal so einstellen, dass Nachrichten nach 1 Tag automatisch gelöscht werden. Dieser Kanal ist jedoch etwas ausgeblendet. Zunächst müssen Sie zu Ihren Einstellungen für den Slack-Arbeitsbereich, zum Speichern und Löschen von Nachrichten gehen und das Kontrollkästchen "Arbeitsbereichsmitglieder diese Einstellungen überschreiben lassen" aktivieren. Danach können Sie im Slack-Client einen Kanal öffnen, auf das Zahnrad klicken und auf "Nachrichtenaufbewahrung bearbeiten ..." klicken.

Option 2 Das von anderen erwähnte Slack-Cleaner-Befehlszeilentool.

Option 3 Unten finden Sie ein kleines Python-Skript, mit dem ich private Kanäle lösche. Kann ein guter Ausgangspunkt sein, wenn Sie eine programmgesteuerte Steuerung des Löschvorgangs wünschen. Leider hat Slack keine Bulk-Lösch-API und sie begrenzen die Rate der einzelnen Löschvorgänge auf 50 pro Minute, sodass dies unvermeidlich lange dauert.

# -*- 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.")

Beachten Sie, dass das Skript geändert werden muss, um öffentliche Kanäle aufzulisten und zu löschen. Die API-Methoden für diese sind Kanäle. * Anstelle von Gruppen. *

Luke
quelle
1

Wie andere Antworten andeuten, machen die Ratenlimits von Slack dies schwierig - das Ratenlimit ist für die Chat.delete- API mit ~ 50 Anfragen pro Minute relativ niedrig .

Die beste Strategie, die das Ratenlimit einhält, besteht darin, Nachrichten von dem Kanal abzurufen, den Sie löschen möchten, und dann die Nachrichten in Stapeln unter 50 zu löschen, die in einem winzigen Intervall ausgeführt werden.

Ich habe ein Projekt erstellt, das ein Beispiel für diese Stapelverarbeitung enthält, das Sie problemlos auf Autocode verteilen und bereitstellen können. Sie können einen Kanal über einen Schrägstrich-Befehl löschen (und den Zugriff auf den Befehl natürlich nur auf bestimmte Benutzer beschränken!). Wenn Sie /cmd clearin einem Kanal ausgeführt werden, markiert dieser Kanal zum Löschen und führt jede Minute den folgenden Code aus, bis alle Nachrichten im Kanal gelöscht sind:

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
    };
  }
});

Den vollständigen Code und eine Anleitung zum Bereitstellen Ihrer eigenen Version finden Sie hier: https://autocode.com/src/jacoblee/slack-clear-messages/

Jacob Lee
quelle
0

Wenn Sie Python mögen und ein Legacy-API-Token von der Slack-API erhalten haben, können Sie alle privaten Nachrichten, die Sie an einen Benutzer gesendet haben, folgendermaßen löschen:

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()
duhaime
quelle
-1

Hier ist eine großartige Chrome-Erweiterung zum Massenlöschen Ihrer Slack-Channel- / Group- / Im-Nachrichten - https://slackext.com/deleter , mit der Sie die Nachrichten nach Stern, Zeitbereich oder Benutzern filtern können. Übrigens unterstützt es auch das Laden aller Nachrichten in der letzten Version, dann können Sie Ihre ~ 8k-Nachrichten nach Bedarf laden.

Huan
quelle