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.
Consejo: si vas a usar el limpiador de holgura slack-cleaner
Deberá generar un token: https://api.slack.com/custom-integrations/legacy-tokens
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.
Para cualquier otra persona que no necesite hacerlo mediante programación, esta es una forma rápida :
(probablemente solo para usuarios pagos)
- Abra el canal en la web o la aplicación de escritorio y haga clic en el engranaje (arriba a la derecha).
- Elija "Opciones adicionales ..." para abrir el menú de archivo. notas
- Seleccione "Establecer la política de retención de mensajes del canal".
- Establezca "Retener todos los mensajes durante un número específico de días".
- ¡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 "*"