15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[第一弾] TROCCO®︎を使ってSlackからチャット情報を抽出しBigQueryに集約する

Last updated at Posted at 2024-05-31

目的

株式会社primeNumberでテクニカルサポートエンジニアとして働いている@kimura34です。
弊社が提供しているサービスTROCCO®︎ではEssentialプラン以上のお客様にはslackを利用したサポートを提供しており、
エラーなどのトラブル発生時や、利用方法などに関する相談があるときはslack上でコミュニケーションを取っています。

入社したばかりの頃はTROCCO®︎のことを知るための教科書として、過去の問い合わせ履歴から学んでいました。
今でも問い合わせを受けた時はSlackやSalesforceで検索をかけて、過去に同じような事例がないか確認しています。
しかし自分が参加していないSlackチャンネルの履歴までは確認できないので過去の事例に辿り着かないこともよくありました。
チャンネルへの参加有無関係なく、過去のチャット履歴を検索することができたらハッピー!なのに、と何度思ったことか。。。

ナレッジをCS内で共有するために
Slackのチャンネルからチャット情報(お客様からの問い合わせ履歴)を取得して、
過去の問い合わせを資産として扱い、今後の問い合わせ対応の効率化に結びつけていくことが今回の施策の目的です。

3部作でお送りします〜!
第一弾 TROCCO®︎を使ってSlackからチャット情報を抽出しBigQueryに集約する
第二弾 (仮)TROCCO®のワークフローからDataformを動かす
第三弾 (仮)TROCCO®とBigqueryで作る簡単LLM

第一弾 TROCCO®︎を使ってslackからチャット情報を抽出しBigQueryに集約する

SlackAPIを利用してチャット情報を取得し、BigQueryに転送

を行なっていきます!

事前準備

Slack APIを利用するための準備をしておきます。

Botアプリを指定のワークスペースに作成、追加

ここからアクセスします。

"Create New App"をクリックします。
slack_api_①_1.png

情報を入れて"Create App"をクリックします。
slack_api_①_3.png

適切なスコープを付与

"OAuth & Permissions"を開きます。
slack_api_②_1.png

"Scopes"の"Add an OAuth Scope"にて、必要なScopeを付与します。

  • 今回利用するAPIに必要なスコープはchannels:historygroups:history
    • channels:history:パブリックチャンネルのチャット情報取得時に必要
    • groups:history:プライベートチャンネルのチャット情報取得時に必要
      slack_api_②_2.png

Botを取得対象のチャンネルに追加

該当チャンネルの左上にあるチャンネル名をクリックします。
slack_api_③_1.png

"インテグレーション"タブの"アプリを追加する"にて、作成したアプリを追加します。
slack_api_③_2.png

Bot User OAuth Access Tokenを取得

"OAuth & Permissions"を開きます。

"Scopes"の"Add an OAuth Scope"にて、必要なScopeを付与します。
※ SlackAPI上で適切なScopeの付与が先に行われている必要があります

"Install to Workspace"をクリックします。
slack_api_④_3.png

右下の"許可する"をクリックします。
slack_api_④_4.png

※ Scopeを上記手順の後新たに追加した場合、Bot User OAuth TokenをReinstallする必要があります。上記3、4の手順を再度行っていただくだけ問題ございませんが、Reinstall忘れにご注意ください。

転送設定を作成

ここからTROCCO®︎を利用してslack -> BigQueryにデータを転送していきます。

TROCCO®︎の転送元コネクタにslackはあるのですが、取得可能なデータがusers.listのみなので、今回取得予定のconversations.historyconversations.repliesは転送元slackでは利用できません。

TROCCO®︎で提供しているコネクタ以外も転送元として利用したい・・・。そんな時に試して欲しいのが転送元コネクタHTTP・HTTPSです!!


転送元HTTP・HTTPSはAPIの提供がある外部サービスだと利用が可能となります。
※ 利用実績や検証の相談のれますのでいつでもご連絡ください〜
Slack APIは転送元HTTP・HTTPSでデータ取得ができたので、HowToを説明していきます。

STEP1

まず転送元HTTP・HTTPS → 転送先BigQueryの転送設定を作成します。
etl_configurations1.png

カスタム変数を使って動的にパラメータの値を変更できるようにしたいので、まずカスタム変数を作成します。

今回動的に変化させたいのがチャンネルIDと取得する期間の始まりと終わりです。
SlackAPIでは取得する期間を絞ることができるのですが、Unix timestampでの指定が必須なのでデータ型は文字列で作成します。
etl_configurations2.png

URLにエンドポイントを入力します。今回はチャットの情報を取得するconversations.historyのAPIを利用するので、https://slack.com/api/conversations.historyを入力しました。

HTTPメソッドはPOSTなのでPOSTと入力します。

入力ファイル形式にはJSONPathを指定します。

JSONPath には$.messagesを入力します。

パラメータにはSlack APIの仕様書に載っているパラメータを設定することができます。
ここで先ほど作成したカスタム変数を埋め込むことで、実行時に動的に展開することができます。
パラメータの名前はAPIの仕様書に載っているキー名を入力してください。
etl_configurations3.png

HTTPヘッダに認証情報を定義します。
SlackAPIの場合は事前準備で取得したトークンをBearer 発行したトークンの形式で入力します。マスキングにチェックをつけると画面上では***で表示されるので安全です。
etl_configurations4.png

転送先BigQueryの設定に関しては割愛します。

STEP2

設定に問題がない場合、STEP2のデータ設定タブ内「カラム定義」がこんな感じで自動作成されます。
スクリーンショット 2024-11-22 15.57.30.png

必要なデータだけ取得するための絞り込みを行います。
今回はts(チャットのタイムスタンプ)のデータだけ取得、後続でconversations.repliesを使ってチャットに紐づくスレッド情報を取得しようと思います。
そのためにchannel_idも併せてtsと管理しておきたいので、取得したデータ内にはないですが、STEP1で作成したカスタム変数を埋め込みchannel_idも転送します。
スクリーンショット 2024-11-22 16.00.20.png

プレビューを実行すると必要なデータのみを抽出することができました。
スクリーンショット 2024-11-22 16.00.51.png

ワークフローを作成

先ほど作成した転送設定をワークフローに組み込んでみます。
スクリーンショット 2024-11-22 16.16.55.png

転送設定作成時にカスタム変数をリクエストのパラメータに埋め込んでいたのですが、ここで動的に展開することができます。該当の転送設定をクリックして編集します。
スクリーンショット 2024-11-22 16.18.02.png

カスタム変数でループ実行にチェックをつけると、ループの種類を選択することができます。
今回はBigQuery上に用意しておいたチャンネルIDのリストからチャンネルIDを取得してループ実行したかったので、「Google BigQueryのクエリ結果でループ」を選択しました。
対象のカスタム変数に展開したいカスタム変数を選択します。
スクリーンショット 2024-11-22 16.08.47.png

2ヶ月分のチャット情報を取得したいと考えたので以下のようなクエリを書きました。
対象カスタム変数で選択した順番に合わせて展開したいのでSELECT文の順番に注意が必要です。

    WITH tmp AS (
      SELECT
        channel_id,
        channel_name
      FROM
        dl_slack_rawdata.dwh_slack_id_add
    )
    
    SELECT
      channel_id,
      UNIX_SECONDS(TIMESTAMP(DATE("2024-08-01"), "Asia/Tokyo")) AS oldest,
      UNIX_SECONDS(TIMESTAMP_SUB(TIMESTAMP(DATE("2024-10-01"), "Asia/Tokyo"), INTERVAL 1 SECOND)) AS oldest,
      channel_name
    FROM
      tmp

最後に

今回紹介したのはチャットのタイムスタンプを取得するところまでですが、チャンネルIDとtsを使ってチャットに紐づいているスレッド情報を取得する転送設定を作成し、それらをワークフローで繋げることでスレッドの情報取得が可能になります。

これにて第一弾は終了です〜〜!
TROCCO®︎を使った良いところは、一回設定してしまえば定期実行でデータを貯めていけるので、とても楽にデータを抽出、管理することができるところですね。

15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?