web-dev-qa-db-fra.com

Slack Clean tous les messages (~ 8K) dans un canal

Nous avons actuellement un canal Slack contenant environ 8 000 messages, tous issus de l'intégration de Jenkins. Existe-t-il un moyen programmatique de supprimer tous les messages de ce canal? L'interface Web ne peut supprimer que 100 messages à la fois.

62
Hann

J'ai vite découvert qu'il y avait déjà un assistant: nettoyeur de mou pour ça.

Et pour moi c'est juste: 

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

56
Hann

la commande de nettoyage par défaut ne fonctionnait pas pour moi, donnant l'erreur suivante:

$ slack-cleaner --token=<TOKEN> --message --channel <CHANNEL>

Running slack-cleaner v0.2.4
Channel, direct message or private group not found

mais après travaillé sans aucun problème pour nettoyer les messages de bot

slack-cleaner --token <TOKEN> --message --group <CHANNEL> --bot --perform --rate 1 

ou

slack-cleaner --token <TOKEN> --message --group <CHANNEL> --user "*" --perform --rate 1 

nettoyer tous les messages.

J'utilise taux-limite de 1 seconde pour éviter l'erreur HTTP 429 Too Many Requests en raison de la limite de taux d'api lâche. Dans les deux cas, le nom du canal a été fourni sans le signe #

15
Samir

J'ai écrit un script de noeud simple pour supprimer les messages des canaux publics/privés et des chats. Vous pouvez le modifier et l'utiliser.

https://Gist.github.com/firatkucuk/ee898bc919021da621689f5e47e7abac

Commencez par modifier votre jeton dans la section de configuration des scripts, puis exécutez le script:

node ./delete-slack-messages CHANNEL_ID

Vous pouvez apprendre votre jeton à partir de l'URL suivante:

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

De plus, l'ID du canal est écrit dans la barre d'URL du navigateur.

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

14
Fırat KÜÇÜK

!!METTRE À JOUR!!

comme @ niels-van-reijmersdal a commenté.

Cette fonctionnalité a été supprimée. Voir ce fil pour plus d'informations: Twitter.com/slackhq/status/467182697979595608?lang=fr

!! FIN METTRE À JOUR !!

Voici une réponse intéressante de SlackHQ sur Twitter, et cela fonctionne sans aucun élément tiers . https://Twitter.com/slackhq/status/467182697979588608?lang=fr

Vous pouvez supprimer en bloc via les archives ( http://my.slack.com/archives ) page d'un canal particulier: recherchez "supprimer les messages" dans le menu

12
Braggae

Pour ceux qui n’ont pas besoin de le faire par programme, Voici un méthode rapide:

(probablement pour les utilisateurs payants seulement)

  1. Ouvrez le canal sur le Web ou sur l’application de bureau et cliquez sur le rouage (en haut à droite).
  2. Choisissez "Options supplémentaires ..." pour afficher le menu d'archivage. Remarques
  3. Sélectionnez "Définir la stratégie de rétention du message du canal".
  4. Définissez "Conserver tous les messages pendant un nombre de jours spécifique".
  5. Tous les messages plus anciens que cette heure sont définitivement supprimés!

Je règle généralement cette option sur "1 jour" pour quitter le canal avec un contexte, puis je reviens dans les paramètres ci-dessus, et règle sa politique de rétention sur "par défaut" pour continuer à les stocker à partir de maintenant -sur.

Remarques:
Luke fait remarquer: Si l'option est cachée: vous devez accéder aux paramètres administrateur de l'espace de travail global, à la rétention et à la suppression des messages, et cochez la case "Laisser les membres de l'espace de travail remplacer ces paramètres"

8
Hicsy

Option 1 Vous pouvez définir un canal Slack pour qu'il supprime automatiquement les messages après 1 jour, mais c'est un peu caché. Tout d'abord, vous devez accéder à vos paramètres Slack Workspace, Conservation et suppression des messages, et cochez la case "Laisser les membres de l'espace de travail remplacer ces paramètres". Ensuite, dans le client Slack, vous pouvez ouvrir un canal, cliquer sur l'engrenage, puis sur "Modifier la conservation des messages ...".

Option 2 L'outil de ligne de commande slack-cleaner que d'autres ont mentionné.

Option 3 Voici un petit script Python que j'utilise pour effacer les canaux privés. Cela peut constituer un bon point de départ si vous souhaitez davantage de contrôle programmatique de la suppression. Malheureusement, Slack n’a pas d’API de suppression en bloc, et limite la suppression individuelle à 50 par minute, ce qui prend inévitablement beaucoup de temps.

# -*- 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.")

Notez que ce script devra être modifié pour lister et effacer les canaux publics. Les méthodes de l'API pour ces méthodes sont les canaux. * Au lieu de groupes. *

4
Luke

Astuce: si vous utilisez le nettoyeur de slack https://github.com/kfei/slack-cleaner

Vous devrez générer un jeton: https://api.slack.com/custom-integrations/legacy-tokens

1
Helder Robalo

Voici une excellente extension chrome pour supprimer en bloc vos messages de canal/groupe/im actifs - https://slackext.com/deleter , où vous pouvez filtrer les messages par étoile, plage de temps ou utilisateurs ..__ BTW, il prend également en charge le chargement de tous les messages dans la version récente, alors vous pouvez charger vos messages ~ 8k selon vos besoins.

0
Huan

Si vous aimez Python et avez obtenu un jeton API hérité de l'api slack, vous pouvez supprimer tous les messages privés que vous avez envoyés à un utilisateur avec les éléments suivants:

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