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:
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
--user "*"
jest również konieczne, aby działał. Również jeśli chcesz faktycznie wykonać zadanie usuwania, powinieneś dodać --perform
.
--quiet
się nie wyświetlać każdy komunikat usunięciem na standardowe wyjście.
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
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
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 Requests
błędów z powodu limitu szybkości wolnego interfejsu API. W obu przypadkach nazwa kanału została podana bez #
znaku
!!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
Dla każdego, kto nie musi robić tego w sposób automatyczny, oto szybki sposób :
(prawdopodobnie tylko dla płatnych użytkowników)
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”
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. *
Wskazówka: jeśli zamierzasz używać narzędzia do czyszczenia Slack https://github.com/kfei/slack-cleaner
Będziesz musiał wygenerować token: https://api.slack.com/custom-integrations/legacy-tokens
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 clear
w 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/
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()
Istnieje narzędzie zapasu czasu do usuwania wszystkich wiadomości w obszarze roboczym. Sprawdź to: https://www.messagebender.com
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.