Şu anda tümü Jenkins entegrasyonundan gelen ~ 8K mesajlı bir Slack kanalımız var. Bu kanaldaki tüm mesajları silmenin programlı bir yolu var mı? Web arayüzü bir seferde yalnızca 100 mesajı silebilir.
Yanıtlar:
Hızlı bir şekilde birinin zaten yardımcı olduğunu öğrendim: bunun için gevşek temizlikçi .
Ve benim için sadece:
slack-cleaner --token=<TOKEN> --message --channel jenkins --user "*" --perform
--user "*"
çalışması için de gereklidir. Ayrıca, kaldırma görevini gerçekten gerçekleştirmek istiyorsanız, eklemelisiniz --perform
.
--quiet
her mesaj stdout'ta silinmesini bilgisi gelmiyordu.
Genel / özel kanallardan ve sohbetlerden mesajları silmek için basit bir düğüm betiği yazdım. Değiştirebilir ve kullanabilirsiniz.
https://gist.github.com/firatkucuk/ee898bc919021da621689f5e47e7abac
Öncelikle, kodunuzu komut dosyası yapılandırma bölümünde değiştirin ve ardından komut dosyasını çalıştırın:
node ./delete-slack-messages CHANNEL_ID
Ayrıca, tarayıcıda gevşeklik açtığınızda kanal kimliği tarayıcı URL'sinde görülebilir. Örneğin
https://mycompany.slack.com/messages/MY_CHANNEL_ID/
veya
https://app.slack.com/client/WORKSPACE_ID/MY_CHANNEL_ID
varsayılan temizleme komutu benim için şu hatayı vererek çalışmadı:
$ slack-cleaner --token=<TOKEN> --message --channel <CHANNEL>
Running slack-cleaner v0.2.4
Channel, direct message or private group not found
ancak aşağıdaki bot mesajlarını temizlemek için herhangi bir sorun olmadan çalıştı
slack-cleaner --token <TOKEN> --message --group <CHANNEL> --bot --perform --rate 1
veya
slack-cleaner --token <TOKEN> --message --group <CHANNEL> --user "*" --perform --rate 1
tüm mesajları temizlemek için.
HTTP 429 Too Many Requests
Slack api hız sınırı nedeniyle hatayı önlemek için 1 saniyelik hız sınırı kullanıyorum. Her iki durumda da kanal adı #
işaretsiz olarak sağlandı
!!GÜNCELLEME!!
@ niels-van-reijmersdal yorumda yer aldı.
Bu özellik kaldırılmıştır. Daha fazla bilgi için bu konuya bakın: twitter.com/slackhq/status/467182697979588608?
!! GÜNCELLEMEYİ SONLANDIR !!
İşte twitter'daki SlackHQ'dan güzel bir cevap ve herhangi bir üçüncü taraf malzemesi olmadan çalışıyor. https://twitter.com/slackhq/status/467182697979588608?lang=en
Belirli bir kanal için arşivler ( http://my.slack.com/archives ) sayfası üzerinden toplu silebilirsiniz : menüde "mesajları sil" i arayın
Programatik yapması gerekmeyenler için işte hızlı bir yol :
(muhtemelen yalnızca ücretli kullanıcılar için)
Kanaldan bir miktar bağlamla ayrılmak için genellikle bu seçeneği "1 gün" olarak ayarlıyorum, ardından yukarıdaki ayarlara geri dönüyorum ve bundan sonra kaydetmeye devam etmek için saklama politikasını "varsayılan" olarak ayarlıyorum .
Notlar:
Luke dikkat çekiyor: Seçenek gizliyse: Global çalışma alanı Yönetici ayarlarına, Mesaj Saklama ve Silme'ye gitmeniz ve "Çalışma alanı üyelerinin bu ayarları geçersiz kılmasına izin ver" seçeneğini işaretlemeniz gerekir.
Seçenek 1 Bir Slack kanalını 1 gün sonra mesajları otomatik olarak silecek şekilde ayarlayabilirsiniz, ancak bu biraz gizlidir. Öncelikle, Slack Çalışma Alanı Ayarlarınıza, Mesaj Saklama ve Silme bölümüne gitmeniz ve "Çalışma alanı üyelerinin bu ayarları geçersiz kılmasına izin ver" seçeneğini işaretlemeniz gerekir. Bundan sonra, Slack istemcisinde bir kanal açabilir, dişliye tıklayabilir ve "Mesaj saklamayı düzenle ..." seçeneğine tıklayabilirsiniz.
Seçenek 2 Başkalarının bahsettiği slack-cleaner komut satırı aracı.
Seçenek 3 Aşağıda, Özel kanalları temizlemek için kullandığım küçük bir Python betiği var. Daha programlı silme denetimi istiyorsanız, iyi bir başlangıç noktası olabilir. Maalesef Slack'in toplu silme API'si yoktur ve tek tek silme işlemini dakikada 50 ile sınırlar, bu nedenle kaçınılmaz olarak uzun zaman alır.
# -*- 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.")
Bu komut dosyasının genel kanalları listelemek ve temizlemek için değiştirilmesi gerektiğini unutmayın. Bunlar için API yöntemleri, gruplar yerine kanallardır. *
İpucu: bolluk temizleyiciyi https://github.com/kfei/slack-cleaner kullanacaksanız
Bir belirteç oluşturmanız gerekecek: https://api.slack.com/custom-integrations/legacy-tokens
Diğer yanıtların ima ettiği gibi, Slack'in oran sınırları bunu zorlaştırır - hız sınırı, chat.delete API'si için dakikada ~ 50 istekle nispeten düşüktür .
Hız sınırına uyan en iyi strateji, temizlemek istediğiniz kanaldan mesajları almak ve ardından mesajları 50'nin altındaki gruplar halinde ve dakika aralıklarla silmektir.
Bu toplu işlemin bir örneğini içeren bir proje oluşturdum, bunu Autocode üzerinde kolayca çatallayabilir ve dağıtabilirsiniz - bu, eğik çizgi komutuyla bir kanalı temizlemenizi sağlar (ve komuta erişimi elbette yalnızca belirli kullanıcılarla kısıtlamanıza izin verir!). Bir /cmd clear
kanalda çalıştırdığınızda , o kanalı temizlemek için işaretler ve kanaldaki tüm mesajları silene kadar her dakika aşağıdaki kodu çalıştırır:
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
};
}
});
Tam kodu ve kendi sürümünüzü dağıtmak için bir kılavuzu burada görüntüleyebilirsiniz: https://autocode.com/src/jacoblee/slack-clear-messages/
Python'u seviyorsanız ve slack api'den eski bir API belirteci edindiyseniz, bir kullanıcıya gönderdiğiniz tüm özel mesajları aşağıdakilerle silebilirsiniz:
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()
Çalışma alanınızdaki tüm gevşek mesajları silmek için bir gevşeklik aracı vardır. Şuna bakın: https://www.messagebender.com
Burada, gevşek kanal / grup / im mesajlarınızı toplu olarak silmek için harika bir krom uzantısı var - https://slackext.com/deleter , mesajları yıldız, zaman aralığı veya kullanıcılara göre filtreleyebilirsiniz. BTW, son sürümdeki tüm mesajları yüklemeyi de destekler, daha sonra ~ 8k mesajlarınızı ihtiyaç duyduğunuz kadar yükleyebilirsiniz.