it-swarm.com.de

Lösen Sie alle Nachrichten (~ 8K) in einem Kanal

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

62
Hann

Ich habe schnell herausgefunden, dass jemand bereits einen Helfer gemacht hat: Slack-Cleaner .

Und für mich ist es nur: 

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

56
Hann

der standardmäßige Clean-Befehl funktionierte nicht für mich und gab folgenden Fehler:

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

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

aber das folgende funktionierte problemlos, 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 säubern.

Ich verwende eine Ratenbegrenzung von 1 Sekunde, um HTTP 429 Too Many Requests-Fehler aufgrund einer Slack-API-Ratenbegrenzung zu vermeiden. In beiden Fällen wurde der Kanalname ohne #-Zeichen angegeben

15
Samir

Ich habe ein einfaches Knotenskript geschrieben, um Nachrichten aus öffentlichen/privaten Kanälen und Chats zu löschen. Sie können es ändern und verwenden.

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

Ändern Sie zunächst Ihr Token im Abschnitt zur Konfiguration von Skripts 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

Die Kanal-ID wird auch in die Browser-URL-Leiste geschrieben.

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

14
Fırat KÜÇÜK

!! UPDATE !!

als @ niels-van-reijmersdal im Kommentar angegeben.

Diese Funktion wurde entfernt. In diesem Thread finden Sie weitere Informationen: Twitter.com/slackhq/status/467182697979588608?lang=de

!! ENDE UPDATE !!

Hier ist eine nette Antwort von SlackHQ auf Twitter, und es funktioniert ohne das Zeug von Drittanbietern . https://Twitter.com/slackhq/status/467182697979588608?lang=de

Sie können das Archiv über das Archiv ( http://my.slack.com/archives ) .__ löschen. Seite für einen bestimmten Kanal: Suchen Sie im Menü nach "Nachrichten löschen"

12
Braggae

Für alle anderen, die dies nicht programmgesteuert machen müssen. Hier ist ein schneller 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 Archivmenü aufzurufen. Anmerkungen
  3. Wählen Sie "Festlegen der Kanalnachrichten-Aufbewahrungsrichtlinie".
  4. Setzen Sie "Alle Nachrichten für eine bestimmte Anzahl von Tagen aufbewahren".
  5. Alle Nachrichten, die älter als diese Zeit sind, werden endgültig 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 "default" , um fortzufahren, sie ab jetzt zu speichern .

Anmerkungen:
Luke weist darauf hin: Wenn die Option ausgeblendet ist: Sie müssen zu den globalen Arbeitsbereich-Admin-Einstellungen, Nachrichtenaufbewahrung und -löschung gehen und die Option "Mitglieder des Arbeitsbereichs diese Einstellungen überschreiben" aktivieren.

8
Hicsy

Option 1 Sie können einen Slack-Kanal so einstellen, dass Nachrichten nach einem Tag automatisch gelöscht werden, dies ist jedoch etwas versteckt. Zuerst müssen Sie zu Ihren Slack-Arbeitsbereich-Einstellungen, zur Aufbewahrung und zum Löschen von Nachrichten gehen und dort "Mitglieder des Arbeitsbereichs diese Einstellungen überschreiben" aktivieren. Danach können Sie im Slack-Client einen Kanal öffnen, auf das Zahnrad klicken und auf "Aufbewahrung von Nachrichten bearbeiten ..." klicken.

Option 2 Das Befehlszeilenwerkzeug "Slack Cleaner", das von anderen erwähnt wurde.

Option 3 Nachfolgend finden Sie ein kleines Python-Skript, mit dem ich private Kanäle lösche. Kann ein guter Ausgangspunkt sein, wenn Sie das Löschen mehr programmgesteuert steuern möchten. Leider hat Slack keine Massenlöschungs-API, und die Ratenbegrenzung der einzelnen Löschungen wird auf 50 pro Minute begrenzt, so dass es 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 dieses Skript geändert werden muss, um die öffentlichen Kanäle aufzulisten und zu löschen. Die API-Methoden dafür sind Channels. * Statt Gruppen. *

4
Luke

Tipp: Wenn Sie den Slack-Reiniger verwenden https://github.com/kfei/slack-cleaner

Sie müssen ein Token generieren: https://api.slack.com/custom-integrations/legacy-tokens

1
Helder Robalo

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

0
Huan

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

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()
0
duhaime