【问题标题】:Slack clean all messages (~8K) in a channelSlack 清理频道中的所有消息(~8K)
【发布时间】:2015-12-25 18:35:21
【问题描述】:

我们目前有一个 Slack 频道,其中大约 8000 条消息都来自 Jenkins 集成。是否有任何编程方式可以删除该频道中的所有消息?网页界面一次只能删除 100 条消息。

【问题讨论】:

    标签: slack-api slack


    【解决方案1】:

    我很快发现有人已经为这个做了一个助手:slack-cleaner

    对我来说只是:

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

    【讨论】:

    • 另一个选项来自npm,只是还没试过。
    • 在哪里可以找到我的令牌和频道?
    • --user "*" 也是使其工作所必需的。此外,如果您想实际执行删除任务,则应添加--perform
    • github.com/sgratzl/slack-cleaner 分支更加活跃,包括 --quiet 等功能,不会在标准输出上显示每条被删除的消息。
    • 似乎slack-cleaner is also now not working。有一个较新的 slack-cleaner2 似乎更新,要求您在 python 中编写脚本
    【解决方案2】:

    我编写了一个简单的节点脚本,用于从公共/私人频道和聊天中删除消息。您可以修改和使用它。

    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 范围”并添加“频道:历史”和“聊天:写入”。 (see scopes)
    5. 在页面顶部,单击“将应用程序安装到工作区”。确认并在页面重新加载时复制 OAuth 访问令牌。

    查找频道 ID

    此外,当您在浏览器中打开 slack 时,可以在浏览器 URL 中看到频道 ID。例如

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

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

    【讨论】:

    • 谢谢。我注意到的一件事是,在删除几条消息后它会变慢。
    • 一般来说是有速率限制的。这就是为什么在一段时间后删除操作会停止或变慢的原因。
    • 像魅力一样工作!谢谢!
    • 用过,简单,甜美。请注意,上面的答案目前说要使用不再支持的旧令牌,但 Firat 已经使用该信息更新了要点本身,并提供了所需的 OAuth 范围列表。 出人意料地创建获取 OAuth 令牌和添加范围列表所需的 slack 应用程序非常简单快捷——我说的是 100 秒。
    【解决方案3】:

    默认清理命令对我不起作用,出现以下错误:

    $ 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 速率限制松弛。在这两种情况下,提供的频道名称都没有# 符号

    【讨论】:

      【解决方案4】:

      对于不需要以编程方式进行的其他任何人, 这是一个快速方法

      (可能仅限付费用户)

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

      我通常将此选项设置为“1 天”以在某些情况下离开频道,然后我返回上述设置,并将其保留政策设置回“默认”以继续从现在开始存储它们。

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

      【讨论】:

      • 其实它只是隐藏了。要使其显示,您必须转到全局工作区管理设置、消息保留和删除,并选中“让工作区成员覆盖这些设置”。
      • 谢谢,我已更新以包含您的评论。另请注意,我们甚至提出向 Slack 支付开发时间以追溯删除,但他们说除了企业版之外根本不可能(由于存储数据的环境不同)。
      • @Hicsy 提到,“消息保留和删除”选项是“付费功能”
      • 似乎它不再适用于付费帐户。
      • @nathanchere 我仍然可以使用它
      【解决方案5】:

      !!更新!!

      正如@niels-van-reijmersdal 在评论中提到的那样。

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

      !!结束更新!!

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

      您可以通过存档批量删除 (http://my.slack.com/archives ) 特定频道的页面:在菜单中查找“删除消息”

      【讨论】:

      • 只是把它放在那里,这只适用于频道而不是直接消息。
      • 这一次只删除最后10条消息
      • 不,我以前用这种方法删除了很多消息。大约是 100 左右。
      • 这似乎对我不起作用。它重定向到 http://.slack.com/messages/ (似乎是我查看的最后一个频道)
      • 此功能已被删除。有关更多信息,请参阅此线程:twitter.com/slackhq/status/467182697979588608?lang=en
      【解决方案6】:

      选项 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 方法是通道。* 而不是组。*

      【讨论】:

        【解决方案7】:

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

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

        我已经构建了一个包含此批处理示例的项目,您可以easily fork and deploy on 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/

        【讨论】:

          【解决方案8】:

          提示:如果你要使用 slack 清洁器https://github.com/kfei/slack-cleaner

          您需要生成一个令牌:https://api.slack.com/custom-integrations/legacy-tokens

          【讨论】:

            【解决方案9】:

            如果你喜欢 Python 并且已经从 slack api 获得了legacy API token,你可以通过以下方式删除你发送给用户的所有私人消息:

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

            【讨论】:

              【解决方案10】:

              这是一个很棒的 chrome 扩展,可以批量删除您的闲置频道/群组/即时消息消息 - https://slackext.com/deleter,您可以在其中按星号、时间范围或用户过滤消息。 顺便说一句,它还支持加载最新版本的所有消息,然后您可以根据需要加载大约 8k 消息。

              【讨论】:

              • 它对我不起作用。
              【解决方案11】:

              有一个 slack 工具可以删除工作区中的所有 slack 消息。看看吧:https://www.messagebender.com

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-01-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-05-03
                • 1970-01-01
                • 2016-05-04
                • 2020-03-20
                相关资源
                最近更新 更多