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:
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
--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
.
--quiet
không hiển thị mỗi tin nhắn bị xóa trên stdout.
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
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
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 Requests
lỗ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
!! 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
Đố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í)
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"
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. *
Mẹo: nếu bạn định sử dụng trình dọn dẹp slack https://github.com/kfei/slack-cleaner
Bạn sẽ cần tạo mã thông báo: https://api.slack.com/custom-integrations/legacy-tokens
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 clear
trong 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/
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()
Có một công cụ slack để xóa tất cả các thông báo slack trên không gian làm việc của bạn. Kiểm tra nó: https://www.messagebender.com
Đâ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.