Slack limpia todos los mensajes (~ 8K) en un canal


85

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:


71

Rápidamente descubrí que alguien ya hizo un ayudante: limpiador de holguras para esto.

Y para mi es solo:

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


Otra opción proviene de npm , pero aún no lo he probado.
Hann

1
¿Dónde puedo encontrar mi token y mi canal?
kk78626

6
--user "*"también es necesario para que funcione. Además, si realmente desea realizar la tarea de eliminación, debe agregar --perform.
Shayan Salehian

7
La bifurcación github.com/sgratzl/slack-cleaner es más activa e incluye características como --quietno mostrar todos los mensajes eliminados en stdout.
perplejidad

24

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

Obtenga un token de OAuth:

  1. Vaya a https://api.slack.com/apps
  2. Haga clic en 'Crear nueva aplicación' y asigne un nombre a su aplicación (temporal).
  3. En el panel de navegación lateral, vaya a 'Oauth y permisos'
  4. En esa página, busque la sección 'Ámbitos'. Haga clic en 'Agregar un alcance de OAuth' y agregue 'canales: historial' y 'chat: escribir'. (ver alcances)
  5. En la parte superior de la página, haga clic en 'Instalar aplicación en el espacio de trabajo'. Confirme y vuelva a cargar la página, copie el token de acceso de OAuth.

Encuentra el ID del canal

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

2
Gracias por eso. Una cosa que noto es que se ralentiza después de que se han eliminado algunos mensajes.
Bertl

3
Generalmente, existe una limitación de velocidad. Por eso, después de un período de tiempo, las operaciones de eliminación se detendrán o ralentizarán.
Fırat KÜÇÜK

2
¡Funciona de maravilla! ¡Gracias por esto!
brianrhea

1
Lo usé, fácil, dulce. Tenga en cuenta que la respuesta anterior actualmente dice que use tokens heredados, que ya no son compatibles, pero Firat ya ha actualizado la esencia con esa información y proporciona la lista de alcances de OAuth que se necesitan. Fue sorprendentemente rápido y fácil crear la aplicación de holgura necesaria para obtener el token de OAuth y agregar la lista de alcances; estoy hablando de 100 segundos.
Daryn

23

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 Requestserrores debido al límite de velocidad de la API de holgura. En ambos casos, el nombre del canal se proporcionó sin #signo


11

!!¡¡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ú


1
Simplemente publicándolo, esto solo funciona para canales y no para mensajes directos.
TheRodeo

1
Esto solo elimina los últimos 10 mensajes a la vez
MatPag

1
No, solía eliminar muchos mensajes con este método. Eran unos 100 o algo así.
Braggae

1
Lo acabo de usar. Si primero solo mostraba 10, pero una vez que los borré, mostraba el resto (el canal tenía menos de 100 mensajes en total, por lo que aún podría estar limitado a 100).
Albin

6
Esto no parece funcionar para mí. Redirige a http: // <teamname> .slack.com / messages / <messageid> (parece ser el último canal que vi)
Devil's Advocate

10

Para cualquier otra persona que no necesite hacerlo mediante programación, aquí hay una forma rápida :

(probablemente solo para usuarios pagos)

  1. Abra el canal en la web o en la aplicación de escritorio y haga clic en el engranaje (arriba a la derecha).
  2. Elija "Opciones adicionales ..." para que aparezca el menú de archivo. notas
  3. Seleccione "Establecer la política de retención de mensajes del canal".
  4. Configure "Conservar todos los mensajes durante un número específico de días".
  5. ¡Todos los mensajes anteriores a este tiempo se eliminan de forma permanente!

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".


2
En realidad, solo está oculto. Para que parezca, debe 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 esta configuración".
Lucas

Gracias, me he actualizado para incluir tu comentario. También tenga en cuenta que incluso ofrecimos pagar a Slack por el tiempo de desarrollo para eliminar de forma retroactiva, pero dijeron que simplemente no era posible más que la edición empresarial (debido al entorno diferente para almacenar datos).
Hicsy

Como lo mencionó @Hicsy, la opción "Retención y eliminación de mensajes" es una "función paga"
Phil

4

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. *



1

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 clearen 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/


0

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


-2

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.