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:
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
--user "*"
è necessario anche per farlo funzionare. Inoltre, se vuoi eseguire effettivamente l'attività di rimozione, dovresti aggiungere --perform
.
--quiet
non visualizzare tutti i messaggi eliminati su stdout.
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
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
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 Requests
errori a causa del limite di velocità dell'api lento. In entrambi i casi, il nome del canale è stato fornito senza #
segno
!!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
Per chiunque altro non abbia bisogno di farlo in modo programmatico, ecco un modo rapido :
(probabilmente solo per utenti a pagamento)
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"
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. *
Suggerimento: se intendi utilizzare lo slack cleaner https://github.com/kfei/slack-cleaner
Dovrai generare un token: https://api.slack.com/custom-integrations/legacy-tokens
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 clear
in 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/
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()
C'è uno strumento slack per eliminare tutti i messaggi slack sul tuo spazio di lavoro. Dai un'occhiata: https://www.messagebender.com
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.