채널의 모든 메시지 (~ 8K)를 Slack 정리


85

현재 Jenkins 통합에서 제공되는 ~ 8K 메시지가 포함 된 Slack 채널이 있습니다. 해당 채널에서 모든 메시지를 삭제하는 프로그래밍 방식이 있습니까? 웹 인터페이스는 한 번에 100 개의 메시지 만 삭제할 수 있습니다.

답변:


71

: 누군가가 이미 도우미 만들어 거기에서 나는 빨리 발견 여유 클리너를 이를 위해.

그리고 나를 위해 그것은 단지 :

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


또 다른 옵션은 npm 에서 제공되며 아직 시도하지 않았습니다.
Hann 2015 년

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 및 권한'으로 이동합니다.
  4. 해당 페이지에서 '범위'섹션을 찾습니다. 'OAuth 범위 추가'를 클릭하고 'channels : history'및 'chat : write'를 추가합니다. (범위 참조)
  5. 페이지 상단에서 '워크 스페이스에 앱 설치'를 클릭합니다. 확인하고 페이지 새로 고침에서 OAuth 액세스 토큰을 복사합니다.

채널 ID 찾기

또한 브라우저에서 slack을 열면 브라우저 URL에서 채널 ID를 볼 수 있습니다. 예 :

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 범위 목록을 제공합니다. OAuth 토큰을 얻고 범위 목록을 추가하는 데 필요한 Slack 앱을 만드는 것은 놀랍도록 빠르고 쉬웠습니다. 저는 100 초 동안 이야기 하고 있습니다.
Daryn

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 

모든 메시지를 정리합니다.

HTTP 429 Too Many Requests슬랙 API 속도 제한으로 인한 오류 를 피하기 위해 1 초의 속도 제한을 사용합니다. 두 경우 모두 채널 이름이 #부호 없이 제공되었습니다.


11

!!최신 정보!!

@ niels-van-reijmersdal이 의견에 언급했듯이.

이 기능은 제거되었습니다. 자세한 정보는이 스레드를 참조하십시오 : twitter.com/slackhq/status/467182697979588608?lang=en

!! 업데이트 종료 !!

여기에 트위터의 SlackHQ의 좋은 답변이 있으며 제 3 자 없이도 작동합니다. https://twitter.com/slackhq/status/467182697979588608?lang=ko

특정 채널 의 아카이브 ( http://my.slack.com/archives ) 페이지를 통해 대량 삭제할 수 있습니다 . 메뉴에서 "메시지 삭제"를 찾으십시오.


1
그냥 놔두면 직접 메시지가 아닌 채널에서만 작동합니다.
TheRodeo 2017

1
이것은 시간에 마지막 10 개의 메시지 만 삭제합니다
MatPag

1
아니요,이 방법으로 많은 메시지를 삭제했습니다. 약 100 개 정도였습니다.
Braggae

1
방금 사용했습니다. 처음에 10 개만 표시되었지만 삭제 한 후에는 나머지가 표시되었습니다 (채널에 총 메시지 수가 100 개 미만이므로 여전히 100 개로 제한 될 수 있음).
Albin

6
이것은 나를 위해 작동하지 않는 것 같습니다. 그것은 리디렉션에 http : // <teamname> .slack.com / 메시지 / <의 MessageID> (이 나타납니다 내가 마지막으로 본 채널이 될 수 있습니다)
악마의 옹호자

10

프로그래밍 방식으로 수행 할 필요가없는 다른 사용자를위한 빠른 방법은 다음과 같습니다.

(유료 사용자에게만 해당)

  1. 웹 또는 데스크톱 앱에서 채널을 열고 톱니 바퀴 (오른쪽 상단)를 클릭합니다.
  2. 보관 메뉴를 불러 오려면 "추가 옵션 ..."을 선택하십시오. 메모
  3. "채널 메시지 보존 정책 설정"을 선택합니다.
  4. "특정 일 수 동안 모든 메시지 보관"을 설정합니다.
  5. 이 시간보다 오래된 모든 메시지는 영구적으로 삭제됩니다!

일반적으로이 옵션을 "1 일"로 설정하여 일부 컨텍스트와 함께 채널을 떠난 다음 위의 설정으로 돌아가서 보존 정책을 다시 "기본값" 으로 설정 하여 지금부터 계속 저장합니다.

참고 :
Luke는 다음과 같이 지적합니다. 옵션이 숨겨진 경우 : 전역 작업 영역 관리 설정, 메시지 보존 및 삭제로 이동하여 "작업 영역 구성원이이 설정을 재정의하도록 허용"을 선택해야합니다.


2
실제로는 숨겨져 있습니다. 표시하려면 전역 작업 영역 관리자 설정, 메시지 보존 및 삭제로 이동하여 "작업 영역 구성원이이 설정을 재정의하도록 허용"을 선택해야합니다.
Luke

감사합니다. 귀하의 의견을 포함하도록 업데이트했습니다. 또한 우리는 개발 시간을 소급하여 삭제할 수 있도록 Slack에 비용을 지불하겠다고 제안했지만 엔터프라이즈 에디션 외에는 불가능하다고 말했습니다 (데이터 저장 환경이 다르기 때문에).
Hicsy

@Hicsy에서 언급했듯이 "메시지 보관 및 삭제"옵션은 "유료 기능"입니다
Phil

4

옵션 1 1 일 후 자동으로 메시지를 삭제하도록 Slack 채널을 설정할 수 있지만 약간 숨겨져 있습니다. 먼저 Slack 작업 공간 설정, 메시지 보존 및 삭제로 이동하여 "작업 공간 구성원이이 설정을 재정의하도록 허용"을 선택해야합니다. 그런 다음 Slack 클라이언트에서 채널을 열고 기어를 클릭 한 다음 "메시지 보관 수정 ..."을 클릭 할 수 있습니다.

옵션 2 다른 사람들이 언급 한 slack-cleaner 명령 줄 도구.

옵션 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 메소드는 그룹이 아닌 channels. *입니다. *



1

다른 답변에서 알 수 있듯이 Slack의 속도 제한은이를 까다롭게 만듭니다. 채팅에 대한 속도 제한은 상대적으로 낮 습니다. API 분당 최대 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을 좋아 하고 slack 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()


-2

다음은 slack channel / group / im 메시지를 대량 삭제하는 훌륭한 크롬 확장 프로그램입니다-https: //slackext.com/deleter , 여기서 별, 시간 범위 또는 사용자별로 메시지를 필터링 할 수 있습니다. BTW, 그것은 또한 최신 버전의 모든 메시지로드를 지원하므로 필요에 따라 ~ 8k 메시지를로드 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.