Slack очищает все сообщения (~ 8K) в канале


85

В настоящее время у нас есть канал Slack с ~ 8K сообщений, и все они поступают из интеграции с Jenkins. Есть ли программный способ удалить все сообщения с этого канала? Веб-интерфейс может удалять не более 100 сообщений за раз.

Ответы:


71

Я быстро обнаружил, что кто-то уже сделал для этого помощника: лентяйку .

А для меня это просто:

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


Другой вариант идет от npm , просто еще не пробовал.
Hann

3
Где я могу найти свой токен и канал?
kk78626

6
--user "*"также необходимо, чтобы он работал. Также, если вы действительно хотите выполнить задачу удаления, вам следует добавить --perform.
Шаян Салехян

7
Github.com/sgratzl/slack-cleaner вилка является более активным и включает в себя такие функции , как , --quietчтобы не отображать каждое сообщение удаляется на стандартный вывод.
озадаченность

25

Я написал простой скрипт узла для удаления сообщений из публичных / приватных каналов и чатов. Вы можете его модифицировать и использовать.

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

Сначала измените свой токен в разделе конфигурации скриптов, затем запустите скрипт:

node ./delete-slack-messages CHANNEL_ID

Получите токен OAuth:

  1. Перейдите на https://api.slack.com/apps.
  2. Нажмите «Создать новое приложение» и назовите свое (временное) приложение.
  3. В боковой навигационной панели выберите Oauth & Permissions.
  4. На этой странице найдите раздел «Области действия». Нажмите «Добавить область действия OAuth» и добавьте «каналы: история» и «чат: запись». (см. объемы)
  5. Вверху страницы нажмите «Установить приложение в рабочую область». Подтвердите и при перезагрузке страницы скопируйте токен доступа OAuth.

Найдите идентификатор канала

Кроме того, идентификатор канала можно увидеть в URL-адресе браузера, когда вы открываете Slack в браузере. например

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

или же

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

2
Спасибо за это. Одна вещь, которую я заметил, - это то, что он замедляется после удаления нескольких сообщений.
Bertl

3
Как правило, существует ограничение по скорости. Вот почему по прошествии определенного периода времени операции удаления остановятся или замедлятся.
Fırat KÜÇÜK

2
Работает как шарм! Спасибо за это!
brianrhea

1
Использовал, легко, мило. Обратите внимание, что в приведенном выше ответе в настоящее время говорится об использовании устаревших токенов, которые больше не поддерживаются, но Firat уже обновил сам суть этой информацией и предоставляет список областей действия OAuth, которые необходимы. Было на удивление быстро и легко создать Slack-приложение, необходимое для получения токена OAuth и добавления списка областей действия - я говорю 100 секунд.
Дарин

23

Команда очистки по умолчанию не сработала для меня, что привело к следующей ошибке:

$ 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. В обоих случаях название канала было указано без #знака.


11

!!ОБНОВИТЬ!!

как отметил @ niels-van-reijmersdal в комментарии.

Эта функция была удалена. См. Эту ветку для получения дополнительной информации: twitter.com/slackhq/status/467182697979588608?lang=en

!! КОНЕЦ ОБНОВЛЕНИЯ !!

Вот хороший ответ SlackHQ в твиттере, и он работает без каких-либо сторонних материалов. https://twitter.com/slackhq/status/467182697979588608?lang=en

Вы можете массово удалить через страницу архивов ( http://my.slack.com/archives ) для определенного канала: найдите «удалить сообщения» в меню


1
Просто выложите это там, это работает только для каналов, а не для прямых сообщений.
TheRodeo

1
Это удаляет только последние 10 сообщений за раз
MatPag,

1
Нет, раньше этим методом удалял много сообщений. Было около 100 или около того.
Braggae

1
Я просто использовал это. Если сначала показывалось только 10, но как только я их удалил, он показывал все остальное (всего на канале было менее 100 сообщений, поэтому его можно было ограничить до 100).
Альбин

6
Похоже, у меня это не работает. Он перенаправляет на http: // <teamname> .slack.com / messages / <messageid> (кажется, это последний канал, который я просматривал)
Devil's Advocate

10

Для тех, кому не нужно использовать алгоритмические продажи, вот быстрый способ :

(возможно, только для платных пользователей)

  1. Откройте канал в Интернете или в настольном приложении и щелкните шестеренку (вверху справа).
  2. Выберите «Дополнительные параметры ...», чтобы открыть меню архивирования. ноты
  3. Выберите «Установить политику хранения сообщений канала».
  4. Установите «Хранить все сообщения определенное количество дней».
  5. Все сообщения старше этого времени удаляются безвозвратно!

Я обычно устанавливаю для этого параметра значение «1 день», чтобы оставить канал с некоторым контекстом, затем я возвращаюсь к приведенным выше настройкам и устанавливаю для политики хранения значение «по умолчанию», чтобы продолжить их хранение с этого момента .

Примечания:
Люк указывает: Если параметр скрыт: вам нужно перейти в настройки администратора глобальной рабочей области, «Сохранение и удаление сообщений» и установить флажок «Разрешить участникам рабочей области отменять эти настройки»


2
На самом деле это просто скрыто. Чтобы это выглядело, вам нужно перейти в настройки администратора глобальной рабочей области, «Сохранение и удаление сообщений» и установить флажок «Разрешить участникам рабочей области отменять эти настройки».
Люк

Спасибо, я добавил ваш комментарий. Также обратите внимание, что мы даже предложили заплатить Slack за время разработки для ретроспективного удаления, но они сказали, что это просто невозможно, кроме корпоративной версии (из-за другой среды для хранения данных).
Hicsy

Как упомянул @Hicsy, опция «Сохранение и удаление сообщений» является «платной функцией»
Фил

4

Вариант 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 для них являются каналы. * Вместо групп. *



1

Как указывается в других ответах, ограничения скорости Slack делают это сложным - ограничение скорости относительно низкое для их API chat.delete ~ 50 запросов в минуту.

Лучшая стратегия, которая соблюдает ограничение скорости, - это извлекать сообщения из канала, который вы хотите очистить, а затем удалять сообщения пакетами до 50, которые выполняются с минутным интервалом.

Я создал проект, содержащий пример этой пакетной обработки, которую вы можете легко разветвить и развернуть в Autocode - она ​​позволяет вам очистить канал с помощью команды косой черты (и, конечно же, позволяет ограничить доступ к команде только определенным пользователям!). Когда вы запускаете /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/


0

Если вам нравится Python и вы получили устаревший токен API из slack 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()

-1

Существует инструмент для удаления всех нежелательных сообщений в вашем рабочем пространстве. Проверьте это: https://www.messagebender.com


-2

Вот отличное расширение Chrome для массового удаления сообщений Slack-канала / группы / im - https://slackext.com/deleter , где вы можете фильтровать сообщения по звездочке, временному диапазону или пользователям. Кстати, он также поддерживает загрузку всех сообщений в последней версии, после чего вы можете загружать свои ~ 8k сообщений по мере необходимости.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.