📥

Slackの会話データを日次で取得する基本的な方法

2021/07/06に公開

この記事はなにか?

  • この記事は、Slackデータを定期的(日次など)に蓄積していく処理の解説記事です
  • すべてのソースコードは こちらのGitHubレポジトリ にあります

なぜこの記事を書いたのか?

理由は3つあります。

  1. (私の観測範囲内ですが)データ基盤構築のお仕事需要が結構発生していると思われる
  2. とはいえ、こうした地味な処理の記事ってガチ系 or 超入門ばっかりでちょうど良い難易度・ボリュームのものが少ない気がする
  3. ちょうどいいネタを自分が持っているので、公開したら(上記2つの理由から)誰かに役立つかもと考えた

処理のポイント

処理詳細やスクリプトの使い方はREADMEに記載していますので、そちらをご覧ください。ここでは、「定期実行する」ために重要と思われるポイントを簡単にまとめます。

ログファイル作るよ

■ なぜ重要なのか?

  • ずばり、なにか問題が起きたときに原因を特定するためです
  • 今回のような「所望のタイミングで一定量のデータを一気にロードする処理」はバッチ処理と呼ばれる類のものです
  • バッチ処理で問題が発生したときはすぐに気付けるようにアラート機能を付けておくことは当然必要として、問題の原因特定のためにログファイルが必要です

■ どうやったのか?

  • Pythonの標準モジュールである logging を使いました
  • logging の使い方は、 公式Doc をご覧ください
  • ログファイル名は、ingest_log_at というプレフィックスのあとに処理開始時刻を付けたものにしています
  • こうすることで、複数回実行した場合でもログファイルが上書きされません

出力フォルダ/ファイルの命名規則考えるよ

■ なぜ重要なのか?

  • ずばり、出力したデータを破壊しないため・処理の冪等性を担保するため・所望のデータを探しやすくするためです(と私は思います)
  • アンチパターンケース
    • 例えば、出力フォルダを output 出力ファイルを slack.json などと設定するケースです
    • この場合、対象とするデータを特定することができません。「いつの」という情報がないからです。
  • 上記アンチパターンに該当する場合、複数回実行することで、以前取り込んだデータを上書きして消してしまうリスクが高まります。
  • また、あとでデータを見たとき「○年○月○日のデータがほしい」という要望に応えられません。(再度取得すればいいかもですが、もう二度と同じデータが取れない場合もあります)

■ どうやったのか?

  • 取得対象とする日付ごとにフォルダを作成し、その配下にAPIリソースごとのJSONファイル、ログファイルを格納する(ちょうど以下のようなイメージです)

img

使いやすい実行パラメータを考えるよ

■ なぜ重要なのか?

  • ずばり、定期実行とは別にマニュアル実行(好きな日付を指定して実行)を自由にできるようにしたいからです。
  • なぜマニュアル実行が必要かというと、今後スクリプトを継続的にアップデートする上で何度も挙動確認が必要になるからです。
  • とりあえずちょっと動かしてみるか、ってときに正規の方法(例:実行時の属する日付のデータを取得)だけだと、本番データに影響が及んでしまいます
  • パラメータを丁寧に設計しておけば、手動であれCIであれ、気兼ねなく挙動確認できる下地ができます。

■ どうやったのか?

  • 引数なし(デフォルト)の場合は、スクリプト実行時の前日の1日分のデータを取得します。これは通常の定期実行用です
  • 引数あり(任意の取得対象日付を指定)の場合は、指定した日付の1日分のデータを取得します。これはマニュアル実行用です

おしまい

Discussion