Сохраняйте данные сообщений из общедоступной рабочей области при обновлении таблиц Deephaven.

Джейк Малфорд

С момента своего основания в 2009 году Slack стал центром общения в профессиональной среде. Скорее всего, вы работаете в компании, которая использует Slack для обмена сообщениями между коллегами. Компании также часто используют бесплатное предложение Slack для создания общедоступных рабочих мест для общения с клиентами. Это был огромный успех, потому что он обеспечивает известное средство коммуникации, и компаниям не нужно выделять на него бюджет.

Однако продукт Freemium не лишен ограничений. Он хранит не более 10 000 сообщений. По достижении лимита старые сообщения начинают удаляться. Это становится проблемой, если важные сообщения со временем теряются.

Используя Slack API, я смог архивировать сообщения до того, как был достигнут предел, и сохранить их для будущего поиска. Читайте дальше, чтобы узнать, как настроить это решение самостоятельно.

Используйте Slack API

К счастью для нас, Slack предоставляет API, который могут использовать разработчики. Для извлечения сообщений из рабочей области можно использовать метод история разговоров. Сочетание этого с методом список бесед обеспечивает простой способ сохранения сообщений для рабочей области. Просто захватите все каналы, а затем захватите все сообщения для каждого канала.

После установки Slack Python SDK и настройки приложения вы можете запустить следующий код Python для захвата ваших сообщений.

from slack_sdk import WebClient
import os
import time
SLACK_API_TOKEN = os.environ.get("SLACK_API_TOKEN")
slack_client = WebClient(token=SLACK_API_TOKEN)
def get_public_channels():
    cursor = None
    channels = []
    while True:
        response = slack_client.conversations_list(cursor=cursor)
for channel in response["channels"]:
            channels.append(channel["id"])
cursor = response["response_metadata"]["next_cursor"]
        if len(cursor) == 0:
            break
        else:
            print("Pagination found, getting next entries")
            time.sleep(3)
return channels
def get_channel_messages(slack_channels):
    messages = []
    for slack_channel in slack_channels:
        cursor = None
        while True:
            channel_history = slack_client.conversations_history(channel=slack_channel, cursor=cursor)
for message in channel_history["messages"]:
                if (message["type"] == "message"):
                    messages.append((slack_channel, message["text"]))
if bool(channel_history["has_more"]):
                cursor = channel_history["response_metadata"]["next_cursor"]
            else:
                cursor = None
if cursor is None:
                break
            else:
                print("Pagination found, getting next entries")
                time.sleep(1.2)
return messages
slack_channels = get_public_channels()
messages = get_channel_messages(slack_channels)
print(messages)

Это выглядит хорошо… но есть небольшая проблема. Если у вас есть темы в ваших каналах (что очень часто), вы можете заметить, что эти темы отсутствуют. К счастью, метод ответы в беседе позволяет извлекать сообщения из тредов. Давайте переопределим get_channel_messages и обновим его, чтобы получать сообщения из этих потоков.

def get_thread_messages(slack_channel, ts):
    messages = []
    cursor = None
while True:
        thread_replies = slack_client.conversations_replies(channel=slack_channel, ts=ts, cursor=cursor)
for message in thread_replies["messages"]:
            if (message["type"] == "message"):
                messages.append(message["text"])
if bool(thread_replies["has_more"]):
            cursor = thread_replies["response_metadata"]["next_cursor"]
        else:
            cursor = None
if cursor is None:
            break
        else:
            print("Pagination found, getting next entries")
            time.sleep(1.2)
    return messages
def get_channel_messages(slack_channels):
    messages = []
    for slack_channel in slack_channels:
        cursor = None
        while True:
            channel_history = slack_client.conversations_history(channel=slack_channel, cursor=cursor)
for message in channel_history["messages"]:
                if (message["type"] == "message"):
                    if ("thread_ts" in message):
                        for text in get_thread_messages(slack_channel, message["ts"]):
                            messages.append((slack_channel, text))
                    else:
                        messages.append((slack_channel, message["text"]))
if bool(channel_history["has_more"]):
                cursor = channel_history["response_metadata"]["next_cursor"]
            else:
                cursor = None
if cursor is None:
                break
            else:
                print("Pagination found, getting next entries")
                time.sleep(1.2)
return messages

Используйте сообщения в Deephaven

Теперь, когда мы знаем, как получить информацию о наших сообщениях из Slack, давайте поместим эти данные в Deephaven. Используя DynamicTableWriter, мы можем легко записать наши данные Slack в таблицы Deephaven.

from deephaven import DynamicTableWriter
import deephaven.dtypes as dht
column_definitions = {
    "Channel": dht.string,
    "Message": dht.string
}
table_writer = DynamicTableWriter(column_definitions)
for (slack_channel, message) in messages:
    table_writer.write_row(slack_channel, message)
table = table_writer.table

Теперь мы можем использовать все табличные операции и инструменты Deephaven в наших сообщениях Slack! Если мы хотим записать наши данные на диск, мы можем использовать метод записи файла Parquet для записи нашей таблицы.

from deephaven.parquet import write
write(table, "/data/slack_messages.parquet")

Сделай сам

Поскольку все больше и больше данных генерируется различными источниками данных, важно знать, как извлекать и сохранять эти данные для будущих нужд. Этот пост в блоге показывает лишь один из многих примеров того, как вы можете работать с данными с помощью Deephaven. Код в этом проекте взят из сборщика социальных данных Deepphaven, так что не стесняйтесь проверить этот проект и использовать его для своих нужд. Расскажите нам, с какими другими источниками данных вы работаете, обратившись к нам — где еще? — Слабость.