एक चैनल में सभी संदेशों को साफ करें (~ 8K)


85

वर्तमान में हमारे पास ~ 8K संदेशों के साथ एक स्लैक चैनल है जो सभी जेनकिंस एकीकरण से आता है। क्या उस चैनल के सभी संदेशों को हटाने के लिए कोई प्रोग्रामेटिक तरीका है? वेब इंटरफ़ेस एक बार में केवल 100 संदेश हटा सकता है।

जवाबों:


71

मुझे जल्दी से पता चला कि कोई व्यक्ति पहले से ही एक सहायक बना हुआ है: इसके लिए सुस्त-क्लीनर

और मेरे लिए यह सिर्फ:

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


एक और विकल्प npm से आता है , अभी तक कोशिश नहीं की है।
हेन

1
मुझे अपना टोकन और चैनल कहां मिल सकता है?
kk78626

6
--user "*"यह काम करने के लिए भी आवश्यक है। यदि आप वास्तव में निष्कासन कार्य करना चाहते हैं, तो भी आपको जोड़ना चाहिए --perform
शयन सालेहियन

7
Github.com/sgratzl/slack-cleaner कांटा अधिक सक्रिय है और जैसी सुविधाओं के शामिल --quietकरने के लिए प्रदर्शित नहीं हर संदेश stdout पर हटाया जा रहा है।
पहेली

24

मैंने सार्वजनिक / निजी चैनलों और चैट से संदेशों को हटाने के लिए एक सरल नोड स्क्रिप्ट लिखी। आप इसे संशोधित और उपयोग कर सकते हैं।

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

सबसे पहले, स्क्रिप्ट कॉन्फ़िगरेशन अनुभाग में अपना टोकन संशोधित करें फिर स्क्रिप्ट चलाएँ:

node ./delete-slack-messages CHANNEL_ID

OAuth टोकन प्राप्त करें:

  1. Https://api.slack.com/apps पर जाएं
  2. 'नया ऐप बनाएँ' पर क्लिक करें, और अपना (अस्थायी) ऐप नाम दें।
  3. साइड नेवी में 'Oauth & Permissions' पर जाएं
  4. उस पृष्ठ पर, 'स्कोप्स' अनुभाग खोजें। 'Add a OAuth Scope' पर क्लिक करें और 'चैनल: इतिहास' और 'chat: write' जोड़ें। (scopes देखें)
  5. पृष्ठ के शीर्ष पर, 'ऐप को कार्यक्षेत्र में स्थापित करें' पर क्लिक करें। पुष्टि करें, और पृष्ठ पर पुनः लोड करें, OAuth एक्सेस टोकन को कॉपी करें।

चैनल आईडी खोजें

इसके अलावा, चैनल आईडी ब्राउज़र URL में देखी जा सकती है जब आप ब्राउज़र में सुस्त खोलते हैं। जैसे

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

या

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

2
उसके लिए धन्यवाद। एक बात जो मैंने नोटिस की है कि यह कुछ संदेशों को हटाए जाने के बाद धीमा हो जाता है।
बर्टल

3
आम तौर पर, एक दर सीमा होती है। इसीलिए एक समयावधि के बाद डिलीट ऑपरेशंस स्टाल या धीमा होने जा रहे हैं।
फ्रात K FK

2
एक जादू की तरह काम करता है! इसके लिए धन्यवाद!
ब्रायनहिआ

1
इसका इस्तेमाल किया, आसान, मीठा। ध्यान दें कि उपर्युक्त उत्तर वर्तमान में विरासत टोकन का उपयोग करने के लिए कहता है, जो अब समर्थित नहीं हैं, लेकिन फ़िएट ने पहले से ही उस जानकारी के साथ खुद को जिस्ट अपडेट कर लिया है और OAuth स्कोप की सूची देता है जिनकी आवश्यकता है। यह था आश्चर्यजनक रूप से स्कोप-मैं बात कर रहा 100 सेकंड की सूची ढीला प्राप्त OAuth टोकन के लिए आवश्यक अनुप्रयोग बना सकते हैं और जोड़ने के लिए त्वरित-एन-आसान।
दरियाई

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सुस्त एपी दर सीमा के कारण त्रुटि से बचने के लिए 1 सेकंड की दर-सीमा का उपयोग करता हूं । दोनों मामलों में, चैनल का नाम बिना #हस्ताक्षर के आपूर्ति किया गया था


11

!!अपडेट करें!!

as @ niels-van-reijmersdal टिप्पणी में मिले थे।

यह सुविधा हटा दी गई है। अधिक जानकारी के लिए इस धागे को देखें: twitter.com/slackhq/status/467182697979588608?lang=en

!! END अपडेट !!

यहां ट्विटर में SlackHQ का एक अच्छा जवाब है, और यह किसी भी तीसरे पक्ष के सामान के बिना काम करता है। https://twitter.com/slackhq/status/467182697979588608?lang=en

आप किसी विशेष चैनल के लिए अभिलेखागार ( http://my.slack.com/archives ) पृष्ठ के माध्यम से हटा सकते हैं : मेनू में "हटाएं" देखें


1
बस इसे वहां डाल देना, यह केवल चैनलों के लिए काम करता है न कि सीधे संदेश।
TheRodeo

1
यह केवल समय पर पिछले 10 संदेशों को
हटाता है

1
नहीं, मैं इस पद्धति से बहुत सारे संदेश हटाता था। यह लगभग 100 या कुछ था।
ब्रागैग

1
मैंने अभी इसका इस्तेमाल किया है। यदि पहले केवल 10 दिखाया गया था, लेकिन एक बार जब मैंने उन्हें हटा दिया, तो यह शेष दिखा (चैनल में कुल 100 से कम संदेश थे, इसलिए यह अभी भी 100 तक सीमित हो सकता है)।
अल्बिन

6
यह मेरे लिए काम नहीं लगता है। यह http: // <teamname> .slack.com / messages / <messageid> पर रीडायरेक्ट होता है (ऐसा प्रतीत होता है कि आखिरी चैनल जो मैंने देखा था)
शैतान का अधिवक्ता

10

किसी और के लिए जिसे इसे प्रोग्राम करने की आवश्यकता नहीं है, यहाँ एक त्वरित तरीका है :

(शायद केवल भुगतान किए गए उपयोगकर्ताओं के लिए)

  1. वेब या डेस्कटॉप ऐप में चैनल खोलें, और कॉग (ऊपरी दाएं) पर क्लिक करें।
  2. अभिलेखीय मेनू को लाने के लिए "अतिरिक्त विकल्प ..." चुनें। टिप्पणियाँ
  3. "चैनल संदेश अवधारण नीति सेट करें" चुनें।
  4. "विशिष्ट दिनों की संख्या के लिए सभी संदेशों को बनाए रखें" सेट करें।
  5. इस समय से पुराने सभी संदेश स्थायी रूप से हटा दिए गए हैं!

मैं आमतौर पर चैनल को कुछ संदर्भ के साथ छोड़ने के लिए "1 दिन" के लिए यह विकल्प सेट करता हूं, फिर मैं उपरोक्त सेटिंग्स में वापस जाता हूं, और यह निर्धारित करता हूं कि अब से उन्हें स्टोर करना जारी रखने के लिए "डिफ़ॉल्ट" पर वापस अवधारण नीति है

नोट्स:
ल्यूक बताते हैं: यदि विकल्प छिपा हुआ है: आपको वैश्विक कार्यक्षेत्र में जाना होगा व्यवस्थापक सेटिंग्स, संदेश अवधारण और हटाएं, और जांचें "कार्यस्थान सदस्यों को इन सेटिंग्स को ओवरराइड करने दें"


2
दरअसल यह सिर्फ छिपा हुआ है। यह प्रदर्शित करने के लिए आपको वैश्विक कार्यक्षेत्र व्यवस्थापक सेटिंग, संदेश अवधारण और हटाए जाने पर जाना होगा, और "कार्यस्थान सदस्यों को इन सेटिंग्स को ओवरराइड करने दें" की जाँच करें।
ल्यूक

धन्यवाद, मैंने आपकी टिप्पणी को शामिल करने के लिए अपडेट किया है। कृपया यह भी ध्यान दें कि हमने पूर्वव्यापी रूप से हटाने के लिए देव-समय के लिए स्लैक का भुगतान करने की पेशकश की थी, लेकिन उन्होंने कहा कि यह केवल एंटरप्राइज़ संस्करण (डेटा संग्रहीत करने के लिए अलग वातावरण के कारण) के अलावा संभव नहीं था।

@Hicsy, "संदेश रिटेंशन और विलोपन" ने उल्लेख किया विकल्प एक "भुगतान की सुविधा" है
फिल

4

विकल्प 1 आप 1 दिन के बाद संदेशों को स्वचालित रूप से हटाने के लिए एक स्लैक चैनल सेट कर सकते हैं, लेकिन यह थोड़ा छिपा हुआ है। सबसे पहले, आपको अपने स्‍लैक वर्कस्पेस सेटिंग, मैसेज रिटेंशन एंड डिलीटेशन पर जाना होगा, और "कार्यक्षेत्र के सदस्यों को इन सेटिंग्स को ओवरराइड करने दें" की जांच करनी होगी। उसके बाद, स्लैक क्लाइंट में आप एक चैनल खोल सकते हैं, गियर पर क्लिक कर सकते हैं, और "एडिट मैसेज रिटेंशन ..." पर क्लिक करें।

विकल्प 2 सुस्त-क्लीनर कमांड लाइन उपकरण जो दूसरों ने उल्लेख किया है।

विकल्प 3 नीचे एक छोटी सी स्क्रिप्ट है जिसे मैं निजी चैनलों को साफ करने के लिए उपयोग करता हूं। यदि आप विलोपन के अधिक प्रोग्रामेटिक नियंत्रण चाहते हैं तो एक अच्छा प्रारंभिक बिंदु हो सकता है। दुर्भाग्य से स्लैक में कोई बल्क-डिलीट एपीआई नहीं है, और वे अलग-अलग डिलीट को 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.")

ध्यान दें, उस स्क्रिप्ट को सार्वजनिक चैनलों को सूचीबद्ध और साफ़ करने के लिए संशोधन की आवश्यकता होगी। उन लोगों के लिए एपीआई तरीके चैनल हैं। * समूहों के बजाय। *



1

अन्य उत्तरों के अनुसार, स्लैक की दर सीमाएं इस मुश्किल को कम करती हैं - दर सीमा उनके चैट के लिए अपेक्षाकृत कम है। एपीआई एपीआई ~ 50 अनुरोध प्रति मिनट।

सबसे अच्छी रणनीति जो दर सीमा का सम्मान करती है, वह उस चैनल से संदेश प्राप्त करना है जिसे आप साफ़ करना चाहते हैं, फिर 50 से कम के बैचों में उन संदेशों को हटा दें जो कि न्यूनतम अंतराल पर चलते हैं।

मैंने इस बैचिंग के एक उदाहरण के साथ एक परियोजना बनाई है जिसे आप आसानी से कांटा कर सकते हैं और ऑटोकोड पर तैनात कर सकते हैं - यह आपको स्लैश कमांड के माध्यम से एक चैनल को साफ़ करने देता है (और आपको कमांड को एक्सेस करने की अनुमति देता है! जब आप /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

यदि आप पायथन को पसंद करते हैं और सुस्त एपीआई से एक विरासत एपीआई टोकन प्राप्त किया है , तो आप निम्नलिखित के साथ एक उपयोगकर्ता को भेजे गए सभी निजी संदेशों को हटा सकते हैं:

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

यहां आपके सुस्त चैनल / समूह / im संदेशों को हटाने के लिए एक महान क्रोम एक्सटेंशन है - https://slackext.com/deleter , जहां आप स्टार, समय सीमा या उपयोगकर्ताओं द्वारा संदेशों को फ़िल्टर कर सकते हैं। BTW, यह हाल के संस्करण में सभी संदेशों को लोड करने का भी समर्थन करता है, फिर आप अपने ~ 8k संदेशों को लोड कर सकते हैं जैसे आपको ज़रूरत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.