Pulisci tutti i messaggi (~ 8K) in un canale


85

Al momento abbiamo un canale Slack con ~ 8K messaggi che provengono tutti dall'integrazione di Jenkins. Esiste un modo programmatico per eliminare tutti i messaggi da quel canale? L'interfaccia web può eliminare solo 100 messaggi alla volta.

Risposte:


71

Ho subito scoperto che qualcuno ha già creato un aiutante: un addetto alle pulizie per questo.

E per me è solo:

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


Un'altra opzione viene da npm , ma non l'ho ancora provata.
Hann

3
Dove posso trovare il mio token e il mio canale?
kk78626

6
--user "*"è necessario anche per farlo funzionare. Inoltre, se vuoi eseguire effettivamente l'attività di rimozione, dovresti aggiungere --perform.
Shayan Salehian

7
Il fork github.com/sgratzl/slack-cleaner è più attivo e include funzionalità come --quietnon visualizzare tutti i messaggi eliminati su stdout.
perplessità

25

Ho scritto un semplice script del nodo per eliminare i messaggi da canali e chat pubblici / privati. Puoi modificarlo e usarlo.

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

Innanzitutto, modifica il tuo token nella sezione di configurazione degli script, quindi esegui lo script:

node ./delete-slack-messages CHANNEL_ID

Ottieni un token OAuth:

  1. Vai su https://api.slack.com/apps
  2. Fai clic su "Crea nuova app" e assegna un nome alla tua app (temporanea).
  3. Nel menu di navigazione laterale, vai a "Oauth e autorizzazioni"
  4. In quella pagina, trova la sezione "Ambiti". Fai clic su "Aggiungi un ambito OAuth" e aggiungi "canali: cronologia" e "chat: scrivi". (vedi ambiti)
  5. Nella parte superiore della pagina, fai clic su "Installa l'app nello spazio di lavoro". Conferma e, alla ricarica della pagina, copia il token di accesso OAuth.

Trova l'ID del canale

Inoltre, l'ID del canale può essere visualizzato nell'URL del browser quando apri Slack nel browser. per esempio

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

o

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

2
Grazie per quello. Una cosa che noto è che rallenta dopo che alcuni messaggi sono stati eliminati.
Bertl

3
In generale, c'è una limitazione della velocità. Ecco perché dopo un periodo di tempo le operazioni di cancellazione si bloccheranno o rallenteranno.
Fırat KÜÇÜK

2
Funziona come un fascino! Grazie per questo!
brianrhea

1
Usato, facile, dolce. Si noti che la risposta di cui sopra attualmente dice di utilizzare i token legacy, che non sono più supportati, ma Firat ha già aggiornato il gist stesso con quelle informazioni e fornisce l'elenco degli ambiti OAuth necessari. È stato sorprendentemente facile e veloce creare l'app slack necessaria per ottenere il token OAuth e aggiungere l'elenco degli ambiti: parlo di 100 secondi.
Daryn,

23

Il comando clean predefinito non ha funzionato per me dando il seguente errore:

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

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

ma in seguito ha funzionato senza alcun problema per pulire i messaggi del bot

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

o

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

per pulire tutti i messaggi.

Uso il limite di velocità di 1 secondo per evitare HTTP 429 Too Many Requestserrori a causa del limite di velocità dell'api lento. In entrambi i casi, il nome del canale è stato fornito senza #segno


11

!!AGGIORNARE!!

come ha detto @ niels-van-reijmersdal nel commento.

Questa funzionalità è stata rimossa. Vedi questo thread per maggiori informazioni: twitter.com/slackhq/status/467182697979588608?lang=en

!! FINE AGGIORNAMENTO !!

Ecco una bella risposta da SlackHQ su Twitter e funziona senza materiale di terze parti. https://twitter.com/slackhq/status/467182697979588608?lang=en

Puoi eliminare in blocco tramite la pagina degli archivi ( http://my.slack.com/archives ) per un particolare canale: cerca "elimina messaggi" nel menu


1
Mettendolo in circolazione, funziona solo per i canali e non per i messaggi diretti.
TheRodeo

1
Questo elimina solo gli ultimi 10 messaggi alla volta
MatPag

1
No, eliminavo molti messaggi con questo metodo. Erano circa 100 o qualcosa del genere.
Braggae

1
L'ho appena usato. Se prima ne mostrava solo 10, ma una volta cancellati mostrava il resto (il canale aveva meno di 100 messaggi in totale, quindi poteva ancora essere limitato a 100).
Albin

6
Questo non sembra funzionare per me. Reindirizza a http: // <teamname> .slack.com / messages / <messageid> (sembra essere l'ultimo canale che ho visto)
Devil's Advocate

10

Per chiunque altro non abbia bisogno di farlo in modo programmatico, ecco un modo rapido :

(probabilmente solo per utenti a pagamento)

  1. Apri il canale nel web o nell'app desktop e fai clic sull'icona a forma di ingranaggio (in alto a destra).
  2. Scegli "Opzioni aggiuntive ..." per visualizzare il menu di archiviazione. Appunti
  3. Seleziona "Imposta il criterio di conservazione dei messaggi del canale".
  4. Imposta "Conserva tutti i messaggi per un numero specifico di giorni".
  5. Tutti i messaggi più vecchi di questo periodo vengono eliminati definitivamente!

Di solito imposto questa opzione a "1 giorno" per lasciare il canale con un po 'di contesto, quindi torno alle impostazioni precedenti e imposto la sua politica di conservazione su "predefinita" per continuare a memorizzarli da ora in poi.

Note:
Luke sottolinea: Se l'opzione è nascosta: devi andare alle impostazioni di amministrazione dell'area di lavoro globale, Conservazione ed eliminazione dei messaggi e selezionare "Consenti ai membri dell'area di lavoro di sovrascrivere queste impostazioni"


2
In realtà è solo nascosto. Per farlo sembrare, devi andare alle impostazioni di amministrazione dell'area di lavoro globale, Conservazione ed eliminazione dei messaggi e selezionare "Consenti ai membri dell'area di lavoro di sovrascrivere queste impostazioni".
Luca

Grazie, ho aggiornato per includere il tuo commento. Inoltre, tieni presente che ci siamo persino offerti di pagare Slack per il tempo di sviluppo da eliminare in modo retrospettivo, ma hanno detto semplicemente che non era possibile altro che l'edizione aziendale (a causa del diverso ambiente per l'archiviazione dei dati).
Hicsy

Come menzionato da @Hicsy, l'opzione "Conservazione ed eliminazione messaggi" è una "funzione a pagamento"
Phil

4

Opzione 1 Puoi impostare un canale Slack per eliminare automaticamente i messaggi dopo 1 giorno, ma è un po 'nascosto. Per prima cosa, devi andare alle Impostazioni dell'area di lavoro Slack, Conservazione e cancellazione dei messaggi e selezionare "Consenti ai membri dell'area di lavoro di sovrascrivere queste impostazioni". Successivamente, nel client Slack puoi aprire un canale, fare clic sull'icona a forma di ingranaggio e fare clic su "Modifica conservazione dei messaggi ..."

Opzione 2 Lo strumento da riga di comando più pulito che altri hanno menzionato.

Opzione 3 Di seguito è riportato un piccolo script Python che utilizzo per cancellare i canali privati. Può essere un buon punto di partenza se desideri un controllo più programmatico dell'eliminazione. Sfortunatamente Slack non ha API per l'eliminazione in blocco e limita la velocità dell'eliminazione individuale a 50 al minuto, quindi richiede inevitabilmente molto tempo.

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

Nota che lo script dovrà essere modificato per elencare e cancellare i canali pubblici. I metodi API per questi sono canali. * Invece di gruppi. *



1

Come altre risposte alludono, i limiti di velocità di Slack lo rendono complicato: il limite di velocità è relativamente basso per la loro API chat.delete a ~ 50 richieste al minuto.

La migliore strategia che rispetta il limite di velocità è recuperare i messaggi dal canale che si desidera cancellare, quindi eliminare i messaggi in batch inferiori a 50 che vengono eseguiti su un intervallo minuzioso.

Ho creato un progetto contenente un esempio di questo batch che puoi facilmente forkare e distribuire su Autocode : ti consente di cancellare un canale tramite il comando slash (e ti consente di limitare l'accesso al comando solo a determinati utenti, ovviamente!). Quando si esegue /cmd clearin un canale, contrassegna quel canale per la cancellazione ed esegue il codice seguente ogni minuto finché non elimina tutti i messaggi nel canale:

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

Puoi visualizzare il codice completo e una guida per distribuire la tua versione qui: https://autocode.com/src/jacoblee/slack-clear-messages/


0

Se ti piace Python e hai ottenuto un token API legacy dall'api slack, puoi eliminare tutti i messaggi privati ​​che hai inviato a un utente con quanto segue:

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

Ecco una fantastica estensione di Chrome per eliminare in blocco i tuoi messaggi di canale / gruppo / im slack: https://slackext.com/deleter , dove puoi filtrare i messaggi per stella, intervallo di tempo o utenti. BTW, supporta anche il caricamento di tutti i messaggi nella versione recente, quindi puoi caricare i tuoi ~ 8k messaggi di cui hai bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.