На даний момент у нас є канал Slack із ~ 8 тисячами повідомлень, все це пов’язано з інтеграцією Дженкінса. Чи існує якийсь програмний спосіб видалити всі повідомлення з цього каналу? Веб-інтерфейс може одночасно видаляти лише 100 повідомлень.
Відповіді:
Я швидко дізнався, що хтось уже зробив помічника: засіб для чищення .
А для мене це просто:
slack-cleaner --token=<TOKEN> --message --channel jenkins --user "*" --perform
--user "*"
також необхідно, щоб це працювало. Також якщо ви хочете фактично виконати завдання видалення, вам слід додати --perform
.
--quiet
щоб не відображати кожне повідомлення видаляється на стандартний висновок.
Я написав простий сценарій вузла для видалення повідомлень із загальнодоступних / приватних каналів та чатів. Ви можете змінювати та використовувати його.
https://gist.github.com/firatkucuk/ee898bc919021da621689f5e47e7abac
Спочатку змініть свій маркер у розділі конфігурації сценаріїв, а потім запустіть сценарій:
node ./delete-slack-messages CHANNEL_ID
Крім того, ідентифікатор каналу можна побачити в URL-адресі браузера, коли ви відкриваєте слабке місце в браузері. напр
https://mycompany.slack.com/messages/MY_CHANNEL_ID/
або
https://app.slack.com/client/WORKSPACE_ID/MY_CHANNEL_ID
команда за замовчуванням clean не спрацювала для мене, давши таку помилку:
$ slack-cleaner --token=<TOKEN> --message --channel <CHANNEL>
Running slack-cleaner v0.2.4
Channel, direct message or private group not found
але наступні працювали без жодних проблем, щоб очистити повідомлення бота
slack-cleaner --token <TOKEN> --message --group <CHANNEL> --bot --perform --rate 1
або
slack-cleaner --token <TOKEN> --message --group <CHANNEL> --user "*" --perform --rate 1
щоб очистити всі повідомлення.
Я використовую обмеження швидкості в 1 секунду, щоб уникнути HTTP 429 Too Many Requests
помилок через обмеження швидкості API. В обох випадках назва каналу була вказана без #
знаку
!! ОНОВЛЕННЯ !!
як зазначив @ niels-van-reijmersdal у коментарі.
Цю функцію видалено. Дивіться цю тему для отримання додаткової інформації: twitter.com/slackhq/status/467182697979588608?lang=en
!! ЗАКІНЧИТИ ОНОВЛЕННЯ !!
Ось приємна відповідь від SlackHQ у Twitter, і вона працює без будь-яких сторонніх матеріалів. https://twitter.com/slackhq/status/467182697979588608?lang=uk
Ви можете масово видаляти через сторінку архівів ( http://my.slack.com/archives ) для певного каналу: шукайте "видалити повідомлення" в меню
Для всіх, кому не потрібно робити це програмно, ось швидкий спосіб :
(ймовірно, лише для платних користувачів)
Зазвичай я встановлюю для цього параметра значення "1 день", щоб залишити канал з певним контекстом, потім я повертаюся до вищевказаних налаштувань і встановлюю його політику збереження знову на "за замовчуванням", щоб продовжувати зберігати їх відтепер.
Примітки:
Лука зазначає: Якщо параметр прихований: вам потрібно перейти до налаштувань адміністратора глобальної робочої області, збереження та видалення повідомлень та встановити прапорець "Дозволити учасникам робочої області замінити ці налаштування"
Варіант 1. Ви можете встановити канал Slack для автоматичного видалення повідомлень через 1 день, але він трохи прихований. По-перше, вам потрібно перейти до налаштувань робочої області Slack, збереження та видалення повідомлень і встановити прапорець "Дозволити учасникам робочої області перевизначити ці налаштування". Після цього в клієнті Slack ви можете відкрити канал, клацнути шестерню та натиснути "Редагувати збереження повідомлень ..."
Варіант 2 Інструмент командного рядка "Більш чистий", про який згадали інші.
Варіант 3 Нижче наведено невеликий сценарій Python, який я використовую для очищення приватних каналів. Може бути гарною відправною точкою, якщо ви хочете отримати більш програмний контроль видалення. На жаль, у Slack немає API масового видалення, і вони обмежують швидкість окремого видалення до 50 на хвилину, тому це неминуче займає багато часу.
# -*- 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.")
Зверніть увагу, що цей сценарій потребуватиме модифікації, щоб перерахувати та очистити публічні канали. Методами API для них є канали. * Замість груп. *
Порада: якщо ви збираєтеся користуватися засобом для розслаблення https://github.com/kfei/slack-cleaner
Вам потрібно буде згенерувати маркер: https://api.slack.com/custom-integrations/legacy-tokens
Оскільки інші відповіді натякають, обмеження швидкості Slack роблять це складним - обмеження швидкості є відносно низьким для їх chat.delete API при ~ 50 запитів на хвилину.
Найкраща стратегія, яка дотримується обмеження швидкості, - це отримувати повідомлення з каналу, який ви хочете очистити, а потім видаляти повідомлення групами менше 50, які виконуються з хвилинним інтервалом.
Я створив проект, що містить приклад цього пакетування, який ви можете легко розгалужити та розгорнути на Autocode - це дозволяє очистити канал за допомогою команди slash (і, звичайно, дозволяє обмежити доступ до команди лише певним користувачам!). Коли ви запускаєте /cmd clear
канал, він позначає цей канал для очищення і запускає наступний код щохвилини, поки не видалить усі повідомлення в каналі:
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
};
}
});
Ви можете переглянути повний код та посібник із розгортання власної версії тут: https://autocode.com/src/jacoblee/slack-clear-messages/
Якщо вам подобається Python і ви отримали застарілий маркер API із слабкого API, ви можете видалити всі приватні повідомлення, надіслані користувачеві, з наступним:
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()
Існує інструмент слабкості, щоб видалити всі повідомлення про слабкість у вашій робочій області. Перевірте це: https://www.messagebender.com
Ось чудове розширення chrome для масового видалення ваших неміцних каналів / груп / ім повідомлень - https://slackext.com/deleter , де ви можете фільтрувати повідомлення за зіркою, часовим діапазоном або користувачами. До речі, він також підтримує завантаження всіх повідомлень в останній версії, тоді ви можете завантажувати ~ 8k повідомлень, як вам потрібно.