松弛清理通道中的所有消息(约8K)


85

我们目前有一个Slack频道,其中约有8K条消息全部来自Jenkins集成。有什么编程方式可以删除该频道中的所有消息?Web界面一次只能删除100条消息。

Answers:


71

我很快发现有人已经帮了忙:为此提供了休闲清洁工

对我来说,这只是:

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


另一个选项来自npm,只是还没有尝试过。
汉恩

1
在哪里可以找到我的令牌和渠道?
kk78626 '16

6
--user "*"使它正常工作也是必要的。另外,如果您要实际执行删除任务,则应添加--perform
Shayan Salehian

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和权限”
  4. 在该页面上,找到“范围”部分。点击“添加OAuth范围”,然后添加“频道:历史记录”和“聊天:写入”。(请参阅范围)
  5. 在页面顶部,单击“将应用程序安装到工作区”。确认,然后在页面重新加载时,复制OAuth访问令牌。

查找频道ID

另外,当您在浏览器中打开松弛键时,可以在浏览器URL中看到频道ID。例如

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

要么

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

2
感谢那。我注意到的一件事是,删除了几则消息后,它的速度变慢了。
Bertl

3
通常,存在速率限制。这就是为什么一段时间后删除操作将停止或减慢的原因。
的Firat KUCUK

2
奇迹般有效!谢谢你!
brianrhea

1
使用它,简单,甜美。请注意,上述答案当前表示使用不再受支持的旧式令牌,但是Firat已使用该信息更新了要点本身,并提供了所需的OAuth范围列表。这是令人惊讶的快速正轻松地创建必需取得OAuth凭证松弛应用并添加范围-我说话100秒的名单。
达林

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 

清除所有消息。

我使用1秒的速率限制来避免HTTP 429 Too Many Requests由于api速率限制松弛而导致的错误。在两种情况下,提供的频道名称都没有#符号


11

!!更新!!

@ niels-van-reijmersdal在评论中提及。

此功能已被删除。有关更多信息,请参见此线程:twitter.com/slackhq/status/467182697979588608?lang=en

!!结束更新!!

这是Twitter上SlackHQ的一个很好的答案,它可以在没有任何第三方东西的情况下工作。 https://twitter.com/slackhq/status/467182697979588608?lang=zh-CN

您可以通过存档(http://my.slack.com/archives )页面针对特定频道进行批量删除:在菜单中查找“删除邮件”


1
只是将其放到那里,这仅适用于频道而不是直接消息。
TheRodeo

1
这只会一次删除最后10条消息
MatPag'5

1
不,我曾经用这种方法删除很多邮件。大约是100左右。
布拉格

1
我刚用过 如果第一个仅显示10条,但是一旦我删除它们,它就会显示其余的(该通道总共少于100条消息,因此仍然可以限制为100条)。
阿尔宾

6
这似乎对我不起作用。它重定向到http:// <teamname> .slack.com / messages / <messageid>(似乎是我查看的最后一个频道)
Devil's Advocate

10

对于不需要编程的其他人,这是一种快速的方法

(可能仅适用于付费用户)

  1. 在Web或桌面应用程序中打开频道,然后单击齿轮(右上角)。
  2. 选择“其他选项...”以打开存档菜单。笔记
  3. 选择“设置频道消息保留策略”。
  4. 设置“将所有消息保留特定的天数”。
  5. 早于此时间的所有消息将被永久删除!

我通常将此选项设置为“ 1天”以使频道具有一定的上下文,然后返回到上述设置,并将其保留策略重新设置为“默认”以从现在开始继续存储它们。

注意:
Luke指出:如果隐藏了该选项:您必须转到全局工作区管理员设置,消息保留和删除,然后选中“让工作区成员覆盖这些设置”


2
实际上,它只是隐藏的。要使其显示,您必须转到全局工作区管理员设置,消息保留和删除,然后选中“让工作区成员覆盖这些设置”。
路加福音

谢谢,我已更新为包含您的评论。另外请注意,我们甚至向Slack支付了Slack来进行追溯删除的开发时间,但他们表示,除了企业版(由于存储数据的环境不同)以外,它根本不可能实现。
Hicsy

正如@Hicsy所提到的,“邮件保留和删除”选项是“付费功能”
Phil

4

选项1您可以将Slack频道设置为在1天后自动删除邮件,但该邮件有点隐藏。首先,您必须转到“松弛工作区设置”,“消息保留和删除”,然后选中“让工作区成员覆盖这些设置”。之后,您可以在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的方法是channel。*而不是组。*



1

正如其他答案所暗示的那样,Slack的速率限制使这一点变得棘手-他们的chat.delete API的速率限制相对较低,每分钟约50个请求。

遵守速率限制的最佳策略是从您要清除的通道中检索消息,然后以每隔50分钟的间隔批量删除少于50条的消息。

我已经建立了一个包含此批处理示例的项目,您可以轻松地在Autocode上进行分叉和部署-它使您可以通过斜杠命令清除通道(并且当然可以将命令访问权限限制为某些用户!)。/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并已从slack api获取了旧版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扩展程序,用于批量删除您的闲置频道/群组/即时消息-https: //slackext.com/deleter,您可以在其中按星级,时间范围或用户过滤消息。顺便说一句,它还支持加载所有最新版本的消息,然后您可以根据需要加载〜8k消息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.