slack-api slack

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



slack-api (10)

Aquí hay una gran extensión de Chrome para eliminar en masa sus mensajes de canal / grupo / im flojos: 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 ~ 8k mensajes según lo necesite.

Actualmente tenemos un canal Slack con ~ 8K mensajes, todo proviene de la integración de Jenkins. ¿Hay alguna forma programática de eliminar todos los mensajes de ese canal? La interfaz web solo puede eliminar 100 mensajes a la vez.



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 después 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

Uso el límite de velocidad de 1 segundo para evitar el error HTTP 429 Too Many Requests debido al límite de velocidad de la API flojo. En ambos casos, el nombre del canal se proporcionó sin # signo #


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

Puede aprender su token de la siguiente URL:

https://api.slack.com/custom-integrations/legacy-tokens

Además, la ID del canal está escrita en la barra de URL del navegador.

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


Para cualquier otra persona que no necesite hacerlo mediante programación, esta es una forma rápida :

(probablemente solo para usuarios pagos)

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

Por lo general, configuro esta opción en "1 día" para dejar el canal con algún contexto, luego vuelvo a la configuración anterior y configuro su política de retención a "predeterminada" para continuar almacenándolos de ahora en adelante.

Notas:
Luke señala: si la opción está oculta: debe ir a la configuración de administración 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"


Rápidamente descubrí que alguien ya había ayudado: slack-cleaner de slack-cleaner para esto.

Y para mí es solo:

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


Si le gusta Python y ha obtenido un https://api.slack.com/custom-integrations/legacy-tokens 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()


!!¡¡ACTUALIZAR!!

como @ niels-van-reijmersdal mencionó en un comentario.

Esta característica ha sido eliminada. Vea este hilo para más información: twitter.com/slackhq/status/467182697979588608?lang=en

!! FIN ACTUALIZAR !!

Aquí hay una buena respuesta de SlackHQ en Twitter, y funciona sin ningún material de terceros. https://twitter.com/slackhq/status/467182697979588608?lang=en

Puede eliminar de forma masiva 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ú


Opción 1 Puede configurar un canal de Slack para eliminar automáticamente los mensajes después de 1 día, pero está un poco oculto. Primero, debe 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 esta configuración". Después de eso, en el cliente 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 comando slack-cleaner que otros han mencionado.

La opción 3 a continuación es un pequeño script de Python que utilizo para borrar canales privados. Puede ser un buen punto de partida si desea un mayor control programático de la eliminación. Desafortunadamente, Slack no tiene una API de eliminación masiva y limitan la 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 necesitará modificaciones para enumerar y borrar canales públicos. Los métodos API para esos son canales. * En lugar de grupos. *


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