Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

И для меня это просто: slack-cleaner --token=<TOKEN> --message --channel jenkins

Ответ 2

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

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

Ответ 3

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

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

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

node ./delete-slack-messages CHANNEL_ID

Вы можете узнать свой токен по следующему URL:

https://api.slack.com/custom-integrations/legacy-tokens

Кроме того, идентификатор канала записывается в адресной строке браузера.

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

Ответ 4

!! ОБНОВЛЕНИЕ!!

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

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

!! END UPDATE!!

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Вариант 1 Вы можете настроить канал Slack на автоматическое удаление сообщений через 1 день, но он немного скрыт. Во-первых, вам нужно перейти к настройкам Slack Workspace, "Сохранение и удаление сообщений" и установить флажок "Разрешить членам рабочей области переопределять эти настройки". После этого в клиенте 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 для них - каналы. * Вместо групп. *

Ответ 8

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

Ответ 9

Если вам нравится Python и вы получили устаревший токен API из слабого API, вы можете удалить все личные сообщения, отправленные пользователю, с помощью следующего:

import requests
import sys
import time
from json import loads

# config - replace the bit between quotes with your "token"
token = 'xoxp-419616851878-505499070480-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()

Ответ 10

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