Вытащить исторический канал сообщений Python - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь создать небольшой набор данных, извлекая сообщения / ответы из слабого канала, частью которого я являюсь.Я хотел бы использовать Python для извлечения данных из канала, однако у меня возникли проблемы с определением моего ключа API.Я создал приложение на слабину, но я не уверен, как найти мой ключ API.Я вижу свой клиентский секрет, подписывающий секрет и токен подтверждения, но не могу найти мой ключ API

Вот базовый пример того, что, по моему мнению, я пытаюсь выполнить:

import slack
sc = slack.SlackClient("api key")
sc.api_call(
  "channels.history",
  channel="C0XXXXXX"
)

Я готов просто загрузить данные вручную, если это возможно.Любая помощь с благодарностью.

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Это использует слабый webapi. Вам нужно будет установить пакет запросов. Это должно захватить все сообщения в канале. Вам нужен токен, который можно получить на странице управления приложениями. И вы можете использовать функцию getChannels (). После того, как вы соберете все сообщения, вам нужно будет узнать, кто написал, какое сообщение нужно сделать для сопоставления идентификаторов (привязать идентификаторы к именам пользователей), вы можете использовать функции getUsers (). Следуйте этому https://api.slack.com/custom-integrations/legacy-tokens, чтобы сгенерировать устаревший токен, если вы не хотите использовать токен из своего приложения.

def getMessages(token, channelId):
    print("Getting Messages")
    # this function get all the messages from the slack team-search channel
    # it will only get all the messages from the team-search channel
    slack_url = "https://slack.com/api/conversations.history?token=" + token + "&channel=" + channelId
    messages = requests.get(slack_url).json()
    return messages


def getChannels(token):
    ''' 
    function returns an object containing a object containing all the
    channels in a given workspace
    ''' 
    channelsURL = "https://slack.com/api/conversations.list?token=%s" % token
    channelList = requests.get(channelsURL).json()["channels"] # an array of channels
    channels = {}
    # putting the channels and their ids into a dictonary
    for channel in channelList:
        channels[channel["name"]] = channel["id"]
    return {"channels": channels}

def getUsers(token):
    # this function get a list of users in workplace including bots 
    users = []
    channelsURL = "https://slack.com/api/users.list?token=%s&pretty=1" % token
    members = requests.get(channelsURL).json()["members"]
    return members
1 голос
/ 25 июня 2019

messages

Ниже приведен пример кода для извлечения сообщений из канала в Python.

  • Он использует официальную библиотеку Python Slack и вызывает conversations_history спейджинг.Поэтому он будет работать с любым типом канала и при необходимости может извлекать большое количество сообщений.
  • Результат будет записан в файл в виде массива JSON.
  • Вы можете указать канал и максимальное сообщениеподлежит получению

потоков

Обратите внимание, что конечная точка conversations.history не будет возвращать сообщения потоков.Они должны быть извлечены дополнительно одним вызовом conversations.replies для каждого потока, для которого вы хотите получить сообщения.

Потоки можно определить в сообщениях для каждого канала, проверив threads_ts свойство в сообщении.Если он существует, к нему присоединена нить.См. страницу для более подробной информации о том, как работают потоки.

IDs

Этот скрипт не заменяет идентификаторы именами.Если вам нужно, вот несколько советов, как это реализовать:

  • Вам нужно заменить идентификаторы для пользователей, каналов, ботов, групп пользователей (если на платном плане)
  • Вы можетеизвлекайте списки для пользователей, каналов и групп пользователей из API с users_list, conversations_list и usergroups_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
    )
...