XplentyでSlack Web APIを叩いてチャンネル一覧を取得する

2020.07.02

はじめに

データアナリティクス事業本部のkobayashiです。

XplentyはETL、ELTツールとして様々なデータソースを扱え、また処理もXplentyのGUIで直感的に作成できます。 今回はXplentyを使ってAPIを叩いてデータを取得しそのデータをDBに保存してみます。

Xplenty | Simplified ETL & ELT to BigQuery, Snowflake, Redshift & Azure

今回はレスポンスがそれほど複雑でないAPIを使ってみたいと思い色々考えた結果、SlackのAPIからチャンネルのリストを取得してそれをRedshiftへ保存してみたいと思います。クラスメソッドではビジネスチャットツールとしてSlackを利用して活発にやり取りをしていますが、チャンネル数が膨大なのでどんなものがあるかに興味が湧いたのも理由です。

事前準備

Xplentyでジョブを作成する前にSlackのAPIを利用できるようにするためSlackのAppを作成します。 作成方法は他で詳しく説明されているので今回は割愛しますが以下の様な流れになります。

  • OAuth & PermissionsScopeを割り当てる
  • トークンを作成する

なお、今回使用するAPIはチャンネル一覧を取得するconversations.listになります。したがってScopeを割り当てるときはリンク先のページを確認し必要とされるScopeを設定してください。

Xplentyのパッケージの作成

Xplentyのパッケージの中身は大まかに以下になります。

  1. Slack Web APIにリクエストを送りレスポンスを取得する
  2. 受け取ったデータを加工してRedshiftへ保存できる形に加工する
  3. Redshiftへチャンネルテーブルを作成しデータを登録する

これらのコンポーネントを組み合わせてパッケージを作成していきます。

はじめにサイドバーからPackagesを選択してNew Packageを押下し新しいパッケージを作成します。

1.Slack Web API用にREST APIコンポーネントを作成

まずはconversations.listのAPIを使いチャンネル一覧の情報を取得し、加工・保存を行います。

手順1-1).Add componetを押下し、SourcesでREST APIを選択する

手順1-2).作成されたアイコンをダブルクリックするとREST APIコンポーネント設定用のモーダルが表示されるので、AuthenticationNoneを選択する。

手順1-3).Request and responseの設定を行いNextを押下する。

  • Method : POSTを選択
  • URL : https://slack.com/api/conversations.list?token={Slack Web API用のトークン}&types=public_channelを入力
    • 本来はVariablesに変数として格納して?token=$Tokenとすれば汎用的に使い回せますが、次のStepでデータが取得できなかったため直書きします。
  • Headers
    • Key : Content-Typeを入力
    • VALUE : application/x-www-form-urlencodedを入力
  • Body : (空)
  • Use Pagination : チェックする

他の設定値はデフォルトのままにします。

Use Paginationはレスポンスの中にPaginationに該当するものがあれば自動的に次のリクエストを送り全データを取得するオプションです。このオプションを使用しないと全件取得できないので対応しているエンドポイントではチェックすることをお勧めします。対応するエンドポイントはXplentyの公式ドキュメントに記載されているのでご確認ください。

API Endpoints with pagination support – Xplenty Support & Help

手順1-4).Response Schemaへ進み、Available Fieldsでchannelsの右のプラスをクリックしSelected Fieldschannelsが選択された状態にする。その後Saveを押下し、設定を保存する。

この画面ではレスポンスの内容を確認できるので必要なデータを確認しながら設定を行えます。

これでREST APIコンポーネントの設定は終わりますので、次にデータ加工用のコンポーネントをを設定します。

2.データ加工用のコンポーネント作成

データ加工を行う際には基本的にSelectコンポーネントを使います。その際にソースがデータベースの場合はあまり使わないテクニックですが、REST APIコンポーネントでデータを取得した際にはSelectコンポーネントを2段繋げて使うのがデフォルトになります。

手順2-1).Add componetを押下し、TransformationsでSelectを選択する。この操作を2回行い2つSelectコンポーネントを作成する。

手順2-2).作成したSelectコンポーネントを前段のREST APIコンポーネントと接続する。(接続していないとカラムのマッピングができないため)

手順2-3).作成したSelectコンポーネントの1つ目を選択して設定を行いSaveを押下し保存する。

  • EXPRESSION : Flatten(channels)を入力
  • ALIAS : channelを入力

Xplentyには関数が用意されていてこれらを使うことで前のコンポーネントから渡ってきた値を加工することができます。 その中でもREST APIコンポーネントでデータを取得した際はまずはFlattenでデータをフラット化することが定番処理になります。

Xplenty Functions – Xplenty Support & Help

手順2-4).作成したSelectコンポーネントの2つ目を選択して設定を行いSaveを押下し保存する。

  • EXPRESSION、ALIASに以下のように入力
EXPRESSION ALIAS
JsonStringToMap(channel)#'id' id
JsonStringToMap(channel)#'name' name
JsonStringToMap(channel)#'name_normalized' name_normalized
JsonStringToMap(channel)#'creator' creator
ToDate(ParseLongOrDefault(JsonStringToMap(channel)#'created',0)*1000) created
JsonStringToMap(JsonStringToMap(channel)#'topic')#'value' topic_value
JsonStringToMap(JsonStringToMap(channel)#'topic')#'creator' topic_creator
ToDate(ParseLongOrDefault(JsonStringToMap(JsonStringToMap(channel)#'topic')#'last_set',0)*1000) topic_lastset
JsonStringToMap(JsonStringToMap(channel)#'purpose')#'value' purpose_value
JsonStringToMap(JsonStringToMap(channel)#'purpose')#'creator' purpose_creator
ToDate(ParseLongOrDefault(JsonStringToMap(JsonStringToMap(channel)#'purpose')#'last_set',0)*1000) purpose_lastset

このステップでデータをRedshiftへ格納したい形に加工しています。Flattenを使うとその中身はJson文字列で返ってくるのでJson文字列を扱う関数を使用します。

これでRedshiftへ保存する形へデータを変換できましたので、最後にRedshiftへ保存する設定をします。

3.保存先としてRedshiftコンポーネント作成

ここまで加工したデータを保存するためDestinationsでRedshiftコンポーネントを作成・設定します。簡単に行うためテーブルは予め作成せずXplentyのジョブで自動作成し、データは毎回洗い替えを行う設定にします。

手順3-1).Add componetを押下し、DestinationsでAmazon Redshiftを選択する

手順3-2).画面上にRedshiftのアイコンが作成されるので先に作成したSelectコンポーネントのアイコンとDrag&Dropで紐付ける。

手順3-3).RedshiftのアイコンをダブルクリックするとRedshiftコンポーネント設定用のモーダルが表示されるので、設定済みのRedshiftのconnectionを選択する。

手順3-4).移行先のRedshiftのスキーマとテーブルを入力し各種設定を行い、Nextを押下する。

  • Automatically create table if it doesn't exist : チェックする
  • Automatically add missing columns : チェックする
  • Operation type : Overwrite (Truncate and insert)を選択する

他の設定はデフォルトで問題ありません。

手順3-5).移行元と移行先のカラムマッピングを行う。移行先のテーブルは新規作成なのでAuto fillを押下して自動設定を行う。

手順3-6).右下のSaveを押下して設定を保存する。

Xplentyのパッケージの実行と確認

ここまで設定すると以下の様なパッケージになっていると思います。あとはこれを実行して結果を確認してみます。

手順4).Save & Run jobを押下しジョブを実行する。

Redshitでデータを確認

select id,name,created,topic_value from cm_kobayashi_test.sl_conversations;
id name topic_value purpose_value
C03SX1P0K 00-announcement :star: 全社共有部屋(全員参加) :star:
・全社アナウンス専用
This channel is used for announcement to the entire classmethod gro ...
CLZ49APGB times-kobayashi-m DA部小林の分報 つれづれ無いことを書いていく
CFBKTUMUM misc-angular angularに関することあれこれ NULL
CEARDN84Q rss-aws-blogs NULL NULL
CELU9SE68 misc-github :octocat:GitHub に関する情報共有, 雑談をしよう:octocat: NULL
CEN56R6B1 misc-container :docker:コンテナ周辺技術に関する情報共有, 雑談をしよう:docker: NULL
CEXMSGE5B misc-子育て NULL NULL

こんな感じでなんと2132件もデータが取れました。

まとめ

XplentyのREST APIコンポーネントを使ってSlack Web APIからデータを取得してみました。Slack Web APIのレスポンスはそれほどネストしているわけでもなく扱いやすいデータでしたので手間なく取り込めました。次回はもう少し複雑なレスポンスを記事にまとめたいと思います。

最後まで読んで頂いてありがとうございました。