Slack:检索所有消息

Slack: Retrieve all messages

我想检索在我的团队松弛域中发送的所有消息。虽然,我更喜欢在 XML 或 JSON 中接收数据,但我几乎可以处理任何形式的数据。

如何检索所有这些消息?可能吗?如果没有,我可以检索特定频道的所有消息吗?

如果您需要通过 API 动态执行此操作,您可以使用 channels.list method to list all of the channels in your team and channels.history method 检索每个频道的历史记录。请注意,这不包括直接消息或私人群组。

如果您需要一次性完成此操作,请转至 https://my.slack.com/services/export 将您团队的消息存档导出为一系列 JSON 文件

对于寻找直接消息历史记录下载的任何人,this 基于节点的 cli 工具允许您以 JSON 和 CSV 从 DM 和 IM 下载消息。我用过,效果很好

这个 Python 脚本通过一个简单的 运行 将所有内容导出到 JSON: https://gist.github.com/Chandler/fb7a070f52883849de35

它会为您创建目录,您可以选择排除直接消息或频道。

你只需要安装slacker模块,就是pip install slacker。然后 运行 它与 --token='secret-token'。您需要一个遗留令牌,目前可用 here

有了新的 Conversations API,这项任务现在变得更容易了。这是一个完整的概述:

正在从频道获取消息

新的 API 方法 conversations.history 将允许您从各种类型的对话/频道(public、私人、DM、群组 DM)下载消息,只要您的令牌可以访问它。

此方法还支持分页,允许您下载大量邮件。

正在将 ID 解析为名称

请注意,此方法将 return 原始 JSON 格式的消息仅包含 ID,因此您需要调用额外的 API 方法将这些 ID 解析为纯文本:

正在获取线程

另外使用 conversations.replies 下载对话中的话题。线程的功能有点像对话中的对话,需要单独下载。

查看 this page 官方文档以了解有关线程的更多详细信息。

这是另一个用于从频道导出所有消息的工具。

该工具名为 slackchannel2pdf,可以将来自 public 或私人频道的所有消息导出到 PDF 文档。

您只需要一个具有所需范围和访问权限的令牌。

如果有人在 2021 年仍在寻找解决方案,并且当然没有工作区管理员的帮助来导出消息,那么显然他们可以执行以下操作。

第 1 步:从您的 UI cookie

获取 api 令牌
  • 克隆并安装要求和 运行 SlackPirate
  • 在浏览器上打开 slack 并复制名为 d
  • 的 cookie 的值
  • 运行 python3 SlackPirate.py --cookie '<value of d cookie>'

第 2 步:转储频道消息

  • 安装 slackchannel2pdf(需要 python)
  • slackchannel2pdf --token 'xoxb-1466...' --write-raw-data T0EKHQHK2/G015H62SR3M

第 3 步:转储直接消息

  • 安装slack-history-export(需要节点)
  • slack-history-export -t 'xoxs-1466...' -u '<correct username>' -f 'my_colleagues_chats.json'

为了在 slack 中检索来自特定频道的所有消息,这可以通过使用 python 中的 slack_sdk 库中的 conversations.history 方法来完成。

def get_conversation_history(self, channel_id, latest, oldest):
        """Method to fetch the conversation history of particular channel"""
        try:
            result = client.conversations_history(
                channel=channel_id,
                inclusive=True,
                latest=latest,
                oldest=oldest,
                limit=100)
            all_messages = []
            all_messages += result["messages"]
            ts_list = [item['ts'] for item in all_messages]
            last_ts = ts_list[:-1]
            while result['has_more']:
                result = client.conversations_history(
                    channel=channel_id,
                    cursor=result['response_metadata']['next_cursor'],
                    latest=last_ts)
                all_messages += result["messages"]
            return all_messages
        except SlackApiError as e:
            logger.exception("Error while fetching the conversation history")

在这里,我提供了最新和最旧的时间戳,以涵盖我们需要从对话历史记录中的所有消息中收集消息的时间范围。

并且 cusor 参数用于指向下一个游标值,因为此方法一次只能收集 ​​100 条消息,但它支持 pagination,通过它我们可以从 [=12 指向下一个游标值=].

希望这会有所帮助。