Actualmente tenemos un canal de Slack con ~ 8K mensajes, todos provienen de la integración de Jenkins. ¿Existe alguna forma programática de eliminar todos los mensajes de ese canal? La interfaz web solo puede eliminar 100 mensajes a la vez.
Respuestas:
--user "*"
también es necesario para que funcione. Además, si realmente desea realizar la tarea de eliminación, debe agregar --perform
.
--quiet
no mostrar todos los mensajes eliminados en stdout.
Escribí un script de nodo simple para eliminar mensajes de canales y chats públicos / privados. Puedes modificarlo y usarlo.
https://gist.github.com/firatkucuk/ee898bc919021da621689f5e47e7abac
Primero, modifique su token en la sección de configuración de scripts y luego ejecute el script:
node ./delete-slack-messages CHANNEL_ID
Además, el ID del canal se puede ver en la URL del navegador cuando abre slack en el navegador. p.ej
https://mycompany.slack.com/messages/MY_CHANNEL_ID/
o
https://app.slack.com/client/WORKSPACE_ID/MY_CHANNEL_ID
El comando de limpieza predeterminado no funcionó para mí dando el siguiente error:
$ slack-cleaner --token=<TOKEN> --message --channel <CHANNEL>
Running slack-cleaner v0.2.4
Channel, direct message or private group not found
pero seguir funcionó sin ningún problema para limpiar los mensajes 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
para limpiar todos los mensajes.
Utilizo un límite de velocidad de 1 segundo para evitar HTTP 429 Too Many Requests
errores debido al límite de velocidad de la API de holgura. En ambos casos, el nombre del canal se proporcionó sin #
signo
!!¡¡ACTUALIZAR!!
como mencionó @ niels-van-reijmersdal en el comentario.
Esta característica ha sido eliminada. Consulte este hilo para obtener más información: twitter.com/slackhq/status/467182697979588608?lang=en
!! FIN DE ACTUALIZAR !!
Aquí hay una buena respuesta de SlackHQ en Twitter, y funciona sin cosas de terceros. https://twitter.com/slackhq/status/467182697979588608?lang=es
Puede eliminar en bloque a través de la página de archivos ( http://my.slack.com/archives ) para un canal en particular: busque "eliminar mensajes" en el menú
Para cualquier otra persona que no necesite hacerlo mediante programación, aquí hay una forma rápida :
(probablemente solo para usuarios pagos)
Por lo general, establezco esta opción en "1 día" para dejar el canal con algo de contexto, luego vuelvo a la configuración anterior y establezco su política de retención en "predeterminada" para continuar almacenándolas de ahora en adelante.
Notas:
Luke señala: si la opción está oculta: tienes que ir a la configuración de administrador del espacio de trabajo global, retención y eliminación de mensajes, y marcar "Permitir que los miembros del espacio de trabajo anulen estas configuraciones".
Opción 1 Puede configurar un canal de Slack para eliminar mensajes automáticamente después de 1 día, pero está un poco oculto. Primero, tienes que ir a la Configuración del espacio de trabajo de Slack, Retención y eliminación de mensajes, y marcar "Permitir que los miembros del espacio de trabajo anulen estas configuraciones". Después de eso, en el cliente de Slack puede abrir un canal, hacer clic en el engranaje y hacer clic en "Editar retención de mensajes ..."
Opción 2 La herramienta de línea de comandos slack-cleaner que otros han mencionado.
Opción 3 A continuación se muestra un pequeño script de Python que utilizo para borrar los canales privados. Puede ser un buen punto de partida si desea un control más programático de la eliminación. Desafortunadamente, Slack no tiene una API de eliminación masiva, y limita la tasa de eliminación individual a 50 por minuto, por lo que inevitablemente lleva mucho tiempo.
# -*- 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.")
Tenga en cuenta que ese script deberá modificarse para enumerar y borrar los canales públicos. Los métodos API para esos son canales. * En lugar de grupos. *
Consejo: si vas a usar el limpiador de holguras https://github.com/kfei/slack-cleaner
Deberá generar un token: https://api.slack.com/custom-integrations/legacy-tokens
Como aluden otras respuestas, los límites de frecuencia de Slack hacen que esto sea complicado: el límite de frecuencia es relativamente bajo para su API de chat.delete a ~ 50 solicitudes por minuto.
La mejor estrategia que respeta el límite de velocidad es recuperar mensajes del canal que desea borrar y luego eliminar los mensajes en lotes de menos de 50 que se ejecutan en un intervalo de minutos.
He creado un proyecto que contiene un ejemplo de este procesamiento por lotes que puede bifurcar e implementar fácilmente en Autocode : le permite borrar un canal a través del comando de barra (¡y le permite restringir el acceso al comando a solo ciertos usuarios, por supuesto!). Cuando se ejecuta /cmd clear
en un canal, marca ese canal para borrarlo y ejecuta el siguiente código cada minuto hasta que elimina todos los mensajes del canal:
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
};
}
});
Puede ver el código completo y una guía para implementar su propia versión aquí: https://autocode.com/src/jacoblee/slack-clear-messages/
Si le gusta Python y ha obtenido un token de API heredado de la API de slack, puede eliminar todos los mensajes privados que envió a un usuario con lo siguiente:
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()
Existe una herramienta de holgura para eliminar todos los mensajes de holgura en su espacio de trabajo. Compruébelo usted mismo: https://www.messagebender.com
Aquí hay una gran extensión de Chrome para eliminar de forma masiva sus mensajes de canal / grupo / im de slack: https://slackext.com/deleter , donde puede filtrar los mensajes por estrella, rango de tiempo o usuarios. Por cierto, también admite cargar todos los mensajes en la versión reciente, luego puede cargar sus mensajes de ~ 8k según lo necesite.