Bir kanaldaki tüm mesajları (~ 8K) gevşetin


85

Ş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:


71

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


Başka bir seçenek npm'den geliyor, henüz denemedim.
Hann

3
Jetonumu ve kanalımı nerede bulabilirim?
kk78626

6
--user "*"çalışması için de gereklidir. Ayrıca, kaldırma görevini gerçekten gerçekleştirmek istiyorsanız, eklemelisiniz --perform.
Shayan Salehian

7
Github.com/sgratzl/slack-cleaner çatal daha aktiftir ve benzeri özellikleri içerir --quiether mesaj stdout'ta silinmesini bilgisi gelmiyordu.
anlaşılmaz

25

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

Bir OAuth jetonu alın:

  1. Https://api.slack.com/apps adresine gidin
  2. 'Yeni Uygulama Oluştur'u tıklayın ve (geçici) uygulamanızı adlandırın.
  3. Yan gezinme bölmesinde "Oauth & İzinler" e gidin
  4. Bu sayfada 'Kapsamlar' bölümünü bulun. "OAuth Kapsamı Ekle" yi tıklayın ve "kanallar: geçmiş" ve "sohbet: yazma" yı ekleyin. (kapsamlara bakın)
  5. Sayfanın üst kısmında, 'Uygulamayı Çalışma Alanına Kur'u tıklayın. Onaylayın ve sayfayı yeniden yüklerken OAuth Erişim Jetonunu kopyalayın.

Kanal kimliğini bulun

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

2
Bunun için teşekkürler. Fark ettiğim bir şey, birkaç mesaj silindikten sonra yavaşlaması.
Bertl

3
Genellikle bir oran sınırlaması vardır. Bu nedenle, bir süre sonra silme işlemleri duracak veya yavaşlayacaktır.
Fırat KÜÇÜK

2
Tıkır tıkır çalışıyor! Bunun için teşekkürler!
brianrhea

1
Kullandım, kolay, tatlı. Yukarıdaki cevabın şu anda artık desteklenmeyen eski jetonların kullanılması gerektiğini söylediğine dikkat edin, ancak Fırat bu bilgilerle özü zaten güncelledi ve gerekli OAuth kapsamlarının listesini verdi. O was şaşırtıcı kapsamları-ben konuşmasıyla 100 saniye listesini olsun OAuth kodu için gerekli gevşeklik uygulama oluşturup eklemek için hızlı-kolay n.
Daryn

23

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 RequestsSlack 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ı


11

!!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


1
Sadece oraya koyarsak, bu sadece kanallar için işe yarar, doğrudan mesajlar için değil.
TheRodeo

1
Bu, bir seferde yalnızca son 10 mesajı siler
MatPag

1
Hayır, bu yöntemle birçok mesajı silerdim. 100 civarı falan.
Braggae

1
Ben sadece kullandım. İlk önce yalnızca 10 gösterdiyse, ancak bir kez sildim, geri kalanını da gösteriyordu (kanalın toplamda 100'den az mesajı vardı, bu nedenle yine de 100 ile sınırlı olabilir).
Albin

6
Bu benim için işe yaramıyor gibi görünüyor. Http: // <teamname> .slack.com / messages / <messageid> adresine yönlendiriyor (görüntülediğim son kanal gibi görünüyor)
Devil's Advocate

10

Programatik yapması gerekmeyenler için işte hızlı bir yol :

(muhtemelen yalnızca ücretli kullanıcılar için)

  1. Kanalı web'de veya masaüstü uygulamasında açın ve dişliyi tıklayın (sağ üst).
  2. Arşiv menüsünü açmak için "Ek seçenekler ..." öğesini seçin. notlar
  3. "Kanal mesaj saklama politikasını ayarla" seçeneğini seçin.
  4. "Tüm iletileri belirli bir gün sayısı boyunca sakla" ayarını yapın.
  5. Bu süreden daha eski tüm mesajlar kalıcı olarak silinir!

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.


2
Aslında sadece gizli. Görünmesini sağlamak için genel ç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.
Luke

Teşekkürler, yorumunuzu eklemek için güncelledim. Ayrıca, geriye dönük olarak silmek için dev-time için Slack'e ödeme yapmayı bile teklif ettiğimizi lütfen unutmayın, ancak kurumsal sürümden başka mümkün olmadığını söylediler (veri depolamak için farklı ortam nedeniyle).
Hicsy

@Hicsy'de belirtildiği gibi, "Mesaj Saklama ve Silme" seçeneği bir "Ücretli Özellik"
Phil

4

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. *



1

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 clearkanalda ç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/


0

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()


-2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.