Slack czyści wszystkie wiadomości (~ 8K) w kanale


85

Obecnie mamy kanał Slack z ~ 8K wiadomościami, wszystkie pochodzą z integracji Jenkins. Czy istnieje programowy sposób usuwania wszystkich wiadomości z tego kanału? Interfejs sieciowy może jednocześnie usunąć tylko 100 wiadomości.

Odpowiedzi:


71

Szybko dowiedziałem się, że ktoś już stworzył pomocnika: luźno sprzątający do tego.

A dla mnie to tylko:

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


Inna opcja pochodzi z npm , po prostu jeszcze nie próbowałem.
Hann

2
Gdzie mogę znaleźć mój token i kanał?
kk78626

6
--user "*"jest również konieczne, aby działał. Również jeśli chcesz faktycznie wykonać zadanie usuwania, powinieneś dodać --perform.
Shayan Salehian

7
Github.com/sgratzl/slack-cleaner widelec jest bardziej aktywny i obejmuje takie funkcje, jak --quietsię nie wyświetlać każdy komunikat usunięciem na standardowe wyjście.
zdziwienie

24

Napisałem prosty skrypt węzłowy do usuwania wiadomości z kanałów publicznych / prywatnych i czatów. Możesz go modyfikować i używać.

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

Najpierw zmodyfikuj swój token w sekcji konfiguracji skryptów, a następnie uruchom skrypt:

node ./delete-slack-messages CHANNEL_ID

Uzyskaj token OAuth:

  1. Przejdź do https://api.slack.com/apps
  2. Kliknij „Utwórz nową aplikację” i nazwij swoją (tymczasową) aplikację.
  3. W bocznym panelu nawigacyjnym przejdź do „Oauth i uprawnienia”
  4. Na tej stronie znajdź sekcję „Zakresy”. Kliknij „Dodaj zakres OAuth” i dodaj „kanały: historia” i „czat: napisz”. (zobacz zakresy)
  5. U góry strony kliknij „Zainstaluj aplikację w obszarze roboczym”. Potwierdź, a po ponownym załadowaniu strony skopiuj token dostępu OAuth.

Znajdź identyfikator kanału

Identyfikator kanału można również zobaczyć w adresie URL przeglądarki, gdy otwierasz slack w przeglądarce. na przykład

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

lub

https://app.slack.com/client/WORKSPACE_ID/MY_CHANNEL_ID

2
Dziękuję za to. Zauważyłem, że zwalnia po usunięciu kilku wiadomości.
Bertl

3
Ogólnie rzecz biorąc, istnieje ograniczenie szybkości. Dlatego po pewnym czasie operacje usuwania zatrzymają się lub spowolnią.
Fırat KÜÇÜK

2
Działa jak marzenie! Dzięki za to!
brianrhea

1
Użyłem tego, łatwo, słodko. Zauważ, że powyższa odpowiedź obecnie mówi, aby używać starszych tokenów, które nie są już obsługiwane, ale Firat już zaktualizował samą treść tymi informacjami i podaje listę potrzebnych zakresów OAuth. To było zaskakująco szybkie-n-łatwo stworzyć aplikację luzu niezbędne do uzyskania tokenu OAuth i dodać listę zakresów-jestem mówisz 100 sekund.
Daryn

23

domyślne polecenie clean nie zadziałało, podając następujący błąd:

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

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

ale poniższe działały bez problemu, aby wyczyścić wiadomości bota

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

lub

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

aby wyczyścić wszystkie wiadomości.

Używam limitu szybkości wynoszącego 1 sekundę, aby uniknąć HTTP 429 Too Many Requestsbłędów z powodu limitu szybkości wolnego interfejsu API. W obu przypadkach nazwa kanału została podana bez #znaku


11

!!AKTUALIZACJA!!

jak wspomniano w komentarzu @ niels-van-reijmersdal.

Ta funkcja została usunięta. Zobacz ten wątek, aby uzyskać więcej informacji: twitter.com/slackhq/status/467182697979588608?lang=en

!! END UPDATE !!

Oto miła odpowiedź od SlackHQ na Twitterze, która działa bez żadnych rzeczy osób trzecich. https://twitter.com/slackhq/status/467182697979588608?lang=en

Możesz zbiorczo usuwać za pośrednictwem strony archiwów ( http://my.slack.com/archives ) dla określonego kanału: poszukaj opcji „usuń wiadomości” w menu


1
Po prostu je opublikuję, działa to tylko dla kanałów, a nie dla bezpośrednich wiadomości.
TheRodeo

1
Spowoduje to jednoczesne usunięcie tylko ostatnich 10 wiadomości
MatPag

1
Nie, kiedyś usuwałem wiele wiadomości tą metodą. Około 100 lub coś w tym stylu.
Braggae

1
Po prostu go użyłem. Gdyby najpierw pokazywał tylko 10, ale kiedy je usunąłem, pokazywał resztę (kanał miał łącznie mniej niż 100 wiadomości, więc nadal można go było ograniczyć do 100).
Albin

6
To chyba nie działa dla mnie. Przekierowuje do http: // <nazwa drużyny> .slack.com / messages / <messageid> (wygląda na to, że jest to ostatni kanał, który oglądałem)
Devil's Advocate

10

Dla każdego, kto nie musi robić tego w sposób automatyczny, oto szybki sposób :

(prawdopodobnie tylko dla płatnych użytkowników)

  1. Otwórz kanał w aplikacji internetowej lub na komputerze i kliknij trybik (w prawym górnym rogu).
  2. Wybierz „Dodatkowe opcje ...”, aby wywołać menu archiwalne. notatki
  3. Wybierz „Ustaw zasady przechowywania wiadomości kanału”.
  4. Ustaw „Przechowuj wszystkie wiadomości przez określoną liczbę dni”.
  5. Wszystkie wiadomości starsze niż ten czas są trwale usuwane!

Zwykle ustawiam tę opcję na „1 dzień”, aby opuścić kanał z pewnym kontekstem, a następnie wracam do powyższych ustawień i ustawiam jego politykę przechowywania z powrotem na „domyślną”, aby kontynuować przechowywanie ich od teraz.

Uwagi:
Luke zwraca uwagę: Jeśli opcja jest ukryta: musisz przejść do globalnych ustawień administracyjnych obszaru roboczego, przechowywania i usuwania wiadomości i zaznaczyć opcję „Pozwól członkom obszaru roboczego zastąpić te ustawienia”


2
Właściwie to jest po prostu ukryte. Aby się pojawił, musisz przejść do globalnych ustawień administratora obszaru roboczego, Przechowywanie i usuwanie wiadomości i zaznaczyć opcję „Pozwól członkom obszaru roboczego zastępować te ustawienia”.
Łukasz

Dzięki, zaktualizowałem, aby dołączyć Twój komentarz. Należy również pamiętać, że zaproponowaliśmy nawet, że zapłacimy Slackowi za poświęcenie czasu na usunięcie danych z mocą wsteczną, ale powiedzieli, że po prostu nie jest to możliwe poza edycją korporacyjną (ze względu na inne środowisko przechowywania danych).
Hicsy,

Jak wspomniał @Hicsy, opcja „Przechowywanie i usuwanie wiadomości” to „Funkcja płatna”
Phil

4

Opcja 1 Możesz ustawić kanał Slack, aby automatycznie usuwał wiadomości po 1 dniu, ale jest trochę ukryty. Najpierw musisz przejść do ustawień Slack Workspace Settings, Message Retention & Deletion i zaznaczyć „Pozwól członkom obszaru roboczego zastąpić te ustawienia”. Następnie w kliencie Slack możesz otworzyć kanał, kliknąć koło zębate i kliknąć „Edytuj przechowywanie wiadomości ...”

Opcja 2 Slack-cleaner, narzędzie wiersza poleceń, o którym wspominali inni.

Opcja 3 Poniżej znajduje się mały skrypt Pythona, którego używam do czyszczenia kanałów prywatnych. Może być dobrym punktem wyjścia, jeśli chcesz mieć bardziej programową kontrolę nad usuwaniem. Niestety Slack nie ma interfejsu API do zbiorczego usuwania i ograniczają indywidualne usuwanie do 50 na minutę, więc nieuchronnie zajmuje to dużo czasu.

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

Zwróć uwagę, że skrypt będzie wymagał modyfikacji, aby wyświetlić i wyczyścić kanały publiczne. Metody API to kanały. * Zamiast grup. *



1

Jak sugerują inne odpowiedzi, limity szybkości Slacka sprawiają, że jest to trudne - limit szybkości jest stosunkowo niski dla ich czatu. Usuń API przy ~ 50 żądaniach na minutę.

Najlepszą strategią, która przestrzega limitu szybkości, jest pobieranie wiadomości z kanału, który chcesz wyczyścić, a następnie usuwanie wiadomości w partiach poniżej 50, które są uruchamiane w minutowych odstępach czasu.

Zbudowałem projekt zawierający przykład tego przetwarzania wsadowego, który można łatwo rozwidlić i wdrożyć w Autocode - pozwala to wyczyścić kanał za pomocą polecenia ukośnika (i oczywiście pozwala ograniczyć dostęp do polecenia tylko niektórym użytkownikom!). Po uruchomieniu /cmd clearw kanale oznacza ten kanał do wyczyszczenia i uruchamia następujący kod co minutę, aż usunie wszystkie komunikaty w kanale:

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
    };
  }
});

Możesz wyświetlić pełny kod i przewodnik dotyczący wdrażania własnej wersji tutaj: https://autocode.com/src/jacoblee/slack-clear-messages/


0

Jeśli lubisz Pythona i uzyskałeś starszy token API ze slack api, możesz usunąć wszystkie prywatne wiadomości, które wysłałeś do użytkownika, korzystając z następujących elementów:

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

Oto świetne rozszerzenie do Chrome do zbiorczego usuwania wiadomości z kanału / grupy / im na Slack - https://slackext.com/deleter , gdzie możesz filtrować wiadomości według gwiazdy, zakresu czasu lub użytkowników. BTW, obsługuje również ładowanie wszystkich wiadomości w najnowszej wersji, a następnie możesz załadować swoje wiadomości ~ 8k według potrzeb.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.