拉取历史频道消息python

PDP*_*DPD 3 python slack-api slack

我试图通过从我所属的松弛通道中提取消息/响应来创建一个小数据集。我想使用 python 从通道中提取数据,但是我无法找出我的 api 密钥。我在 slack 上创建了一个应用程序,但我不确定如何找到我的 api 密钥。我看到了我的客户端密码、签名密码和验证令牌,但找不到我的 api 密钥

这是我相信我正在努力完成的一个基本示例:

import slack
sc = slack.SlackClient("api key")
sc.api_call(
  "channels.history",
  channel="C0XXXXXX"
)
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我也愿意手动下载数据。任何帮助是极大的赞赏。

Eri*_*ken 5

消息

请参阅下面的示例代码,了解如何在 Python 中从通道中提取消息。

  • 它使用官方 Python Slack 库并conversations_history使用分页调用 。因此,它适用于任何类型的通道,并且可以在需要时获取大量消息。
  • 结果将作为 JSON 数组写入文件。
  • 您可以指定要检索的频道和最大消息

线程

请注意,conversations.history端点不会返回线程消息。对于conversations.replies要为其检索消息的每个线程,必须通过一次调用来额外检索这些内容。

通过检查threads_ts消息中的属性,可以在每个通道的消息中识别线程。如果它存在,就会有一个线程连接到它。有关线程如何工作的更多详细信息,请参阅此页面

身份证

但是,此脚本不会用名称替换 ID。如果您需要,这里有一些如何实现它的指示:

  • 您需要替换用户、频道、机器人、用户组的 ID(如果使用付费计划)
  • 您可以使用该API获取用户,渠道和用户组的名单users_listconversations_listusergroups_list分别,机器人必须由一个与bots_info进账(如果需要)
  • ID 出现在消息中的许多地方:
    • 用户顶级属性
    • bot_id 顶级属性
    • 作为任何允许文本的属性中的链接,例如<@U12345678>用户或<#C1234567>频道。这些可以出现在顶级text属性中,也可以出现在附件和块中。

示例代码

import os
import slack
import json
from time import sleep

CHANNEL = "C12345678"
MESSAGES_PER_PAGE = 200
MAX_MESSAGES = 1000

# init web client
client = slack.WebClient(token=os.environ['SLACK_TOKEN'])

# get first page
page = 1
print("Retrieving page {}".format(page))
response = client.conversations_history(
    channel=CHANNEL,
    limit=MESSAGES_PER_PAGE,
)
assert response["ok"]
messages_all = response['messages']

# get additional pages if below max message and if they are any
while len(messages_all) + MESSAGES_PER_PAGE <= MAX_MESSAGES and response['has_more']:
    page += 1
    print("Retrieving page {}".format(page))
    sleep(1)   # need to wait 1 sec before next call due to rate limits
    response = client.conversations_history(
        channel=CHANNEL,
        limit=MESSAGES_PER_PAGE,
        cursor=response['response_metadata']['next_cursor']
    )
    assert response["ok"]
    messages = response['messages']
    messages_all = messages_all + messages

print(
    "Fetched a total of {} messages from channel {}".format(
        len(messages_all),
        CHANNEL
))

# write the result to a file
with open('messages.json', 'w', encoding='utf-8') as f:
  json.dump(
      messages_all, 
      f, 
      sort_keys=True, 
      indent=4, 
      ensure_ascii=False
    )
Run Code Online (Sandbox Code Playgroud)