Slack очищення всіх повідомлень (~ 8K) в каналі


85

На даний момент у нас є канал Slack із ~ 8 тисячами повідомлень, все це пов’язано з інтеграцією Дженкінса. Чи існує якийсь програмний спосіб видалити всі повідомлення з цього каналу? Веб-інтерфейс може одночасно видаляти лише 100 повідомлень.

Відповіді:


71

Я швидко дізнався, що хтось уже зробив помічника: засіб для чищення .

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

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


Інший варіант походить від npm , просто ще не пробував.
Ханн,

1
Де я можу знайти свій маркер і канал?
kk78626,

6
--user "*"також необхідно, щоб це працювало. Також якщо ви хочете фактично виконати завдання видалення, вам слід додати --perform.
Shayan Salehian

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

24

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

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-адресі браузера, коли ви відкриваєте слабке місце в браузері. напр

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

або

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

2
Дякую за це. Помічаю одне, що він уповільнюється після видалення кількох повідомлень.
Бертль

3
Як правило, існує обмеження ставки. Ось чому через певний проміжок часу операції видалення збираються зупинитись або уповільнитись.
Fırat KÜÇÜK

2
Працює як шарм! Дякую за це!
бріанея

1
Використовували, легко, солодко. Зауважте, що у наведеній вище відповіді в даний час сказано використовувати застарілі маркери, які більше не підтримуються, але Firat вже оновив суть цієї інформації та надає список необхідних областей OAuth. Це було напрочуд швидко-легко створити слабку програму, необхідну для отримання токена OAuth та додавання списку областей - я говорю 100 секунд.
Дарин

23

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


11

!! ОНОВЛЕННЯ !!

як зазначив @ 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
Просто виклавши це, це працює лише для каналів, а не прямих повідомлень.
TheRodeo

1
Буде видалено лише останні 10 повідомлень за раз
MatPag

1
Ні, я раніше видаляв багато повідомлень цим методом. Це було близько 100 чи щось інше.
Braggae

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

6
Здається, це не працює для мене. Він переспрямовує на http: // <ім'я команди> .slack.com / messages / <messageid> (здається, останній канал, який я переглядав)
адвокат диявола

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 роблять це складним - обмеження швидкості є відносно низьким для їх 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/


0

Якщо вам подобається 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()

-1

Існує інструмент слабкості, щоб видалити всі повідомлення про слабкість у вашій робочій області. Перевірте це: https://www.messagebender.com


-2

Ось чудове розширення chrome для масового видалення ваших неміцних каналів / груп / ім повідомлень - https://slackext.com/deleter , де ви можете фільтрувати повідомлення за зіркою, часовим діапазоном або користувачами. До речі, він також підтримує завантаження всіх повідомлень в останній версії, тоді ви можете завантажувати ~ 8k повідомлень, як вам потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.