หย่อนทำความสะอาดข้อความทั้งหมด (~ 8K) ในช่อง


85

ขณะนี้เรามีช่อง Slack ที่มีข้อความ ~ 8K ทั้งหมดมาจากการผสานรวมของ Jenkins มีวิธีแบบเป็นโปรแกรมในการลบข้อความทั้งหมดจากช่องนั้นหรือไม่? เว็บอินเทอร์เฟซสามารถลบข้อความได้ครั้งละ 100 ข้อความเท่านั้น

คำตอบ:


71

ฉันพบอย่างรวดเร็วว่ามีผู้ช่วยแล้ว: slack-cleanerสำหรับสิ่งนี้

และสำหรับฉันมันเป็นเพียง:

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


อีกตัวเลือกมาจากnpmยังไม่ได้ลอง
Hann

3
ฉันจะหาโทเค็นและช่องของฉันได้ที่ไหน
kk78626

6
--user "*"ยังจำเป็นที่จะต้องทำให้มันใช้งานได้ --performนอกจากนี้หากคุณต้องการที่จะให้เกิดการปฏิบัติงานการลบคุณควรเพิ่ม
Shayan Salehian

7
github.com/sgratzl/slack-cleanerส้อมมีการใช้งานมากขึ้นและมีคุณสมบัติเช่น--quietการไม่แสดงทุกข้อความจะถูกลบบน stdout
ปริศนา

25

ฉันเขียนสคริปต์โหนดอย่างง่ายสำหรับการลบข้อความจากช่องสาธารณะ / ส่วนตัวและการแชท คุณสามารถปรับเปลี่ยนและใช้งานได้

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

ขั้นแรกแก้ไขโทเค็นของคุณในส่วนการกำหนดค่าสคริปต์จากนั้นเรียกใช้สคริปต์:

node ./delete-slack-messages CHANNEL_ID

รับโทเค็น OAuth:

  1. ไปที่https://api.slack.com/apps
  2. คลิก "สร้างแอปใหม่" และตั้งชื่อแอป (ชั่วคราว) ของคุณ
  3. ในการนำทางด้านข้างไปที่ "Oauth & Permissions"
  4. ในหน้านั้นให้ค้นหาส่วน "ขอบเขต" คลิก "เพิ่มขอบเขต OAuth" และเพิ่ม "channels: history" และ "chat: write" (ดูขอบเขต)
  5. ที่ด้านบนสุดของหน้าคลิก 'ติดตั้งแอปลงในพื้นที่ทำงาน' ยืนยันและในการโหลดหน้าซ้ำให้คัดลอก OAuth Access Token

ค้นหารหัสช่อง

นอกจากนี้รหัสช่องยังสามารถเห็นได้ใน URL ของเบราว์เซอร์เมื่อคุณเปิด slack ในเบราว์เซอร์ เช่น

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

หรือ

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

2
ขอบคุณสำหรับสิ่งนั้น สิ่งหนึ่งที่ฉันสังเกตเห็นคือมันช้าลงหลังจากลบข้อความไปสองสามข้อความ
Bertl

3
โดยทั่วไปมีการ จำกัด อัตรา นั่นเป็นเหตุผลว่าทำไมการดำเนินการลบในช่วงเวลาหนึ่งจะหยุดชะงักหรือช้าลง
FıratKÜÇÜK

2
ใช้งานได้เหมือนมีเสน่ห์! ขอบคุณสำหรับสิ่งนี้!
brianrhea

1
ใช้แล้วง่ายหวาน โปรดทราบว่าขณะนี้คำตอบข้างต้นระบุว่าให้ใช้โทเค็นเดิมซึ่งไม่ได้รับการสนับสนุนอีกต่อไป แต่ Firat ได้อัปเดตส่วนสำคัญด้วยข้อมูลนั้นแล้วและให้รายการขอบเขต OAuth ที่จำเป็น มันเป็นเรื่องง่ายมากที่จะสร้างแอป slack ที่จำเป็นในการรับโทเค็น OAuth และเพิ่มรายการขอบเขต - ฉันกำลังพูดถึง 100 วินาที
Daryn

23

คำสั่ง clean default ไม่ทำงานสำหรับฉันโดยให้ข้อผิดพลาดต่อไปนี้:

$ 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 

เพื่อทำความสะอาดข้อความทั้งหมด

ฉันใช้การ จำกัด อัตรา 1 วินาทีเพื่อหลีกเลี่ยงHTTP 429 Too Many Requestsข้อผิดพลาดเนื่องจาก slack api rate limit ในทั้งสองกรณีชื่อช่องถูกระบุโดยไม่มี#เครื่องหมาย


11

!! อัพเดท !!

as @ niels-van-reijmersdal metioned ในความคิดเห็น

คุณลักษณะนี้ถูกลบออก ดูหัวข้อนี้สำหรับข้อมูลเพิ่มเติม: twitter.com/slackhq/status/467182697979588608?lang=th

!! จบการอัพเดท !!

นี่คือคำตอบที่ดีจาก SlackHQ ในทวิตเตอร์และใช้งานได้โดยไม่มีของบุคคลที่สาม https://twitter.com/slackhq/status/467182697979588608?lang=th

คุณสามารถลบจำนวนมากผ่านทางหน้าเก็บถาวร ( http://my.slack.com/archives ) สำหรับช่องเฉพาะ: มองหา "ลบข้อความ" ในเมนู


1
เพียงแค่วางไว้ที่นั่นสิ่งนี้ใช้ได้กับช่องเท่านั้นไม่ใช่ข้อความโดยตรง
TheRodeo

1
การดำเนินการนี้จะเป็นการลบ 10 ข้อความสุดท้ายเท่านั้น
MatPag

1
ไม่ฉันเคยลบข้อความจำนวนมากด้วยวิธีนี้ มันเป็นประมาณ 100 หรือบางอย่าง
Braggae

1
ฉันเพิ่งใช้มัน หากครั้งแรกแสดงเพียง 10 แต่เมื่อฉันลบออกไปแล้วจะแสดงส่วนที่เหลือ (ช่องมีข้อความทั้งหมดน้อยกว่า 100 ข้อความดังนั้นจึงยัง จำกัด ได้ที่ 100)
Albin

6
ดูเหมือนจะไม่ได้ผลสำหรับฉัน มันเปลี่ยนเส้นทางไปที่ http: // <teamname> .slack.com / messages / <messageid> (ดูเหมือนจะเป็นช่องสุดท้ายที่ฉันดู)
Devil's Advocate

10

สำหรับใครก็ตามที่ไม่จำเป็นต้องทำแบบเป็นโปรแกรมนี่เป็นวิธีที่รวดเร็ว :

(สำหรับผู้ใช้ที่ชำระเงินเท่านั้น)

  1. เปิดช่องในเว็บหรือแอปเดสก์ท็อปแล้วคลิกฟันเฟือง (ขวาบน)
  2. เลือก "ตัวเลือกเพิ่มเติม ... " เพื่อเปิดเมนูเก็บถาวร หมายเหตุ
  3. เลือก "กำหนดนโยบายการเก็บรักษาข้อความของช่อง"
  4. ตั้งค่า "เก็บรักษาข้อความทั้งหมดตามจำนวนวันที่ระบุ"
  5. ข้อความทั้งหมดที่เก่ากว่านี้จะถูกลบอย่างถาวร!

ฉันมักจะตั้งค่าตัวเลือกนี้เป็น "1 วัน" เพื่อออกจากช่องโดยมีบริบทบางอย่างจากนั้นฉันกลับไปที่การตั้งค่าด้านบนและตั้งค่านโยบายการเก็บรักษากลับเป็น "ค่าเริ่มต้น"เพื่อดำเนินการจัดเก็บต่อจากนี้ไป

หมายเหตุ:
ลุคชี้ให้เห็น: หากตัวเลือกถูกซ่อนไว้: คุณต้องไปที่การตั้งค่าผู้ดูแลระบบพื้นที่ทำงานส่วนกลางการเก็บรักษาและการลบข้อความและเลือก "ให้สมาชิกในพื้นที่ทำงานแทนที่การตั้งค่าเหล่านี้"


2
จริงๆแล้วมันซ่อนไว้เฉยๆ ในการทำให้ปรากฏคุณต้องไปที่การตั้งค่าผู้ดูแลระบบพื้นที่ทำงานส่วนกลางการเก็บรักษาและการลบข้อความและเลือก "ให้สมาชิกในพื้นที่ทำงานแทนที่การตั้งค่าเหล่านี้"
ลุค

ขอบคุณฉันได้อัปเดตเพื่อรวมความคิดเห็นของคุณ นอกจากนี้โปรดทราบว่าเราเสนอที่จะจ่าย Slack สำหรับเวลานักพัฒนาซอฟต์แวร์เพื่อลบย้อนหลัง แต่พวกเขาบอกว่ามันเป็นไปไม่ได้นอกจากรุ่นองค์กร (เนื่องจากสภาพแวดล้อมที่แตกต่างกันในการจัดเก็บข้อมูล)
Hicsy

ดังกล่าวโดย @Hicsy ที่ "ข้อความการเก็บรักษาและการลบตัวเลือก" เป็น "จ่าย" คุณสมบัติ
ฟิล

4

ตัวเลือกที่ 1คุณสามารถตั้งค่าช่อง Slack ให้ลบข้อความโดยอัตโนมัติหลังจากผ่านไป 1 วัน แต่จะถูกซ่อนไว้เล็กน้อย ขั้นแรกคุณต้องไปที่การตั้งค่าพื้นที่ทำงานของ Slack การเก็บรักษาและการลบข้อความและเลือก "ให้สมาชิกพื้นที่ทำงานแทนที่การตั้งค่าเหล่านี้" หลังจากนั้นในไคลเอนต์ Slack คุณสามารถเปิดแชนเนลคลิกรูปเฟืองแล้วคลิก "แก้ไขการเก็บรักษาข้อความ ... "

ตัวเลือกที่ 2เครื่องมือบรรทัดคำสั่ง slack-cleaner ที่คนอื่นพูดถึง

ตัวเลือกที่ 3ด้านล่างนี้เป็นสคริปต์ Python เล็กน้อยที่ฉันใช้เพื่อล้างช่องส่วนตัว อาจเป็นจุดเริ่มต้นที่ดีหากคุณต้องการควบคุมการลบด้วยโปรแกรมมากขึ้น น่าเสียดายที่ Slack ไม่มี API การลบจำนวนมากและ จำกัด อัตราการลบแต่ละรายการไว้ที่ 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.")

โปรดทราบว่าสคริปต์นั้นจะต้องมีการแก้ไขเพื่อแสดงรายการและล้างช่องสาธารณะ เมธอด API คือแชแนล * แทนกลุ่ม *



1

ดังที่คำตอบอื่น ๆ กล่าวพาดพิงถึงการ จำกัด อัตราของ Slack ทำให้ยุ่งยาก - ขีด จำกัด อัตราค่อนข้างต่ำสำหรับchat.delete API ที่ ~ 50 คำขอต่อนาที

กลยุทธ์ที่ดีที่สุดในการ จำกัด อัตราคือการดึงข้อความจากช่องที่คุณต้องการล้างจากนั้นลบข้อความเป็นกลุ่มที่ต่ำกว่า 50 ที่ทำงานในช่วงเวลาที่สั้นที่สุด

ฉันได้สร้างโปรเจ็กต์ที่มีตัวอย่างของแบทช์นี้ที่คุณสามารถแยกและปรับใช้บน Autocode ได้อย่างง่ายดาย - มันช่วยให้คุณล้างช่องทางผ่านคำสั่ง slash (และอนุญาตให้คุณ จำกัด การเข้าถึงคำสั่งสำหรับผู้ใช้บางคนเท่านั้น!) เมื่อคุณเรียกใช้/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

หากคุณชอบ Python และได้รับโทเค็น API แบบเดิมจาก slack api คุณสามารถลบข้อความส่วนตัวทั้งหมดที่คุณส่งถึงผู้ใช้โดยมีสิ่งต่อไปนี้:

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

นี่คือส่วนขยาย Chrome ที่ยอดเยี่ยมในการลบข้อความช่อง / กลุ่ม / im ที่หย่อนเป็นกลุ่ม - https://slackext.com/deleterซึ่งคุณสามารถกรองข้อความตามดาวช่วงเวลาหรือผู้ใช้ BTW ยังรองรับการโหลดข้อความทั้งหมดในเวอร์ชันล่าสุดจากนั้นคุณสามารถโหลดข้อความ ~ 8k ได้ตามที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.