Slack xóa tất cả các tin nhắn (~ 8K) trong một kênh


85

Chúng tôi hiện có một kênh Slack với ~ 8K tin nhắn, tất cả đều đến từ tích hợp Jenkins. Có cách lập trình nào để xóa tất cả tin nhắn khỏi kênh đó không? Giao diện web chỉ có thể xóa 100 tin nhắn cùng một lúc.

Câu trả lời:


71

Tôi nhanh chóng phát hiện ra rằng có ai đó đã thực hiện một người trợ giúp: slack-clean cho việc này.

Và đối với tôi nó chỉ là:

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


Một tùy chọn khác đến từ npm , chỉ là chưa thử.
Hann

2
Tôi có thể tìm thấy mã thông báo và kênh của mình ở đâu?
kk78626

6
--user "*"cũng cần thiết để làm cho nó hoạt động. Ngoài ra, nếu bạn muốn thực sự thực hiện tác vụ xóa, bạn nên thêm --perform.
Shayan Salehian

7
Các github.com/sgratzl/slack-cleaner ngã ba là tích cực hơn và bao gồm các tính năng như --quietkhông hiển thị mỗi tin nhắn bị xóa trên stdout.
bối rối

24

Tôi đã viết một tập lệnh nút đơn giản để xóa tin nhắn khỏi các kênh và cuộc trò chuyện công khai / riêng tư. Bạn có thể sửa đổi và sử dụng nó.

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

Trước tiên, hãy sửa đổi mã thông báo của bạn trong phần cấu hình tập lệnh, sau đó chạy tập lệnh:

node ./delete-slack-messages CHANNEL_ID

Nhận mã thông báo OAuth:

  1. Tới https://api.slack.com/apps
  2. Nhấp vào 'Tạo ứng dụng mới' và đặt tên cho ứng dụng (tạm thời) của bạn.
  3. Trong điều hướng bên, chuyển đến 'Oauth & Permissions'
  4. Trên trang đó, tìm phần 'Phạm vi'. Nhấp vào 'Thêm phạm vi OAuth' và thêm 'kênh: lịch sử' và 'trò chuyện: viết'. (xem phạm vi)
  5. Ở đầu trang, nhấp vào 'Cài đặt ứng dụng vào không gian làm việc'. Xác nhận và khi tải lại trang, hãy sao chép Mã thông báo truy cập OAuth.

Tìm ID kênh

Ngoài ra, ID kênh có thể được nhìn thấy trong URL của trình duyệt khi bạn mở slack trong trình duyệt. ví dụ

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

hoặc là

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

2
Cảm ơn vì điều đó. Một điều tôi nhận thấy là nó chạy chậm lại sau khi một vài tin nhắn bị xóa.
Bertl

3
Nói chung, có một giới hạn tỷ lệ. Đó là lý do tại sao sau một khoảng thời gian, các hoạt động xóa sẽ bị đình trệ hoặc chậm lại.
Fırat KÜÇÜK

2
Hoạt động như một sự quyến rũ! Cám ơn vì cái này!
tăng tiết nước bọt

1
Đã sử dụng nó, dễ dàng, ngọt ngào. Lưu ý rằng câu trả lời ở trên hiện cho biết sử dụng mã thông báo kế thừa không còn được hỗ trợ, nhưng Firat đã tự cập nhật ý chính với thông tin đó và cung cấp danh sách phạm vi OAuth cần thiết. Việc tạo ứng dụng slack cần thiết để lấy mã thông báo OAuth và thêm danh sách các phạm vi một cách nhanh chóng-n-dễ dàng một cách đáng ngạc nhiên - tôi sẽ nói trong 100 giây.
Daryn

23

lệnh sạch mặc định không hoạt động đối với tôi, do lỗi sau:

$ slack-cleaner --token=<TOKEN> --message --channel <CHANNEL>

Running slack-cleaner v0.2.4
Channel, direct message or private group not found

nhưng theo dõi hoạt động mà không có bất kỳ vấn đề nào để xóa tin nhắn bot

slack-cleaner --token <TOKEN> --message --group <CHANNEL> --bot --perform --rate 1 

hoặc là

slack-cleaner --token <TOKEN> --message --group <CHANNEL> --user "*" --perform --rate 1 

để làm sạch tất cả các tin nhắn.

Tôi sử dụng giới hạn tốc độ 1 giây để tránh HTTP 429 Too Many Requestslỗi do giới hạn tốc độ api chậm. Trong cả hai trường hợp, tên kênh được cung cấp mà không có #dấu


11

!! CẬP NHẬT !!

như @ niels-van-reijmersdal đã đấu giá trong nhận xét.

Tính năng này đã bị xóa. Xem chủ đề này để biết thêm thông tin: twitter.com/slackhq/status/467182697979588608?lang=vi

!! KẾT THÚC CẬP NHẬT !!

Đây là một câu trả lời hay từ SlackHQ trên twitter và nó hoạt động mà không cần bất kỳ thứ gì của bên thứ ba. https://twitter.com/slackhq/status/467182697979588608?lang=vi

Bạn có thể xóa hàng loạt thông qua trang lưu trữ ( http://my.slack.com/archives ) cho một kênh cụ thể: tìm "xóa thư" trong menu


1
Chỉ cần đưa nó ra đó, điều này chỉ hoạt động cho các kênh chứ không phải tin nhắn trực tiếp.
TheRodeo

1
Thao tác này chỉ xóa 10 tin nhắn cuối cùng tại thời điểm
MatPag

1
Không, tôi đã từng xóa rất nhiều tin nhắn bằng phương pháp này. Đó là khoảng 100 hoặc gì đó.
Braggae

1
Tôi mới sử dụng nó. Nếu lần đầu tiên chỉ hiển thị 10, nhưng sau khi tôi xóa chúng, nó sẽ hiển thị phần còn lại (tổng cộng kênh có ít hơn 100 tin nhắn, vì vậy nó vẫn có thể bị giới hạn ở 100).
Albin

6
Điều này dường như không hiệu quả với tôi. Nó chuyển hướng đến http: // <teamname> .slack.com / messages / <messageid> (có vẻ là kênh cuối cùng tôi đã xem)
Advocate Devil

10

Đối với bất kỳ ai khác không cần lập trình, đây là một cách nhanh chóng :

(có thể chỉ dành cho người dùng trả phí)

  1. Mở kênh trong web hoặc ứng dụng dành cho máy tính để bàn và nhấp vào bánh răng (trên cùng bên phải).
  2. Chọn "Tùy chọn bổ sung ..." để hiển thị menu lưu trữ. ghi chú
  3. Chọn "Đặt chính sách lưu giữ tin nhắn kênh".
  4. Đặt "Lưu giữ tất cả thư trong một số ngày cụ thể".
  5. Tất cả các tin nhắn cũ hơn thời gian này sẽ bị xóa vĩnh viễn!

Tôi thường đặt tùy chọn này thành "1 ngày" để rời khỏi kênh với một số ngữ cảnh, sau đó tôi quay lại cài đặt ở trên và đặt chính sách lưu giữ của nó về "mặc định" để tiếp tục lưu trữ chúng từ bây giờ.

Lưu ý:
Luke chỉ ra: Nếu tùy chọn bị ẩn: bạn phải đi tới Cài đặt quản trị không gian làm việc chung, Lưu giữ & Xóa tin nhắn và chọn "Cho phép thành viên không gian làm việc ghi đè các cài đặt này"


2
Thực ra nó chỉ là ẩn. Để hiển thị, bạn phải đi tới Cài đặt quản trị không gian làm việc chung, Lưu giữ và xóa tin nhắn và chọn "Cho phép thành viên không gian làm việc ghi đè các cài đặt này".
Luke

Cảm ơn, tôi đã cập nhật để bao gồm bình luận của bạn. Cũng xin lưu ý rằng chúng tôi thậm chí đã đề nghị trả tiền cho Slack cho thời gian dành cho nhà phát triển để xóa hồi tố, nhưng họ nói rằng điều đó đơn giản là không thể thực hiện được ngoài phiên bản doanh nghiệp (do môi trường lưu trữ dữ liệu khác nhau).
Hicsy

Như đã đề cập bởi @Hicsy, tùy chọn "Lưu giữ và xóa tin nhắn" là một "Tính năng trả phí"
Phil

4

Tùy chọn 1 Bạn có thể đặt kênh Slack tự động xóa tin nhắn sau 1 ngày, nhưng nó hơi bị ẩn. Trước tiên, bạn phải đi tới Cài đặt không gian làm việc Slack, Lưu giữ và xóa tin nhắn và chọn "Cho phép thành viên không gian làm việc ghi đè các cài đặt này". Sau đó, trong ứng dụng Slack, bạn có thể mở một kênh, nhấp vào bánh răng và nhấp vào "Chỉnh sửa lưu giữ thư ..."

Tùy chọn 2 Công cụ dòng lệnh slack-clean mà những người khác đã đề cập.

Tùy chọn 3 Dưới đây là một tập lệnh Python nhỏ mà tôi sử dụng để xóa các kênh Riêng tư. Có thể là một điểm khởi đầu tốt nếu bạn muốn kiểm soát xóa có lập trình hơn. Thật không may, Slack không có API xóa hàng loạt và họ giới hạn tốc độ xóa từng cá nhân ở mức 50 mỗi phút, vì vậy không thể tránh khỏi mất nhiều thời gian.

# -*- 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.")

Lưu ý, tập lệnh đó sẽ cần sửa đổi để liệt kê và xóa các kênh công khai. Các phương thức API cho đó là các kênh. * Thay vì nhóm. *



1

Như các câu trả lời khác ám chỉ, giới hạn tỷ lệ của Slack làm cho điều này trở nên phức tạp - giới hạn tỷ lệ tương đối thấp cho cuộc trò chuyện của họ. Xóa API ở mức ~ 50 yêu cầu mỗi phút.

Chiến lược tốt nhất tôn trọng giới hạn tốc độ là truy xuất tin nhắn từ kênh bạn muốn xóa, sau đó xóa tin nhắn theo lô dưới 50 tin nhắn chạy theo khoảng thời gian nhỏ.

Tôi đã xây dựng một dự án có chứa một ví dụ về lô này mà bạn có thể dễ dàng phân nhánh và triển khai trên Autocode - nó cho phép bạn xóa kênh thông qua lệnh gạch chéo (và tất nhiên là cho phép bạn hạn chế quyền truy cập vào lệnh đối với một số người dùng nhất định!). Khi bạn chạy /cmd cleartrong một kênh, nó sẽ đánh dấu kênh đó để xóa và chạy mã sau mỗi phút cho đến khi xóa tất cả các thông báo trong kênh:

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
    };
  }
});

Bạn có thể xem toàn bộ mã và hướng dẫn triển khai phiên bản của riêng mình tại đây: https://autocode.com/src/jacoblee/slack-clear-messages/


0

Nếu bạn thích Python và đã nhận được mã thông báo API kế thừa từ api slack, bạn có thể xóa tất cả các tin nhắn riêng tư mà bạn đã gửi cho người dùng bằng những điều sau:

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

Đây là một tiện ích mở rộng chrome tuyệt vời để xóa hàng loạt tin nhắn kênh / nhóm / im của bạn - https://slackext.com/deleter , nơi bạn có thể lọc tin nhắn theo sao, phạm vi thời gian hoặc người dùng. BTW, nó cũng hỗ trợ tải tất cả các tin nhắn trong phiên bản gần đây, sau đó bạn có thể tải ~ 8k tin nhắn khi cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.